diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index b50b497..d6a3fcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @Description: 设备service @@ -55,4 +58,10 @@ int updateBatchGateGroupStatus(List deviceCodes, String status); int updateDeviceInfoBatch(List acsDeviceList); + + List getDeviceStatusGroup(); + + Map>> getCameraMap(String keywords, List positionIds, List areaIds); + + DeviceInfo deviceInfoByDrawNo(String drawNo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index b50b497..d6a3fcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @Description: 设备service @@ -55,4 +58,10 @@ int updateBatchGateGroupStatus(List deviceCodes, String status); int updateDeviceInfoBatch(List acsDeviceList); + + List getDeviceStatusGroup(); + + Map>> getCameraMap(String keywords, List positionIds, List areaIds); + + DeviceInfo deviceInfoByDrawNo(String drawNo); } 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 5fd9e32..0b31726 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 @@ -23,7 +23,7 @@ Object deleteStaffInfo(StaffInfo staffInfo); - Object deleteBatchStaffInfo(List ids); + Object deleteBatchStaffInfo(List ids, List faceIds); List addStaffInfoBatch(List results); @@ -34,4 +34,6 @@ int saveCardInfo(StaffCardRequest staffCardRequest); int updateStaffInfoBatch(List personList); + + Object getStaffPicture(String staffCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index b50b497..d6a3fcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @Description: 设备service @@ -55,4 +58,10 @@ int updateBatchGateGroupStatus(List deviceCodes, String status); int updateDeviceInfoBatch(List acsDeviceList); + + List getDeviceStatusGroup(); + + Map>> getCameraMap(String keywords, List positionIds, List areaIds); + + DeviceInfo deviceInfoByDrawNo(String drawNo); } 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 5fd9e32..0b31726 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 @@ -23,7 +23,7 @@ Object deleteStaffInfo(StaffInfo staffInfo); - Object deleteBatchStaffInfo(List ids); + Object deleteBatchStaffInfo(List ids, List faceIds); List addStaffInfoBatch(List results); @@ -34,4 +34,6 @@ int saveCardInfo(StaffCardRequest staffCardRequest); int updateStaffInfoBatch(List personList); + + Object getStaffPicture(String staffCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java index 2ba97b0..89bd933 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java @@ -16,4 +16,6 @@ List visitInfoListPage(Page page, VisitorRequest visitorRequest); VisitInfo visitInfoDetail(String id); + + String getVisitorPicture(VisitInfo visitInfo); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index b50b497..d6a3fcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @Description: 设备service @@ -55,4 +58,10 @@ int updateBatchGateGroupStatus(List deviceCodes, String status); int updateDeviceInfoBatch(List acsDeviceList); + + List getDeviceStatusGroup(); + + Map>> getCameraMap(String keywords, List positionIds, List areaIds); + + DeviceInfo deviceInfoByDrawNo(String drawNo); } 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 5fd9e32..0b31726 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 @@ -23,7 +23,7 @@ Object deleteStaffInfo(StaffInfo staffInfo); - Object deleteBatchStaffInfo(List ids); + Object deleteBatchStaffInfo(List ids, List faceIds); List addStaffInfoBatch(List results); @@ -34,4 +34,6 @@ int saveCardInfo(StaffCardRequest staffCardRequest); int updateStaffInfoBatch(List personList); + + Object getStaffPicture(String staffCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java index 2ba97b0..89bd933 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java @@ -16,4 +16,6 @@ List visitInfoListPage(Page page, VisitorRequest visitorRequest); VisitInfo visitInfoDetail(String id); + + String getVisitorPicture(VisitInfo visitInfo); } 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 981b4cd..ea6b8c0 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 @@ -8,10 +8,8 @@ import com.casic.missiles.modular.dao.BlackInfoMapper; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; import com.casic.missiles.modular.dto.BlackInfoRequest; -import com.casic.missiles.modular.dto.hik.FaceDeletionBatchRequest; -import com.casic.missiles.modular.dto.hik.FaceInfo; -import com.casic.missiles.modular.dto.hik.FacePic; -import com.casic.missiles.modular.dto.hik.FaceSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.BlackInfo; @@ -86,6 +84,10 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); + //数据库照片存海康的人脸url + JSONObject facePicture = (JSONObject)dataJson.get("facePic"); + String faceUrl = facePicture.getString("faceUrl"); + blackInfo.setPicture(faceUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -157,4 +159,19 @@ } return ResponseData.error("批量删除黑名单异常"); } + + + @Override + public Object getBlackPicture(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/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index b50b497..d6a3fcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @Description: 设备service @@ -55,4 +58,10 @@ int updateBatchGateGroupStatus(List deviceCodes, String status); int updateDeviceInfoBatch(List acsDeviceList); + + List getDeviceStatusGroup(); + + Map>> getCameraMap(String keywords, List positionIds, List areaIds); + + DeviceInfo deviceInfoByDrawNo(String drawNo); } 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 5fd9e32..0b31726 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 @@ -23,7 +23,7 @@ Object deleteStaffInfo(StaffInfo staffInfo); - Object deleteBatchStaffInfo(List ids); + Object deleteBatchStaffInfo(List ids, List faceIds); List addStaffInfoBatch(List results); @@ -34,4 +34,6 @@ int saveCardInfo(StaffCardRequest staffCardRequest); int updateStaffInfoBatch(List personList); + + Object getStaffPicture(String staffCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java index 2ba97b0..89bd933 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java @@ -16,4 +16,6 @@ List visitInfoListPage(Page page, VisitorRequest visitorRequest); VisitInfo visitInfoDetail(String id); + + String getVisitorPicture(VisitInfo visitInfo); } 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 981b4cd..ea6b8c0 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 @@ -8,10 +8,8 @@ import com.casic.missiles.modular.dao.BlackInfoMapper; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; import com.casic.missiles.modular.dto.BlackInfoRequest; -import com.casic.missiles.modular.dto.hik.FaceDeletionBatchRequest; -import com.casic.missiles.modular.dto.hik.FaceInfo; -import com.casic.missiles.modular.dto.hik.FacePic; -import com.casic.missiles.modular.dto.hik.FaceSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.BlackInfo; @@ -86,6 +84,10 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); + //数据库照片存海康的人脸url + JSONObject facePicture = (JSONObject)dataJson.get("facePic"); + String faceUrl = facePicture.getString("faceUrl"); + blackInfo.setPicture(faceUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -157,4 +159,19 @@ } return ResponseData.error("批量删除黑名单异常"); } + + + @Override + public Object getBlackPicture(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/service/impl/CaseInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java index 7a25099..6b03d8b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java @@ -132,4 +132,21 @@ public boolean insertCaseInfoBatch(List caseInfos) { return this.saveBatch(caseInfos); } + + @Override + public List caseInfoList(CaseInfoRequest caseInfoRequest) { + try { + List pageList = caseInfoMapper.getCaseInfoList(caseInfoRequest); + pageList.forEach(caseInfo ->{ + caseInfo.setStatusName(dictService.getDictNameByCode(SecurityEventDict.CASE_STATUS, caseInfo.getStatus())); + caseInfo.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, caseInfo.getPosition())); + caseInfo.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, caseInfo.getArea())); + caseInfo.setIsKeyAreaName(dictService.getDictNameByCode(SecurityEventDict.IS_KEY_AREA, caseInfo.getIsKeyArea())); + }); + return pageList; + } catch (DataAccessException ex) { + log.error("安防事件: 查询不分页出现异常, 异常:{}", ex); + } + return null; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index b50b497..d6a3fcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @Description: 设备service @@ -55,4 +58,10 @@ int updateBatchGateGroupStatus(List deviceCodes, String status); int updateDeviceInfoBatch(List acsDeviceList); + + List getDeviceStatusGroup(); + + Map>> getCameraMap(String keywords, List positionIds, List areaIds); + + DeviceInfo deviceInfoByDrawNo(String drawNo); } 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 5fd9e32..0b31726 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 @@ -23,7 +23,7 @@ Object deleteStaffInfo(StaffInfo staffInfo); - Object deleteBatchStaffInfo(List ids); + Object deleteBatchStaffInfo(List ids, List faceIds); List addStaffInfoBatch(List results); @@ -34,4 +34,6 @@ int saveCardInfo(StaffCardRequest staffCardRequest); int updateStaffInfoBatch(List personList); + + Object getStaffPicture(String staffCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java index 2ba97b0..89bd933 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java @@ -16,4 +16,6 @@ List visitInfoListPage(Page page, VisitorRequest visitorRequest); VisitInfo visitInfoDetail(String id); + + String getVisitorPicture(VisitInfo visitInfo); } 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 981b4cd..ea6b8c0 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 @@ -8,10 +8,8 @@ import com.casic.missiles.modular.dao.BlackInfoMapper; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; import com.casic.missiles.modular.dto.BlackInfoRequest; -import com.casic.missiles.modular.dto.hik.FaceDeletionBatchRequest; -import com.casic.missiles.modular.dto.hik.FaceInfo; -import com.casic.missiles.modular.dto.hik.FacePic; -import com.casic.missiles.modular.dto.hik.FaceSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.BlackInfo; @@ -86,6 +84,10 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); + //数据库照片存海康的人脸url + JSONObject facePicture = (JSONObject)dataJson.get("facePic"); + String faceUrl = facePicture.getString("faceUrl"); + blackInfo.setPicture(faceUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -157,4 +159,19 @@ } return ResponseData.error("批量删除黑名单异常"); } + + + @Override + public Object getBlackPicture(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/service/impl/CaseInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java index 7a25099..6b03d8b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java @@ -132,4 +132,21 @@ public boolean insertCaseInfoBatch(List caseInfos) { return this.saveBatch(caseInfos); } + + @Override + public List caseInfoList(CaseInfoRequest caseInfoRequest) { + try { + List pageList = caseInfoMapper.getCaseInfoList(caseInfoRequest); + pageList.forEach(caseInfo ->{ + caseInfo.setStatusName(dictService.getDictNameByCode(SecurityEventDict.CASE_STATUS, caseInfo.getStatus())); + caseInfo.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, caseInfo.getPosition())); + caseInfo.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, caseInfo.getArea())); + caseInfo.setIsKeyAreaName(dictService.getDictNameByCode(SecurityEventDict.IS_KEY_AREA, caseInfo.getIsKeyArea())); + }); + return pageList; + } catch (DataAccessException ex) { + log.error("安防事件: 查询不分页出现异常, 异常:{}", ex); + } + return null; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java index 2608ba8..94308db 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java @@ -13,6 +13,7 @@ import com.casic.missiles.modular.dao.GroupDeviceMapper; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -21,11 +22,13 @@ import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.GroupDeviceService; 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.dao.DataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -133,11 +136,15 @@ @Override @Transactional(rollbackFor = Exception.class) public List addDeviceInfoBatch(List results) { + List collect = results.stream().filter(result -> + StringUtils.isNotEmpty(result.getIndexCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "设备导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(results)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; - results.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -157,7 +164,6 @@ // return; // } // } - if (StrUtil.isNotEmpty(busConcentrator.getInstallTime())) { try { new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(busConcentrator.getInstallTime()); @@ -173,7 +179,7 @@ if (CollectionUtil.isNotEmpty(list)) { return list; } - this.saveBatch(results); + this.saveBatch(collect); } return list; } @@ -346,5 +352,82 @@ return deviceInfoMapper.updateDeviceInfoBatch(acsDeviceList); } + @Override + public List getDeviceStatusGroup() { + List deviceStatusDTOS = deviceInfoMapper.selectDeviceStatusGroupByStatus(); + if(CollectionUtils.isEmpty(deviceStatusDTOS)){ + return new ArrayList<>(); + } + for (DeviceStatusDTO deviceStatusDTO : deviceStatusDTOS) { + String dictNameByCode = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, deviceStatusDTO.getStatus()); + deviceStatusDTO.setStatusName(dictNameByCode); + } + return deviceStatusDTOS; + } + + @Override + public Map>> getCameraMap(String keywords, List positionIds, List areaIds) { + Map>> map = new HashMap<>(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like("dev_name", keywords); + wrapper.like("dev_code", keywords); + if(!CollectionUtils.isEmpty(positionIds)){ + wrapper.in("position", positionIds); + } + if(!CollectionUtils.isEmpty(areaIds)){ + wrapper.in("area", areaIds); + } + wrapper.in("dev_type", Arrays.asList("2","3","4","5","6","7")); + List deviceInfos = deviceInfoMapper.selectList(wrapper); + + deviceInfos.forEach(cameraDTO -> { + cameraDTO.setPositionName(dictService.getDictNameByCode("devicePosition", cameraDTO.getPosition())); + cameraDTO.setAreaName(dictService.getDictNameByCode("deviceArea", cameraDTO.getArea())); + + if (map.containsKey(cameraDTO.getPositionName())) { + if (map.get(cameraDTO.getPositionName()).containsKey(cameraDTO.getAreaName())) { + map.get(cameraDTO.getPositionName()).get(cameraDTO.getAreaName()).add(cameraDTO); + } else { + map.get(cameraDTO.getPositionName()).put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + } + } else { + TreeMap> areaMap = new TreeMap<>(new Comparator() { + @Override + public int compare(String o1, String o2) { + if(o1.endsWith("F") && o2.endsWith("F")){ + String o1Str = o1.substring(0, o1.length()-1); + String o2Str = o2.substring(0, o2.length()-1); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + if(o1.startsWith("N") && o2.startsWith("N")){ + String o1Str = o1.substring(1, o1.length()); + String o2Str = o2.substring(1, o2.length()); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + return 0; + } + }); + areaMap.put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + map.put(cameraDTO.getPositionName(), areaMap); + } + }); + return map; + } + + @Override + public DeviceInfo deviceInfoByDrawNo(String drawNo) { + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("draw_no", drawNo); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index b50b497..d6a3fcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @Description: 设备service @@ -55,4 +58,10 @@ int updateBatchGateGroupStatus(List deviceCodes, String status); int updateDeviceInfoBatch(List acsDeviceList); + + List getDeviceStatusGroup(); + + Map>> getCameraMap(String keywords, List positionIds, List areaIds); + + DeviceInfo deviceInfoByDrawNo(String drawNo); } 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 5fd9e32..0b31726 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 @@ -23,7 +23,7 @@ Object deleteStaffInfo(StaffInfo staffInfo); - Object deleteBatchStaffInfo(List ids); + Object deleteBatchStaffInfo(List ids, List faceIds); List addStaffInfoBatch(List results); @@ -34,4 +34,6 @@ int saveCardInfo(StaffCardRequest staffCardRequest); int updateStaffInfoBatch(List personList); + + Object getStaffPicture(String staffCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java index 2ba97b0..89bd933 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java @@ -16,4 +16,6 @@ List visitInfoListPage(Page page, VisitorRequest visitorRequest); VisitInfo visitInfoDetail(String id); + + String getVisitorPicture(VisitInfo visitInfo); } 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 981b4cd..ea6b8c0 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 @@ -8,10 +8,8 @@ import com.casic.missiles.modular.dao.BlackInfoMapper; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; import com.casic.missiles.modular.dto.BlackInfoRequest; -import com.casic.missiles.modular.dto.hik.FaceDeletionBatchRequest; -import com.casic.missiles.modular.dto.hik.FaceInfo; -import com.casic.missiles.modular.dto.hik.FacePic; -import com.casic.missiles.modular.dto.hik.FaceSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.BlackInfo; @@ -86,6 +84,10 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); + //数据库照片存海康的人脸url + JSONObject facePicture = (JSONObject)dataJson.get("facePic"); + String faceUrl = facePicture.getString("faceUrl"); + blackInfo.setPicture(faceUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -157,4 +159,19 @@ } return ResponseData.error("批量删除黑名单异常"); } + + + @Override + public Object getBlackPicture(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/service/impl/CaseInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java index 7a25099..6b03d8b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java @@ -132,4 +132,21 @@ public boolean insertCaseInfoBatch(List caseInfos) { return this.saveBatch(caseInfos); } + + @Override + public List caseInfoList(CaseInfoRequest caseInfoRequest) { + try { + List pageList = caseInfoMapper.getCaseInfoList(caseInfoRequest); + pageList.forEach(caseInfo ->{ + caseInfo.setStatusName(dictService.getDictNameByCode(SecurityEventDict.CASE_STATUS, caseInfo.getStatus())); + caseInfo.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, caseInfo.getPosition())); + caseInfo.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, caseInfo.getArea())); + caseInfo.setIsKeyAreaName(dictService.getDictNameByCode(SecurityEventDict.IS_KEY_AREA, caseInfo.getIsKeyArea())); + }); + return pageList; + } catch (DataAccessException ex) { + log.error("安防事件: 查询不分页出现异常, 异常:{}", ex); + } + return null; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java index 2608ba8..94308db 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java @@ -13,6 +13,7 @@ import com.casic.missiles.modular.dao.GroupDeviceMapper; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -21,11 +22,13 @@ import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.GroupDeviceService; 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.dao.DataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -133,11 +136,15 @@ @Override @Transactional(rollbackFor = Exception.class) public List addDeviceInfoBatch(List results) { + List collect = results.stream().filter(result -> + StringUtils.isNotEmpty(result.getIndexCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "设备导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(results)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; - results.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -157,7 +164,6 @@ // return; // } // } - if (StrUtil.isNotEmpty(busConcentrator.getInstallTime())) { try { new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(busConcentrator.getInstallTime()); @@ -173,7 +179,7 @@ if (CollectionUtil.isNotEmpty(list)) { return list; } - this.saveBatch(results); + this.saveBatch(collect); } return list; } @@ -346,5 +352,82 @@ return deviceInfoMapper.updateDeviceInfoBatch(acsDeviceList); } + @Override + public List getDeviceStatusGroup() { + List deviceStatusDTOS = deviceInfoMapper.selectDeviceStatusGroupByStatus(); + if(CollectionUtils.isEmpty(deviceStatusDTOS)){ + return new ArrayList<>(); + } + for (DeviceStatusDTO deviceStatusDTO : deviceStatusDTOS) { + String dictNameByCode = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, deviceStatusDTO.getStatus()); + deviceStatusDTO.setStatusName(dictNameByCode); + } + return deviceStatusDTOS; + } + + @Override + public Map>> getCameraMap(String keywords, List positionIds, List areaIds) { + Map>> map = new HashMap<>(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like("dev_name", keywords); + wrapper.like("dev_code", keywords); + if(!CollectionUtils.isEmpty(positionIds)){ + wrapper.in("position", positionIds); + } + if(!CollectionUtils.isEmpty(areaIds)){ + wrapper.in("area", areaIds); + } + wrapper.in("dev_type", Arrays.asList("2","3","4","5","6","7")); + List deviceInfos = deviceInfoMapper.selectList(wrapper); + + deviceInfos.forEach(cameraDTO -> { + cameraDTO.setPositionName(dictService.getDictNameByCode("devicePosition", cameraDTO.getPosition())); + cameraDTO.setAreaName(dictService.getDictNameByCode("deviceArea", cameraDTO.getArea())); + + if (map.containsKey(cameraDTO.getPositionName())) { + if (map.get(cameraDTO.getPositionName()).containsKey(cameraDTO.getAreaName())) { + map.get(cameraDTO.getPositionName()).get(cameraDTO.getAreaName()).add(cameraDTO); + } else { + map.get(cameraDTO.getPositionName()).put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + } + } else { + TreeMap> areaMap = new TreeMap<>(new Comparator() { + @Override + public int compare(String o1, String o2) { + if(o1.endsWith("F") && o2.endsWith("F")){ + String o1Str = o1.substring(0, o1.length()-1); + String o2Str = o2.substring(0, o2.length()-1); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + if(o1.startsWith("N") && o2.startsWith("N")){ + String o1Str = o1.substring(1, o1.length()); + String o2Str = o2.substring(1, o2.length()); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + return 0; + } + }); + areaMap.put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + map.put(cameraDTO.getPositionName(), areaMap); + } + }); + return map; + } + + @Override + public DeviceInfo deviceInfoByDrawNo(String drawNo) { + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("draw_no", drawNo); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java index a95fff2..e3dff1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -107,6 +108,9 @@ ); return; } + if(StringUtils.isEmpty(busConcentrator.getEquipCode())){ + return; + } if (StrUtil.isNotEmpty(busConcentrator.getProductDate())) { try { new SimpleDateFormat("yyyy-MM-dd").parse(busConcentrator.getProductDate()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index b50b497..d6a3fcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @Description: 设备service @@ -55,4 +58,10 @@ int updateBatchGateGroupStatus(List deviceCodes, String status); int updateDeviceInfoBatch(List acsDeviceList); + + List getDeviceStatusGroup(); + + Map>> getCameraMap(String keywords, List positionIds, List areaIds); + + DeviceInfo deviceInfoByDrawNo(String drawNo); } 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 5fd9e32..0b31726 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 @@ -23,7 +23,7 @@ Object deleteStaffInfo(StaffInfo staffInfo); - Object deleteBatchStaffInfo(List ids); + Object deleteBatchStaffInfo(List ids, List faceIds); List addStaffInfoBatch(List results); @@ -34,4 +34,6 @@ int saveCardInfo(StaffCardRequest staffCardRequest); int updateStaffInfoBatch(List personList); + + Object getStaffPicture(String staffCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java index 2ba97b0..89bd933 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java @@ -16,4 +16,6 @@ List visitInfoListPage(Page page, VisitorRequest visitorRequest); VisitInfo visitInfoDetail(String id); + + String getVisitorPicture(VisitInfo visitInfo); } 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 981b4cd..ea6b8c0 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 @@ -8,10 +8,8 @@ import com.casic.missiles.modular.dao.BlackInfoMapper; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; import com.casic.missiles.modular.dto.BlackInfoRequest; -import com.casic.missiles.modular.dto.hik.FaceDeletionBatchRequest; -import com.casic.missiles.modular.dto.hik.FaceInfo; -import com.casic.missiles.modular.dto.hik.FacePic; -import com.casic.missiles.modular.dto.hik.FaceSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.BlackInfo; @@ -86,6 +84,10 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); + //数据库照片存海康的人脸url + JSONObject facePicture = (JSONObject)dataJson.get("facePic"); + String faceUrl = facePicture.getString("faceUrl"); + blackInfo.setPicture(faceUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -157,4 +159,19 @@ } return ResponseData.error("批量删除黑名单异常"); } + + + @Override + public Object getBlackPicture(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/service/impl/CaseInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java index 7a25099..6b03d8b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java @@ -132,4 +132,21 @@ public boolean insertCaseInfoBatch(List caseInfos) { return this.saveBatch(caseInfos); } + + @Override + public List caseInfoList(CaseInfoRequest caseInfoRequest) { + try { + List pageList = caseInfoMapper.getCaseInfoList(caseInfoRequest); + pageList.forEach(caseInfo ->{ + caseInfo.setStatusName(dictService.getDictNameByCode(SecurityEventDict.CASE_STATUS, caseInfo.getStatus())); + caseInfo.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, caseInfo.getPosition())); + caseInfo.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, caseInfo.getArea())); + caseInfo.setIsKeyAreaName(dictService.getDictNameByCode(SecurityEventDict.IS_KEY_AREA, caseInfo.getIsKeyArea())); + }); + return pageList; + } catch (DataAccessException ex) { + log.error("安防事件: 查询不分页出现异常, 异常:{}", ex); + } + return null; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java index 2608ba8..94308db 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java @@ -13,6 +13,7 @@ import com.casic.missiles.modular.dao.GroupDeviceMapper; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -21,11 +22,13 @@ import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.GroupDeviceService; 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.dao.DataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -133,11 +136,15 @@ @Override @Transactional(rollbackFor = Exception.class) public List addDeviceInfoBatch(List results) { + List collect = results.stream().filter(result -> + StringUtils.isNotEmpty(result.getIndexCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "设备导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(results)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; - results.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -157,7 +164,6 @@ // return; // } // } - if (StrUtil.isNotEmpty(busConcentrator.getInstallTime())) { try { new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(busConcentrator.getInstallTime()); @@ -173,7 +179,7 @@ if (CollectionUtil.isNotEmpty(list)) { return list; } - this.saveBatch(results); + this.saveBatch(collect); } return list; } @@ -346,5 +352,82 @@ return deviceInfoMapper.updateDeviceInfoBatch(acsDeviceList); } + @Override + public List getDeviceStatusGroup() { + List deviceStatusDTOS = deviceInfoMapper.selectDeviceStatusGroupByStatus(); + if(CollectionUtils.isEmpty(deviceStatusDTOS)){ + return new ArrayList<>(); + } + for (DeviceStatusDTO deviceStatusDTO : deviceStatusDTOS) { + String dictNameByCode = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, deviceStatusDTO.getStatus()); + deviceStatusDTO.setStatusName(dictNameByCode); + } + return deviceStatusDTOS; + } + + @Override + public Map>> getCameraMap(String keywords, List positionIds, List areaIds) { + Map>> map = new HashMap<>(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like("dev_name", keywords); + wrapper.like("dev_code", keywords); + if(!CollectionUtils.isEmpty(positionIds)){ + wrapper.in("position", positionIds); + } + if(!CollectionUtils.isEmpty(areaIds)){ + wrapper.in("area", areaIds); + } + wrapper.in("dev_type", Arrays.asList("2","3","4","5","6","7")); + List deviceInfos = deviceInfoMapper.selectList(wrapper); + + deviceInfos.forEach(cameraDTO -> { + cameraDTO.setPositionName(dictService.getDictNameByCode("devicePosition", cameraDTO.getPosition())); + cameraDTO.setAreaName(dictService.getDictNameByCode("deviceArea", cameraDTO.getArea())); + + if (map.containsKey(cameraDTO.getPositionName())) { + if (map.get(cameraDTO.getPositionName()).containsKey(cameraDTO.getAreaName())) { + map.get(cameraDTO.getPositionName()).get(cameraDTO.getAreaName()).add(cameraDTO); + } else { + map.get(cameraDTO.getPositionName()).put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + } + } else { + TreeMap> areaMap = new TreeMap<>(new Comparator() { + @Override + public int compare(String o1, String o2) { + if(o1.endsWith("F") && o2.endsWith("F")){ + String o1Str = o1.substring(0, o1.length()-1); + String o2Str = o2.substring(0, o2.length()-1); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + if(o1.startsWith("N") && o2.startsWith("N")){ + String o1Str = o1.substring(1, o1.length()); + String o2Str = o2.substring(1, o2.length()); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + return 0; + } + }); + areaMap.put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + map.put(cameraDTO.getPositionName(), areaMap); + } + }); + return map; + } + + @Override + public DeviceInfo deviceInfoByDrawNo(String drawNo) { + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("draw_no", drawNo); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java index a95fff2..e3dff1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -107,6 +108,9 @@ ); return; } + if(StringUtils.isEmpty(busConcentrator.getEquipCode())){ + return; + } if (StrUtil.isNotEmpty(busConcentrator.getProductDate())) { try { new SimpleDateFormat("yyyy-MM-dd").parse(busConcentrator.getProductDate()); 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 ff60402..8ed53d9 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 @@ -5,10 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.core.application.service.AbstractDictService; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.DeviceInfoMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; -import com.casic.missiles.modular.dao.VisitInfoMapper; +import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.*; import com.casic.missiles.modular.service.HikService; @@ -16,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.HashMap; @@ -47,6 +45,9 @@ @Autowired private DeviceInfoMapper deviceInfoMapper; + @Autowired + private CaseInfoMapper caseInfoMapper; + @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -59,7 +60,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息"); + log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -69,6 +70,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -84,7 +86,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到离岗事件,但数据库中无该事件发生的设备信息"); + log.info("接收到离岗事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -94,6 +96,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -109,7 +112,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息"); + log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -119,6 +122,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -135,7 +139,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -145,6 +149,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -157,22 +162,29 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void monitorPointOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return; } // TODO: 2022/7/28 设备在线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(0).getCode()); - if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + int upDevFlag = deviceInfoMapper.updateById(deviceInfo); + + //更新该设备离线事件的解决状态(status=3) + caseInfoMapper.updateStatusByIndexCode(srcIndex); + + if(upDevFlag <= 0){ log.error("海康回调,更新监控点在线状态失败!"); } } @Override + @Transactional(rollbackFor = Exception.class) public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -185,7 +197,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -195,6 +207,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -208,6 +221,7 @@ @Override + @Transactional(rollbackFor = Exception.class) public void deviceOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); @@ -232,7 +246,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息"); + log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -242,10 +256,12 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @Override + @Transactional(rollbackFor = Exception.class) public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -291,6 +307,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void securityPersonnelHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -336,6 +353,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorRegisterHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -367,6 +385,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorCheckOutHandle(JSONObject event) { JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("endTime")); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index b50b497..d6a3fcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @Description: 设备service @@ -55,4 +58,10 @@ int updateBatchGateGroupStatus(List deviceCodes, String status); int updateDeviceInfoBatch(List acsDeviceList); + + List getDeviceStatusGroup(); + + Map>> getCameraMap(String keywords, List positionIds, List areaIds); + + DeviceInfo deviceInfoByDrawNo(String drawNo); } 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 5fd9e32..0b31726 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 @@ -23,7 +23,7 @@ Object deleteStaffInfo(StaffInfo staffInfo); - Object deleteBatchStaffInfo(List ids); + Object deleteBatchStaffInfo(List ids, List faceIds); List addStaffInfoBatch(List results); @@ -34,4 +34,6 @@ int saveCardInfo(StaffCardRequest staffCardRequest); int updateStaffInfoBatch(List personList); + + Object getStaffPicture(String staffCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java index 2ba97b0..89bd933 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java @@ -16,4 +16,6 @@ List visitInfoListPage(Page page, VisitorRequest visitorRequest); VisitInfo visitInfoDetail(String id); + + String getVisitorPicture(VisitInfo visitInfo); } 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 981b4cd..ea6b8c0 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 @@ -8,10 +8,8 @@ import com.casic.missiles.modular.dao.BlackInfoMapper; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; import com.casic.missiles.modular.dto.BlackInfoRequest; -import com.casic.missiles.modular.dto.hik.FaceDeletionBatchRequest; -import com.casic.missiles.modular.dto.hik.FaceInfo; -import com.casic.missiles.modular.dto.hik.FacePic; -import com.casic.missiles.modular.dto.hik.FaceSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.BlackInfo; @@ -86,6 +84,10 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); + //数据库照片存海康的人脸url + JSONObject facePicture = (JSONObject)dataJson.get("facePic"); + String faceUrl = facePicture.getString("faceUrl"); + blackInfo.setPicture(faceUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -157,4 +159,19 @@ } return ResponseData.error("批量删除黑名单异常"); } + + + @Override + public Object getBlackPicture(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/service/impl/CaseInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java index 7a25099..6b03d8b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java @@ -132,4 +132,21 @@ public boolean insertCaseInfoBatch(List caseInfos) { return this.saveBatch(caseInfos); } + + @Override + public List caseInfoList(CaseInfoRequest caseInfoRequest) { + try { + List pageList = caseInfoMapper.getCaseInfoList(caseInfoRequest); + pageList.forEach(caseInfo ->{ + caseInfo.setStatusName(dictService.getDictNameByCode(SecurityEventDict.CASE_STATUS, caseInfo.getStatus())); + caseInfo.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, caseInfo.getPosition())); + caseInfo.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, caseInfo.getArea())); + caseInfo.setIsKeyAreaName(dictService.getDictNameByCode(SecurityEventDict.IS_KEY_AREA, caseInfo.getIsKeyArea())); + }); + return pageList; + } catch (DataAccessException ex) { + log.error("安防事件: 查询不分页出现异常, 异常:{}", ex); + } + return null; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java index 2608ba8..94308db 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java @@ -13,6 +13,7 @@ import com.casic.missiles.modular.dao.GroupDeviceMapper; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -21,11 +22,13 @@ import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.GroupDeviceService; 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.dao.DataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -133,11 +136,15 @@ @Override @Transactional(rollbackFor = Exception.class) public List addDeviceInfoBatch(List results) { + List collect = results.stream().filter(result -> + StringUtils.isNotEmpty(result.getIndexCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "设备导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(results)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; - results.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -157,7 +164,6 @@ // return; // } // } - if (StrUtil.isNotEmpty(busConcentrator.getInstallTime())) { try { new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(busConcentrator.getInstallTime()); @@ -173,7 +179,7 @@ if (CollectionUtil.isNotEmpty(list)) { return list; } - this.saveBatch(results); + this.saveBatch(collect); } return list; } @@ -346,5 +352,82 @@ return deviceInfoMapper.updateDeviceInfoBatch(acsDeviceList); } + @Override + public List getDeviceStatusGroup() { + List deviceStatusDTOS = deviceInfoMapper.selectDeviceStatusGroupByStatus(); + if(CollectionUtils.isEmpty(deviceStatusDTOS)){ + return new ArrayList<>(); + } + for (DeviceStatusDTO deviceStatusDTO : deviceStatusDTOS) { + String dictNameByCode = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, deviceStatusDTO.getStatus()); + deviceStatusDTO.setStatusName(dictNameByCode); + } + return deviceStatusDTOS; + } + + @Override + public Map>> getCameraMap(String keywords, List positionIds, List areaIds) { + Map>> map = new HashMap<>(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like("dev_name", keywords); + wrapper.like("dev_code", keywords); + if(!CollectionUtils.isEmpty(positionIds)){ + wrapper.in("position", positionIds); + } + if(!CollectionUtils.isEmpty(areaIds)){ + wrapper.in("area", areaIds); + } + wrapper.in("dev_type", Arrays.asList("2","3","4","5","6","7")); + List deviceInfos = deviceInfoMapper.selectList(wrapper); + + deviceInfos.forEach(cameraDTO -> { + cameraDTO.setPositionName(dictService.getDictNameByCode("devicePosition", cameraDTO.getPosition())); + cameraDTO.setAreaName(dictService.getDictNameByCode("deviceArea", cameraDTO.getArea())); + + if (map.containsKey(cameraDTO.getPositionName())) { + if (map.get(cameraDTO.getPositionName()).containsKey(cameraDTO.getAreaName())) { + map.get(cameraDTO.getPositionName()).get(cameraDTO.getAreaName()).add(cameraDTO); + } else { + map.get(cameraDTO.getPositionName()).put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + } + } else { + TreeMap> areaMap = new TreeMap<>(new Comparator() { + @Override + public int compare(String o1, String o2) { + if(o1.endsWith("F") && o2.endsWith("F")){ + String o1Str = o1.substring(0, o1.length()-1); + String o2Str = o2.substring(0, o2.length()-1); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + if(o1.startsWith("N") && o2.startsWith("N")){ + String o1Str = o1.substring(1, o1.length()); + String o2Str = o2.substring(1, o2.length()); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + return 0; + } + }); + areaMap.put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + map.put(cameraDTO.getPositionName(), areaMap); + } + }); + return map; + } + + @Override + public DeviceInfo deviceInfoByDrawNo(String drawNo) { + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("draw_no", drawNo); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java index a95fff2..e3dff1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -107,6 +108,9 @@ ); return; } + if(StringUtils.isEmpty(busConcentrator.getEquipCode())){ + return; + } if (StrUtil.isNotEmpty(busConcentrator.getProductDate())) { try { new SimpleDateFormat("yyyy-MM-dd").parse(busConcentrator.getProductDate()); 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 ff60402..8ed53d9 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 @@ -5,10 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.core.application.service.AbstractDictService; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.DeviceInfoMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; -import com.casic.missiles.modular.dao.VisitInfoMapper; +import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.*; import com.casic.missiles.modular.service.HikService; @@ -16,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.HashMap; @@ -47,6 +45,9 @@ @Autowired private DeviceInfoMapper deviceInfoMapper; + @Autowired + private CaseInfoMapper caseInfoMapper; + @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -59,7 +60,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息"); + log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -69,6 +70,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -84,7 +86,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到离岗事件,但数据库中无该事件发生的设备信息"); + log.info("接收到离岗事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -94,6 +96,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -109,7 +112,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息"); + log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -119,6 +122,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -135,7 +139,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -145,6 +149,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -157,22 +162,29 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void monitorPointOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return; } // TODO: 2022/7/28 设备在线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(0).getCode()); - if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + int upDevFlag = deviceInfoMapper.updateById(deviceInfo); + + //更新该设备离线事件的解决状态(status=3) + caseInfoMapper.updateStatusByIndexCode(srcIndex); + + if(upDevFlag <= 0){ log.error("海康回调,更新监控点在线状态失败!"); } } @Override + @Transactional(rollbackFor = Exception.class) public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -185,7 +197,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -195,6 +207,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -208,6 +221,7 @@ @Override + @Transactional(rollbackFor = Exception.class) public void deviceOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); @@ -232,7 +246,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息"); + log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -242,10 +256,12 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @Override + @Transactional(rollbackFor = Exception.class) public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -291,6 +307,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void securityPersonnelHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -336,6 +353,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorRegisterHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -367,6 +385,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorCheckOutHandle(JSONObject event) { JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("endTime")); 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 c2714f5..decc60c 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,18 +9,15 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.StaffInfoMapper; import com.casic.missiles.modular.dto.StaffInfoRequest; -import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; -import com.casic.missiles.modular.dto.hik.PersonListDTO; -import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; -import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.dto.hik.*; 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.util.Base64Util; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DataAccessException; @@ -59,10 +57,9 @@ public List staffInfoListPage(Page page, StaffInfoRequest staffInfoRequest) { try { List pageList = staffInfoMapper.getStaffInfoListPage(page, staffInfoRequest); - pageList.forEach(staffInfo -> { + pageList.parallelStream().forEach(staffInfo -> { staffInfo.setStaffTypeName(dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, staffInfo.getStaffType())); - String base64 = Base64Util.transformPictureToBase64(uploadPath + staffInfo.getPicture()); - staffInfo.setPicture(base64); + staffInfo.setPicture(getPictureFromHik(staffInfo.getStaffCode())); }); return pageList; } catch (DataAccessException ex) { @@ -174,7 +171,7 @@ @Override @Transactional(rollbackFor = Exception.class) - public Object deleteBatchStaffInfo(List ids) { + public Object deleteBatchStaffInfo(List ids, List faceIds) { List staffInfos = staffInfoMapper.selectBatchIds(ids); List staffCodes = staffInfos.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); PersonBatchDeleteRequest personBatchDeleteRequest = new PersonBatchDeleteRequest(); @@ -186,6 +183,17 @@ log.error("请求海康,批量删除人员失败,海康response:{}", resultStr); return ResponseData.error("批量删除人员失败"); } + //批量删除人脸 + faceIds.parallelStream().forEach(faceId -> { + PersonBatchDeleteRequest personBatchDeleteRequest2 = new PersonBatchDeleteRequest(); + personBatchDeleteRequest2.setFaceId(faceId); + 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); + } + }); if(staffInfoMapper.deleteBatchIds(ids) > 0){ return ResponseData.success(); } @@ -195,12 +203,16 @@ @Override @Transactional(rollbackFor = Exception.class) public List addStaffInfoBatch(List staffInfos) { + List collect = staffInfos.stream().filter(result -> + StringUtils.isNotEmpty(result.getStaffCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "员工导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(staffInfos)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; List personList = new ArrayList<>(); - staffInfos.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -228,7 +240,7 @@ personSingleAddOrUpdateRequest.setCertificateNo(busConcentrator.getStaffIdCard()); personList.add(personSingleAddOrUpdateRequest); }); - List alreadyList = staffInfoMapper.selectBatchCodes(staffInfos); + List alreadyList = staffInfoMapper.selectBatchCodes(collect); if(CollectionUtil.isNotEmpty(alreadyList)){ List staffCodes = alreadyList.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); list.add("员工staffCode:" + staffCodes + "数据已存在!"); @@ -245,7 +257,7 @@ list.add("批量添加人员失败"); } //批量保存到数据库 - this.saveBatch(staffInfos); + this.saveBatch(collect); } return list; } @@ -292,4 +304,50 @@ public int updateStaffInfoBatch(List personList) { return staffInfoMapper.updateStaffInfoBatch(personList); } + + @Override + public Object getStaffPicture(String staffCode) { + //获取员工详细信息,含图片服务器、uri + String url = getPictureFromHik(staffCode); + return ResponseData.success(url); + } + + private String getPictureFromHik(String staffCode) { + 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 ""; + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + if(Objects.isNull(data)){ + return ""; + } + JSONArray dataArray = (JSONArray) data.get("list"); + if(0 == dataArray.size()){ + return ""; + } + 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 pictureFromHik = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + if(StringUtils.isNotEmpty(pictureFromHik) && !pictureFromHik.startsWith("http")){ + return "https://192.168.10.2:443" + pictureFromHik; + } + return pictureFromHik; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index b50b497..d6a3fcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @Description: 设备service @@ -55,4 +58,10 @@ int updateBatchGateGroupStatus(List deviceCodes, String status); int updateDeviceInfoBatch(List acsDeviceList); + + List getDeviceStatusGroup(); + + Map>> getCameraMap(String keywords, List positionIds, List areaIds); + + DeviceInfo deviceInfoByDrawNo(String drawNo); } 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 5fd9e32..0b31726 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 @@ -23,7 +23,7 @@ Object deleteStaffInfo(StaffInfo staffInfo); - Object deleteBatchStaffInfo(List ids); + Object deleteBatchStaffInfo(List ids, List faceIds); List addStaffInfoBatch(List results); @@ -34,4 +34,6 @@ int saveCardInfo(StaffCardRequest staffCardRequest); int updateStaffInfoBatch(List personList); + + Object getStaffPicture(String staffCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java index 2ba97b0..89bd933 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java @@ -16,4 +16,6 @@ List visitInfoListPage(Page page, VisitorRequest visitorRequest); VisitInfo visitInfoDetail(String id); + + String getVisitorPicture(VisitInfo visitInfo); } 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 981b4cd..ea6b8c0 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 @@ -8,10 +8,8 @@ import com.casic.missiles.modular.dao.BlackInfoMapper; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; import com.casic.missiles.modular.dto.BlackInfoRequest; -import com.casic.missiles.modular.dto.hik.FaceDeletionBatchRequest; -import com.casic.missiles.modular.dto.hik.FaceInfo; -import com.casic.missiles.modular.dto.hik.FacePic; -import com.casic.missiles.modular.dto.hik.FaceSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.BlackInfo; @@ -86,6 +84,10 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); + //数据库照片存海康的人脸url + JSONObject facePicture = (JSONObject)dataJson.get("facePic"); + String faceUrl = facePicture.getString("faceUrl"); + blackInfo.setPicture(faceUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -157,4 +159,19 @@ } return ResponseData.error("批量删除黑名单异常"); } + + + @Override + public Object getBlackPicture(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/service/impl/CaseInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java index 7a25099..6b03d8b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java @@ -132,4 +132,21 @@ public boolean insertCaseInfoBatch(List caseInfos) { return this.saveBatch(caseInfos); } + + @Override + public List caseInfoList(CaseInfoRequest caseInfoRequest) { + try { + List pageList = caseInfoMapper.getCaseInfoList(caseInfoRequest); + pageList.forEach(caseInfo ->{ + caseInfo.setStatusName(dictService.getDictNameByCode(SecurityEventDict.CASE_STATUS, caseInfo.getStatus())); + caseInfo.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, caseInfo.getPosition())); + caseInfo.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, caseInfo.getArea())); + caseInfo.setIsKeyAreaName(dictService.getDictNameByCode(SecurityEventDict.IS_KEY_AREA, caseInfo.getIsKeyArea())); + }); + return pageList; + } catch (DataAccessException ex) { + log.error("安防事件: 查询不分页出现异常, 异常:{}", ex); + } + return null; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java index 2608ba8..94308db 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java @@ -13,6 +13,7 @@ import com.casic.missiles.modular.dao.GroupDeviceMapper; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -21,11 +22,13 @@ import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.GroupDeviceService; 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.dao.DataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -133,11 +136,15 @@ @Override @Transactional(rollbackFor = Exception.class) public List addDeviceInfoBatch(List results) { + List collect = results.stream().filter(result -> + StringUtils.isNotEmpty(result.getIndexCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "设备导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(results)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; - results.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -157,7 +164,6 @@ // return; // } // } - if (StrUtil.isNotEmpty(busConcentrator.getInstallTime())) { try { new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(busConcentrator.getInstallTime()); @@ -173,7 +179,7 @@ if (CollectionUtil.isNotEmpty(list)) { return list; } - this.saveBatch(results); + this.saveBatch(collect); } return list; } @@ -346,5 +352,82 @@ return deviceInfoMapper.updateDeviceInfoBatch(acsDeviceList); } + @Override + public List getDeviceStatusGroup() { + List deviceStatusDTOS = deviceInfoMapper.selectDeviceStatusGroupByStatus(); + if(CollectionUtils.isEmpty(deviceStatusDTOS)){ + return new ArrayList<>(); + } + for (DeviceStatusDTO deviceStatusDTO : deviceStatusDTOS) { + String dictNameByCode = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, deviceStatusDTO.getStatus()); + deviceStatusDTO.setStatusName(dictNameByCode); + } + return deviceStatusDTOS; + } + + @Override + public Map>> getCameraMap(String keywords, List positionIds, List areaIds) { + Map>> map = new HashMap<>(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like("dev_name", keywords); + wrapper.like("dev_code", keywords); + if(!CollectionUtils.isEmpty(positionIds)){ + wrapper.in("position", positionIds); + } + if(!CollectionUtils.isEmpty(areaIds)){ + wrapper.in("area", areaIds); + } + wrapper.in("dev_type", Arrays.asList("2","3","4","5","6","7")); + List deviceInfos = deviceInfoMapper.selectList(wrapper); + + deviceInfos.forEach(cameraDTO -> { + cameraDTO.setPositionName(dictService.getDictNameByCode("devicePosition", cameraDTO.getPosition())); + cameraDTO.setAreaName(dictService.getDictNameByCode("deviceArea", cameraDTO.getArea())); + + if (map.containsKey(cameraDTO.getPositionName())) { + if (map.get(cameraDTO.getPositionName()).containsKey(cameraDTO.getAreaName())) { + map.get(cameraDTO.getPositionName()).get(cameraDTO.getAreaName()).add(cameraDTO); + } else { + map.get(cameraDTO.getPositionName()).put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + } + } else { + TreeMap> areaMap = new TreeMap<>(new Comparator() { + @Override + public int compare(String o1, String o2) { + if(o1.endsWith("F") && o2.endsWith("F")){ + String o1Str = o1.substring(0, o1.length()-1); + String o2Str = o2.substring(0, o2.length()-1); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + if(o1.startsWith("N") && o2.startsWith("N")){ + String o1Str = o1.substring(1, o1.length()); + String o2Str = o2.substring(1, o2.length()); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + return 0; + } + }); + areaMap.put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + map.put(cameraDTO.getPositionName(), areaMap); + } + }); + return map; + } + + @Override + public DeviceInfo deviceInfoByDrawNo(String drawNo) { + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("draw_no", drawNo); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java index a95fff2..e3dff1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -107,6 +108,9 @@ ); return; } + if(StringUtils.isEmpty(busConcentrator.getEquipCode())){ + return; + } if (StrUtil.isNotEmpty(busConcentrator.getProductDate())) { try { new SimpleDateFormat("yyyy-MM-dd").parse(busConcentrator.getProductDate()); 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 ff60402..8ed53d9 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 @@ -5,10 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.core.application.service.AbstractDictService; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.DeviceInfoMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; -import com.casic.missiles.modular.dao.VisitInfoMapper; +import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.*; import com.casic.missiles.modular.service.HikService; @@ -16,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.HashMap; @@ -47,6 +45,9 @@ @Autowired private DeviceInfoMapper deviceInfoMapper; + @Autowired + private CaseInfoMapper caseInfoMapper; + @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -59,7 +60,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息"); + log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -69,6 +70,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -84,7 +86,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到离岗事件,但数据库中无该事件发生的设备信息"); + log.info("接收到离岗事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -94,6 +96,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -109,7 +112,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息"); + log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -119,6 +122,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -135,7 +139,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -145,6 +149,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -157,22 +162,29 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void monitorPointOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return; } // TODO: 2022/7/28 设备在线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(0).getCode()); - if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + int upDevFlag = deviceInfoMapper.updateById(deviceInfo); + + //更新该设备离线事件的解决状态(status=3) + caseInfoMapper.updateStatusByIndexCode(srcIndex); + + if(upDevFlag <= 0){ log.error("海康回调,更新监控点在线状态失败!"); } } @Override + @Transactional(rollbackFor = Exception.class) public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -185,7 +197,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -195,6 +207,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -208,6 +221,7 @@ @Override + @Transactional(rollbackFor = Exception.class) public void deviceOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); @@ -232,7 +246,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息"); + log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -242,10 +256,12 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @Override + @Transactional(rollbackFor = Exception.class) public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -291,6 +307,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void securityPersonnelHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -336,6 +353,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorRegisterHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -367,6 +385,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorCheckOutHandle(JSONObject event) { JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("endTime")); 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 c2714f5..decc60c 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,18 +9,15 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.StaffInfoMapper; import com.casic.missiles.modular.dto.StaffInfoRequest; -import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; -import com.casic.missiles.modular.dto.hik.PersonListDTO; -import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; -import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.dto.hik.*; 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.util.Base64Util; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DataAccessException; @@ -59,10 +57,9 @@ public List staffInfoListPage(Page page, StaffInfoRequest staffInfoRequest) { try { List pageList = staffInfoMapper.getStaffInfoListPage(page, staffInfoRequest); - pageList.forEach(staffInfo -> { + pageList.parallelStream().forEach(staffInfo -> { staffInfo.setStaffTypeName(dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, staffInfo.getStaffType())); - String base64 = Base64Util.transformPictureToBase64(uploadPath + staffInfo.getPicture()); - staffInfo.setPicture(base64); + staffInfo.setPicture(getPictureFromHik(staffInfo.getStaffCode())); }); return pageList; } catch (DataAccessException ex) { @@ -174,7 +171,7 @@ @Override @Transactional(rollbackFor = Exception.class) - public Object deleteBatchStaffInfo(List ids) { + public Object deleteBatchStaffInfo(List ids, List faceIds) { List staffInfos = staffInfoMapper.selectBatchIds(ids); List staffCodes = staffInfos.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); PersonBatchDeleteRequest personBatchDeleteRequest = new PersonBatchDeleteRequest(); @@ -186,6 +183,17 @@ log.error("请求海康,批量删除人员失败,海康response:{}", resultStr); return ResponseData.error("批量删除人员失败"); } + //批量删除人脸 + faceIds.parallelStream().forEach(faceId -> { + PersonBatchDeleteRequest personBatchDeleteRequest2 = new PersonBatchDeleteRequest(); + personBatchDeleteRequest2.setFaceId(faceId); + 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); + } + }); if(staffInfoMapper.deleteBatchIds(ids) > 0){ return ResponseData.success(); } @@ -195,12 +203,16 @@ @Override @Transactional(rollbackFor = Exception.class) public List addStaffInfoBatch(List staffInfos) { + List collect = staffInfos.stream().filter(result -> + StringUtils.isNotEmpty(result.getStaffCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "员工导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(staffInfos)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; List personList = new ArrayList<>(); - staffInfos.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -228,7 +240,7 @@ personSingleAddOrUpdateRequest.setCertificateNo(busConcentrator.getStaffIdCard()); personList.add(personSingleAddOrUpdateRequest); }); - List alreadyList = staffInfoMapper.selectBatchCodes(staffInfos); + List alreadyList = staffInfoMapper.selectBatchCodes(collect); if(CollectionUtil.isNotEmpty(alreadyList)){ List staffCodes = alreadyList.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); list.add("员工staffCode:" + staffCodes + "数据已存在!"); @@ -245,7 +257,7 @@ list.add("批量添加人员失败"); } //批量保存到数据库 - this.saveBatch(staffInfos); + this.saveBatch(collect); } return list; } @@ -292,4 +304,50 @@ public int updateStaffInfoBatch(List personList) { return staffInfoMapper.updateStaffInfoBatch(personList); } + + @Override + public Object getStaffPicture(String staffCode) { + //获取员工详细信息,含图片服务器、uri + String url = getPictureFromHik(staffCode); + return ResponseData.success(url); + } + + private String getPictureFromHik(String staffCode) { + 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 ""; + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + if(Objects.isNull(data)){ + return ""; + } + JSONArray dataArray = (JSONArray) data.get("list"); + if(0 == dataArray.size()){ + return ""; + } + 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 pictureFromHik = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + if(StringUtils.isNotEmpty(pictureFromHik) && !pictureFromHik.startsWith("http")){ + return "https://192.168.10.2:443" + pictureFromHik; + } + return pictureFromHik; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java index 39618ea..42e68ab 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java @@ -1,13 +1,17 @@ package com.casic.missiles.modular.service.impl; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dao.VisitInfoMapper; import com.casic.missiles.modular.dto.VisitorRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.VisitInfo; import com.casic.missiles.modular.service.VisitService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; @@ -50,4 +54,15 @@ VisitInfo visitInfo = visitInfoMapper.selectById(id); return visitInfo; } + + @Override + public String getVisitorPicture(VisitInfo visitInfo) { + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(visitInfo.getPicUri()); + picRequest.setServerIndexCode(visitInfo.getServerIndexCode()); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + return HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index b50b497..d6a3fcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @Description: 设备service @@ -55,4 +58,10 @@ int updateBatchGateGroupStatus(List deviceCodes, String status); int updateDeviceInfoBatch(List acsDeviceList); + + List getDeviceStatusGroup(); + + Map>> getCameraMap(String keywords, List positionIds, List areaIds); + + DeviceInfo deviceInfoByDrawNo(String drawNo); } 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 5fd9e32..0b31726 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 @@ -23,7 +23,7 @@ Object deleteStaffInfo(StaffInfo staffInfo); - Object deleteBatchStaffInfo(List ids); + Object deleteBatchStaffInfo(List ids, List faceIds); List addStaffInfoBatch(List results); @@ -34,4 +34,6 @@ int saveCardInfo(StaffCardRequest staffCardRequest); int updateStaffInfoBatch(List personList); + + Object getStaffPicture(String staffCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java index 2ba97b0..89bd933 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java @@ -16,4 +16,6 @@ List visitInfoListPage(Page page, VisitorRequest visitorRequest); VisitInfo visitInfoDetail(String id); + + String getVisitorPicture(VisitInfo visitInfo); } 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 981b4cd..ea6b8c0 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 @@ -8,10 +8,8 @@ import com.casic.missiles.modular.dao.BlackInfoMapper; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; import com.casic.missiles.modular.dto.BlackInfoRequest; -import com.casic.missiles.modular.dto.hik.FaceDeletionBatchRequest; -import com.casic.missiles.modular.dto.hik.FaceInfo; -import com.casic.missiles.modular.dto.hik.FacePic; -import com.casic.missiles.modular.dto.hik.FaceSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.BlackInfo; @@ -86,6 +84,10 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); + //数据库照片存海康的人脸url + JSONObject facePicture = (JSONObject)dataJson.get("facePic"); + String faceUrl = facePicture.getString("faceUrl"); + blackInfo.setPicture(faceUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -157,4 +159,19 @@ } return ResponseData.error("批量删除黑名单异常"); } + + + @Override + public Object getBlackPicture(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/service/impl/CaseInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java index 7a25099..6b03d8b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java @@ -132,4 +132,21 @@ public boolean insertCaseInfoBatch(List caseInfos) { return this.saveBatch(caseInfos); } + + @Override + public List caseInfoList(CaseInfoRequest caseInfoRequest) { + try { + List pageList = caseInfoMapper.getCaseInfoList(caseInfoRequest); + pageList.forEach(caseInfo ->{ + caseInfo.setStatusName(dictService.getDictNameByCode(SecurityEventDict.CASE_STATUS, caseInfo.getStatus())); + caseInfo.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, caseInfo.getPosition())); + caseInfo.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, caseInfo.getArea())); + caseInfo.setIsKeyAreaName(dictService.getDictNameByCode(SecurityEventDict.IS_KEY_AREA, caseInfo.getIsKeyArea())); + }); + return pageList; + } catch (DataAccessException ex) { + log.error("安防事件: 查询不分页出现异常, 异常:{}", ex); + } + return null; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java index 2608ba8..94308db 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java @@ -13,6 +13,7 @@ import com.casic.missiles.modular.dao.GroupDeviceMapper; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -21,11 +22,13 @@ import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.GroupDeviceService; 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.dao.DataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -133,11 +136,15 @@ @Override @Transactional(rollbackFor = Exception.class) public List addDeviceInfoBatch(List results) { + List collect = results.stream().filter(result -> + StringUtils.isNotEmpty(result.getIndexCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "设备导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(results)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; - results.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -157,7 +164,6 @@ // return; // } // } - if (StrUtil.isNotEmpty(busConcentrator.getInstallTime())) { try { new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(busConcentrator.getInstallTime()); @@ -173,7 +179,7 @@ if (CollectionUtil.isNotEmpty(list)) { return list; } - this.saveBatch(results); + this.saveBatch(collect); } return list; } @@ -346,5 +352,82 @@ return deviceInfoMapper.updateDeviceInfoBatch(acsDeviceList); } + @Override + public List getDeviceStatusGroup() { + List deviceStatusDTOS = deviceInfoMapper.selectDeviceStatusGroupByStatus(); + if(CollectionUtils.isEmpty(deviceStatusDTOS)){ + return new ArrayList<>(); + } + for (DeviceStatusDTO deviceStatusDTO : deviceStatusDTOS) { + String dictNameByCode = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, deviceStatusDTO.getStatus()); + deviceStatusDTO.setStatusName(dictNameByCode); + } + return deviceStatusDTOS; + } + + @Override + public Map>> getCameraMap(String keywords, List positionIds, List areaIds) { + Map>> map = new HashMap<>(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like("dev_name", keywords); + wrapper.like("dev_code", keywords); + if(!CollectionUtils.isEmpty(positionIds)){ + wrapper.in("position", positionIds); + } + if(!CollectionUtils.isEmpty(areaIds)){ + wrapper.in("area", areaIds); + } + wrapper.in("dev_type", Arrays.asList("2","3","4","5","6","7")); + List deviceInfos = deviceInfoMapper.selectList(wrapper); + + deviceInfos.forEach(cameraDTO -> { + cameraDTO.setPositionName(dictService.getDictNameByCode("devicePosition", cameraDTO.getPosition())); + cameraDTO.setAreaName(dictService.getDictNameByCode("deviceArea", cameraDTO.getArea())); + + if (map.containsKey(cameraDTO.getPositionName())) { + if (map.get(cameraDTO.getPositionName()).containsKey(cameraDTO.getAreaName())) { + map.get(cameraDTO.getPositionName()).get(cameraDTO.getAreaName()).add(cameraDTO); + } else { + map.get(cameraDTO.getPositionName()).put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + } + } else { + TreeMap> areaMap = new TreeMap<>(new Comparator() { + @Override + public int compare(String o1, String o2) { + if(o1.endsWith("F") && o2.endsWith("F")){ + String o1Str = o1.substring(0, o1.length()-1); + String o2Str = o2.substring(0, o2.length()-1); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + if(o1.startsWith("N") && o2.startsWith("N")){ + String o1Str = o1.substring(1, o1.length()); + String o2Str = o2.substring(1, o2.length()); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + return 0; + } + }); + areaMap.put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + map.put(cameraDTO.getPositionName(), areaMap); + } + }); + return map; + } + + @Override + public DeviceInfo deviceInfoByDrawNo(String drawNo) { + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("draw_no", drawNo); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java index a95fff2..e3dff1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -107,6 +108,9 @@ ); return; } + if(StringUtils.isEmpty(busConcentrator.getEquipCode())){ + return; + } if (StrUtil.isNotEmpty(busConcentrator.getProductDate())) { try { new SimpleDateFormat("yyyy-MM-dd").parse(busConcentrator.getProductDate()); 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 ff60402..8ed53d9 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 @@ -5,10 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.core.application.service.AbstractDictService; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.DeviceInfoMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; -import com.casic.missiles.modular.dao.VisitInfoMapper; +import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.*; import com.casic.missiles.modular.service.HikService; @@ -16,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.HashMap; @@ -47,6 +45,9 @@ @Autowired private DeviceInfoMapper deviceInfoMapper; + @Autowired + private CaseInfoMapper caseInfoMapper; + @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -59,7 +60,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息"); + log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -69,6 +70,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -84,7 +86,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到离岗事件,但数据库中无该事件发生的设备信息"); + log.info("接收到离岗事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -94,6 +96,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -109,7 +112,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息"); + log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -119,6 +122,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -135,7 +139,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -145,6 +149,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -157,22 +162,29 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void monitorPointOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return; } // TODO: 2022/7/28 设备在线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(0).getCode()); - if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + int upDevFlag = deviceInfoMapper.updateById(deviceInfo); + + //更新该设备离线事件的解决状态(status=3) + caseInfoMapper.updateStatusByIndexCode(srcIndex); + + if(upDevFlag <= 0){ log.error("海康回调,更新监控点在线状态失败!"); } } @Override + @Transactional(rollbackFor = Exception.class) public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -185,7 +197,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -195,6 +207,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -208,6 +221,7 @@ @Override + @Transactional(rollbackFor = Exception.class) public void deviceOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); @@ -232,7 +246,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息"); + log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -242,10 +256,12 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @Override + @Transactional(rollbackFor = Exception.class) public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -291,6 +307,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void securityPersonnelHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -336,6 +353,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorRegisterHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -367,6 +385,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorCheckOutHandle(JSONObject event) { JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("endTime")); 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 c2714f5..decc60c 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,18 +9,15 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.StaffInfoMapper; import com.casic.missiles.modular.dto.StaffInfoRequest; -import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; -import com.casic.missiles.modular.dto.hik.PersonListDTO; -import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; -import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.dto.hik.*; 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.util.Base64Util; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DataAccessException; @@ -59,10 +57,9 @@ public List staffInfoListPage(Page page, StaffInfoRequest staffInfoRequest) { try { List pageList = staffInfoMapper.getStaffInfoListPage(page, staffInfoRequest); - pageList.forEach(staffInfo -> { + pageList.parallelStream().forEach(staffInfo -> { staffInfo.setStaffTypeName(dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, staffInfo.getStaffType())); - String base64 = Base64Util.transformPictureToBase64(uploadPath + staffInfo.getPicture()); - staffInfo.setPicture(base64); + staffInfo.setPicture(getPictureFromHik(staffInfo.getStaffCode())); }); return pageList; } catch (DataAccessException ex) { @@ -174,7 +171,7 @@ @Override @Transactional(rollbackFor = Exception.class) - public Object deleteBatchStaffInfo(List ids) { + public Object deleteBatchStaffInfo(List ids, List faceIds) { List staffInfos = staffInfoMapper.selectBatchIds(ids); List staffCodes = staffInfos.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); PersonBatchDeleteRequest personBatchDeleteRequest = new PersonBatchDeleteRequest(); @@ -186,6 +183,17 @@ log.error("请求海康,批量删除人员失败,海康response:{}", resultStr); return ResponseData.error("批量删除人员失败"); } + //批量删除人脸 + faceIds.parallelStream().forEach(faceId -> { + PersonBatchDeleteRequest personBatchDeleteRequest2 = new PersonBatchDeleteRequest(); + personBatchDeleteRequest2.setFaceId(faceId); + 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); + } + }); if(staffInfoMapper.deleteBatchIds(ids) > 0){ return ResponseData.success(); } @@ -195,12 +203,16 @@ @Override @Transactional(rollbackFor = Exception.class) public List addStaffInfoBatch(List staffInfos) { + List collect = staffInfos.stream().filter(result -> + StringUtils.isNotEmpty(result.getStaffCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "员工导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(staffInfos)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; List personList = new ArrayList<>(); - staffInfos.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -228,7 +240,7 @@ personSingleAddOrUpdateRequest.setCertificateNo(busConcentrator.getStaffIdCard()); personList.add(personSingleAddOrUpdateRequest); }); - List alreadyList = staffInfoMapper.selectBatchCodes(staffInfos); + List alreadyList = staffInfoMapper.selectBatchCodes(collect); if(CollectionUtil.isNotEmpty(alreadyList)){ List staffCodes = alreadyList.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); list.add("员工staffCode:" + staffCodes + "数据已存在!"); @@ -245,7 +257,7 @@ list.add("批量添加人员失败"); } //批量保存到数据库 - this.saveBatch(staffInfos); + this.saveBatch(collect); } return list; } @@ -292,4 +304,50 @@ public int updateStaffInfoBatch(List personList) { return staffInfoMapper.updateStaffInfoBatch(personList); } + + @Override + public Object getStaffPicture(String staffCode) { + //获取员工详细信息,含图片服务器、uri + String url = getPictureFromHik(staffCode); + return ResponseData.success(url); + } + + private String getPictureFromHik(String staffCode) { + 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 ""; + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + if(Objects.isNull(data)){ + return ""; + } + JSONArray dataArray = (JSONArray) data.get("list"); + if(0 == dataArray.size()){ + return ""; + } + 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 pictureFromHik = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + if(StringUtils.isNotEmpty(pictureFromHik) && !pictureFromHik.startsWith("http")){ + return "https://192.168.10.2:443" + pictureFromHik; + } + return pictureFromHik; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java index 39618ea..42e68ab 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java @@ -1,13 +1,17 @@ package com.casic.missiles.modular.service.impl; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dao.VisitInfoMapper; import com.casic.missiles.modular.dto.VisitorRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.VisitInfo; import com.casic.missiles.modular.service.VisitService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; @@ -50,4 +54,15 @@ VisitInfo visitInfo = visitInfoMapper.selectById(id); return visitInfo; } + + @Override + public String getVisitorPicture(VisitInfo visitInfo) { + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(visitInfo.getPicUri()); + picRequest.setServerIndexCode(visitInfo.getServerIndexCode()); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + return HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java index 191ef79..109eec2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java @@ -1,12 +1,15 @@ package com.casic.missiles.modular.util; +import cn.hutool.core.date.DateUtil; import javafx.util.Pair; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.List; /** * Created by Administrator on 2015/2/25. @@ -113,4 +116,85 @@ calendar.add(Calendar.DATE, -2); return sdf_day.format(calendar.getTime()); } + + public static List getCurrentDateWeekList() { + List list = new ArrayList<>(); + //获取当前日期前30天的日期 + Date now = new Date(); + Date startDate = org.apache.commons.lang3.time.DateUtils.addDays(now, -30); + //获取30天前对应的当前年的第几周 + int startWeek = cn.hutool.core.date.DateUtil.weekOfYear(startDate); + int endWeek = cn.hutool.core.date.DateUtil.weekOfYear(now); + int year = cn.hutool.core.date.DateUtil.thisYear(); + for (int i = startWeek; i < endWeek + 1; i++) { + list.add("" + year + "-" + i); + } + return list; + } + + public static List getCurrentDateHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + for (int i = 0; i < 24; i++) { + if (i < 10) { + list.add(today + " 0" + i); + } else { + list.add(today + " " + i); + } + } + return list; + } + + public static List getCurrentDateMonthList() { + List list = new ArrayList<>(); + int year = cn.hutool.core.date.DateUtil.thisYear(); + for (int i = 1; i < 13; i++) { + if (i < 10) { + list.add("" + year + "-0" + i); + } else { + list.add("" + year + "-" + i); + } + } + return list; + } + + public static List getCurrentDateDayList() { + List list = new ArrayList<>(); + //获取当前日期前7天的日期 + Date now = new Date(); +// Date startDate = org.apache.commons.lang3.time.DateUtils.addDays(now, -7); +// String s = DateUtil.formatDate(startDate); +// list.add(s); + for (int i = 1; i < 8; i++) { + Date date = org.apache.commons.lang3.time.DateUtils.addDays(now, -i); + String s = DateUtil.formatDate(date); + list.add(s); + } + return list; + } + + public static List getCurrentDatePeakHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + list.add(today + " 07"); + list.add(today + " 08"); + list.add(today + " 09"); + list.add(today + " 17"); + list.add(today + " 18"); + list.add(today + " 19"); + return list; + } + + public static List getCurrentDateWorkHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + for (int i = 6; i < 24; i++) { + if (i < 10) { + list.add(today + " 0" + i); + } else { + list.add(today + " " + i); + } + } + return list; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index b50b497..d6a3fcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @Description: 设备service @@ -55,4 +58,10 @@ int updateBatchGateGroupStatus(List deviceCodes, String status); int updateDeviceInfoBatch(List acsDeviceList); + + List getDeviceStatusGroup(); + + Map>> getCameraMap(String keywords, List positionIds, List areaIds); + + DeviceInfo deviceInfoByDrawNo(String drawNo); } 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 5fd9e32..0b31726 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 @@ -23,7 +23,7 @@ Object deleteStaffInfo(StaffInfo staffInfo); - Object deleteBatchStaffInfo(List ids); + Object deleteBatchStaffInfo(List ids, List faceIds); List addStaffInfoBatch(List results); @@ -34,4 +34,6 @@ int saveCardInfo(StaffCardRequest staffCardRequest); int updateStaffInfoBatch(List personList); + + Object getStaffPicture(String staffCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java index 2ba97b0..89bd933 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java @@ -16,4 +16,6 @@ List visitInfoListPage(Page page, VisitorRequest visitorRequest); VisitInfo visitInfoDetail(String id); + + String getVisitorPicture(VisitInfo visitInfo); } 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 981b4cd..ea6b8c0 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 @@ -8,10 +8,8 @@ import com.casic.missiles.modular.dao.BlackInfoMapper; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; import com.casic.missiles.modular.dto.BlackInfoRequest; -import com.casic.missiles.modular.dto.hik.FaceDeletionBatchRequest; -import com.casic.missiles.modular.dto.hik.FaceInfo; -import com.casic.missiles.modular.dto.hik.FacePic; -import com.casic.missiles.modular.dto.hik.FaceSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.BlackInfo; @@ -86,6 +84,10 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); + //数据库照片存海康的人脸url + JSONObject facePicture = (JSONObject)dataJson.get("facePic"); + String faceUrl = facePicture.getString("faceUrl"); + blackInfo.setPicture(faceUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -157,4 +159,19 @@ } return ResponseData.error("批量删除黑名单异常"); } + + + @Override + public Object getBlackPicture(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/service/impl/CaseInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java index 7a25099..6b03d8b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java @@ -132,4 +132,21 @@ public boolean insertCaseInfoBatch(List caseInfos) { return this.saveBatch(caseInfos); } + + @Override + public List caseInfoList(CaseInfoRequest caseInfoRequest) { + try { + List pageList = caseInfoMapper.getCaseInfoList(caseInfoRequest); + pageList.forEach(caseInfo ->{ + caseInfo.setStatusName(dictService.getDictNameByCode(SecurityEventDict.CASE_STATUS, caseInfo.getStatus())); + caseInfo.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, caseInfo.getPosition())); + caseInfo.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, caseInfo.getArea())); + caseInfo.setIsKeyAreaName(dictService.getDictNameByCode(SecurityEventDict.IS_KEY_AREA, caseInfo.getIsKeyArea())); + }); + return pageList; + } catch (DataAccessException ex) { + log.error("安防事件: 查询不分页出现异常, 异常:{}", ex); + } + return null; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java index 2608ba8..94308db 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java @@ -13,6 +13,7 @@ import com.casic.missiles.modular.dao.GroupDeviceMapper; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -21,11 +22,13 @@ import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.GroupDeviceService; 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.dao.DataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -133,11 +136,15 @@ @Override @Transactional(rollbackFor = Exception.class) public List addDeviceInfoBatch(List results) { + List collect = results.stream().filter(result -> + StringUtils.isNotEmpty(result.getIndexCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "设备导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(results)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; - results.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -157,7 +164,6 @@ // return; // } // } - if (StrUtil.isNotEmpty(busConcentrator.getInstallTime())) { try { new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(busConcentrator.getInstallTime()); @@ -173,7 +179,7 @@ if (CollectionUtil.isNotEmpty(list)) { return list; } - this.saveBatch(results); + this.saveBatch(collect); } return list; } @@ -346,5 +352,82 @@ return deviceInfoMapper.updateDeviceInfoBatch(acsDeviceList); } + @Override + public List getDeviceStatusGroup() { + List deviceStatusDTOS = deviceInfoMapper.selectDeviceStatusGroupByStatus(); + if(CollectionUtils.isEmpty(deviceStatusDTOS)){ + return new ArrayList<>(); + } + for (DeviceStatusDTO deviceStatusDTO : deviceStatusDTOS) { + String dictNameByCode = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, deviceStatusDTO.getStatus()); + deviceStatusDTO.setStatusName(dictNameByCode); + } + return deviceStatusDTOS; + } + + @Override + public Map>> getCameraMap(String keywords, List positionIds, List areaIds) { + Map>> map = new HashMap<>(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like("dev_name", keywords); + wrapper.like("dev_code", keywords); + if(!CollectionUtils.isEmpty(positionIds)){ + wrapper.in("position", positionIds); + } + if(!CollectionUtils.isEmpty(areaIds)){ + wrapper.in("area", areaIds); + } + wrapper.in("dev_type", Arrays.asList("2","3","4","5","6","7")); + List deviceInfos = deviceInfoMapper.selectList(wrapper); + + deviceInfos.forEach(cameraDTO -> { + cameraDTO.setPositionName(dictService.getDictNameByCode("devicePosition", cameraDTO.getPosition())); + cameraDTO.setAreaName(dictService.getDictNameByCode("deviceArea", cameraDTO.getArea())); + + if (map.containsKey(cameraDTO.getPositionName())) { + if (map.get(cameraDTO.getPositionName()).containsKey(cameraDTO.getAreaName())) { + map.get(cameraDTO.getPositionName()).get(cameraDTO.getAreaName()).add(cameraDTO); + } else { + map.get(cameraDTO.getPositionName()).put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + } + } else { + TreeMap> areaMap = new TreeMap<>(new Comparator() { + @Override + public int compare(String o1, String o2) { + if(o1.endsWith("F") && o2.endsWith("F")){ + String o1Str = o1.substring(0, o1.length()-1); + String o2Str = o2.substring(0, o2.length()-1); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + if(o1.startsWith("N") && o2.startsWith("N")){ + String o1Str = o1.substring(1, o1.length()); + String o2Str = o2.substring(1, o2.length()); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + return 0; + } + }); + areaMap.put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + map.put(cameraDTO.getPositionName(), areaMap); + } + }); + return map; + } + + @Override + public DeviceInfo deviceInfoByDrawNo(String drawNo) { + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("draw_no", drawNo); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java index a95fff2..e3dff1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -107,6 +108,9 @@ ); return; } + if(StringUtils.isEmpty(busConcentrator.getEquipCode())){ + return; + } if (StrUtil.isNotEmpty(busConcentrator.getProductDate())) { try { new SimpleDateFormat("yyyy-MM-dd").parse(busConcentrator.getProductDate()); 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 ff60402..8ed53d9 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 @@ -5,10 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.core.application.service.AbstractDictService; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.DeviceInfoMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; -import com.casic.missiles.modular.dao.VisitInfoMapper; +import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.*; import com.casic.missiles.modular.service.HikService; @@ -16,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.HashMap; @@ -47,6 +45,9 @@ @Autowired private DeviceInfoMapper deviceInfoMapper; + @Autowired + private CaseInfoMapper caseInfoMapper; + @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -59,7 +60,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息"); + log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -69,6 +70,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -84,7 +86,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到离岗事件,但数据库中无该事件发生的设备信息"); + log.info("接收到离岗事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -94,6 +96,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -109,7 +112,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息"); + log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -119,6 +122,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -135,7 +139,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -145,6 +149,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -157,22 +162,29 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void monitorPointOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return; } // TODO: 2022/7/28 设备在线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(0).getCode()); - if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + int upDevFlag = deviceInfoMapper.updateById(deviceInfo); + + //更新该设备离线事件的解决状态(status=3) + caseInfoMapper.updateStatusByIndexCode(srcIndex); + + if(upDevFlag <= 0){ log.error("海康回调,更新监控点在线状态失败!"); } } @Override + @Transactional(rollbackFor = Exception.class) public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -185,7 +197,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -195,6 +207,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -208,6 +221,7 @@ @Override + @Transactional(rollbackFor = Exception.class) public void deviceOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); @@ -232,7 +246,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息"); + log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -242,10 +256,12 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @Override + @Transactional(rollbackFor = Exception.class) public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -291,6 +307,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void securityPersonnelHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -336,6 +353,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorRegisterHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -367,6 +385,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorCheckOutHandle(JSONObject event) { JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("endTime")); 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 c2714f5..decc60c 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,18 +9,15 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.StaffInfoMapper; import com.casic.missiles.modular.dto.StaffInfoRequest; -import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; -import com.casic.missiles.modular.dto.hik.PersonListDTO; -import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; -import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.dto.hik.*; 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.util.Base64Util; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DataAccessException; @@ -59,10 +57,9 @@ public List staffInfoListPage(Page page, StaffInfoRequest staffInfoRequest) { try { List pageList = staffInfoMapper.getStaffInfoListPage(page, staffInfoRequest); - pageList.forEach(staffInfo -> { + pageList.parallelStream().forEach(staffInfo -> { staffInfo.setStaffTypeName(dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, staffInfo.getStaffType())); - String base64 = Base64Util.transformPictureToBase64(uploadPath + staffInfo.getPicture()); - staffInfo.setPicture(base64); + staffInfo.setPicture(getPictureFromHik(staffInfo.getStaffCode())); }); return pageList; } catch (DataAccessException ex) { @@ -174,7 +171,7 @@ @Override @Transactional(rollbackFor = Exception.class) - public Object deleteBatchStaffInfo(List ids) { + public Object deleteBatchStaffInfo(List ids, List faceIds) { List staffInfos = staffInfoMapper.selectBatchIds(ids); List staffCodes = staffInfos.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); PersonBatchDeleteRequest personBatchDeleteRequest = new PersonBatchDeleteRequest(); @@ -186,6 +183,17 @@ log.error("请求海康,批量删除人员失败,海康response:{}", resultStr); return ResponseData.error("批量删除人员失败"); } + //批量删除人脸 + faceIds.parallelStream().forEach(faceId -> { + PersonBatchDeleteRequest personBatchDeleteRequest2 = new PersonBatchDeleteRequest(); + personBatchDeleteRequest2.setFaceId(faceId); + 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); + } + }); if(staffInfoMapper.deleteBatchIds(ids) > 0){ return ResponseData.success(); } @@ -195,12 +203,16 @@ @Override @Transactional(rollbackFor = Exception.class) public List addStaffInfoBatch(List staffInfos) { + List collect = staffInfos.stream().filter(result -> + StringUtils.isNotEmpty(result.getStaffCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "员工导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(staffInfos)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; List personList = new ArrayList<>(); - staffInfos.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -228,7 +240,7 @@ personSingleAddOrUpdateRequest.setCertificateNo(busConcentrator.getStaffIdCard()); personList.add(personSingleAddOrUpdateRequest); }); - List alreadyList = staffInfoMapper.selectBatchCodes(staffInfos); + List alreadyList = staffInfoMapper.selectBatchCodes(collect); if(CollectionUtil.isNotEmpty(alreadyList)){ List staffCodes = alreadyList.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); list.add("员工staffCode:" + staffCodes + "数据已存在!"); @@ -245,7 +257,7 @@ list.add("批量添加人员失败"); } //批量保存到数据库 - this.saveBatch(staffInfos); + this.saveBatch(collect); } return list; } @@ -292,4 +304,50 @@ public int updateStaffInfoBatch(List personList) { return staffInfoMapper.updateStaffInfoBatch(personList); } + + @Override + public Object getStaffPicture(String staffCode) { + //获取员工详细信息,含图片服务器、uri + String url = getPictureFromHik(staffCode); + return ResponseData.success(url); + } + + private String getPictureFromHik(String staffCode) { + 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 ""; + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + if(Objects.isNull(data)){ + return ""; + } + JSONArray dataArray = (JSONArray) data.get("list"); + if(0 == dataArray.size()){ + return ""; + } + 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 pictureFromHik = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + if(StringUtils.isNotEmpty(pictureFromHik) && !pictureFromHik.startsWith("http")){ + return "https://192.168.10.2:443" + pictureFromHik; + } + return pictureFromHik; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java index 39618ea..42e68ab 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java @@ -1,13 +1,17 @@ package com.casic.missiles.modular.service.impl; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dao.VisitInfoMapper; import com.casic.missiles.modular.dto.VisitorRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.VisitInfo; import com.casic.missiles.modular.service.VisitService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; @@ -50,4 +54,15 @@ VisitInfo visitInfo = visitInfoMapper.selectById(id); return visitInfo; } + + @Override + public String getVisitorPicture(VisitInfo visitInfo) { + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(visitInfo.getPicUri()); + picRequest.setServerIndexCode(visitInfo.getServerIndexCode()); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + return HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java index 191ef79..109eec2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java @@ -1,12 +1,15 @@ package com.casic.missiles.modular.util; +import cn.hutool.core.date.DateUtil; import javafx.util.Pair; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.List; /** * Created by Administrator on 2015/2/25. @@ -113,4 +116,85 @@ calendar.add(Calendar.DATE, -2); return sdf_day.format(calendar.getTime()); } + + public static List getCurrentDateWeekList() { + List list = new ArrayList<>(); + //获取当前日期前30天的日期 + Date now = new Date(); + Date startDate = org.apache.commons.lang3.time.DateUtils.addDays(now, -30); + //获取30天前对应的当前年的第几周 + int startWeek = cn.hutool.core.date.DateUtil.weekOfYear(startDate); + int endWeek = cn.hutool.core.date.DateUtil.weekOfYear(now); + int year = cn.hutool.core.date.DateUtil.thisYear(); + for (int i = startWeek; i < endWeek + 1; i++) { + list.add("" + year + "-" + i); + } + return list; + } + + public static List getCurrentDateHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + for (int i = 0; i < 24; i++) { + if (i < 10) { + list.add(today + " 0" + i); + } else { + list.add(today + " " + i); + } + } + return list; + } + + public static List getCurrentDateMonthList() { + List list = new ArrayList<>(); + int year = cn.hutool.core.date.DateUtil.thisYear(); + for (int i = 1; i < 13; i++) { + if (i < 10) { + list.add("" + year + "-0" + i); + } else { + list.add("" + year + "-" + i); + } + } + return list; + } + + public static List getCurrentDateDayList() { + List list = new ArrayList<>(); + //获取当前日期前7天的日期 + Date now = new Date(); +// Date startDate = org.apache.commons.lang3.time.DateUtils.addDays(now, -7); +// String s = DateUtil.formatDate(startDate); +// list.add(s); + for (int i = 1; i < 8; i++) { + Date date = org.apache.commons.lang3.time.DateUtils.addDays(now, -i); + String s = DateUtil.formatDate(date); + list.add(s); + } + return list; + } + + public static List getCurrentDatePeakHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + list.add(today + " 07"); + list.add(today + " 08"); + list.add(today + " 09"); + list.add(today + " 17"); + list.add(today + " 18"); + list.add(today + " 19"); + return list; + } + + public static List getCurrentDateWorkHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + for (int i = 6; i < 24; i++) { + if (i < 10) { + list.add(today + " 0" + i); + } else { + list.add(today + " " + i); + } + } + return list; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java index 5c7f422..1ab4be7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java @@ -26,7 +26,7 @@ private Session session; private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); - private static Map sessionPool = new HashMap(); + private static Map sessionPool = new HashMap<>(); @OnOpen public void onOpen(Session session, @PathParam(value = "userId") String userId) { diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index b50b497..d6a3fcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @Description: 设备service @@ -55,4 +58,10 @@ int updateBatchGateGroupStatus(List deviceCodes, String status); int updateDeviceInfoBatch(List acsDeviceList); + + List getDeviceStatusGroup(); + + Map>> getCameraMap(String keywords, List positionIds, List areaIds); + + DeviceInfo deviceInfoByDrawNo(String drawNo); } 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 5fd9e32..0b31726 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 @@ -23,7 +23,7 @@ Object deleteStaffInfo(StaffInfo staffInfo); - Object deleteBatchStaffInfo(List ids); + Object deleteBatchStaffInfo(List ids, List faceIds); List addStaffInfoBatch(List results); @@ -34,4 +34,6 @@ int saveCardInfo(StaffCardRequest staffCardRequest); int updateStaffInfoBatch(List personList); + + Object getStaffPicture(String staffCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java index 2ba97b0..89bd933 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java @@ -16,4 +16,6 @@ List visitInfoListPage(Page page, VisitorRequest visitorRequest); VisitInfo visitInfoDetail(String id); + + String getVisitorPicture(VisitInfo visitInfo); } 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 981b4cd..ea6b8c0 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 @@ -8,10 +8,8 @@ import com.casic.missiles.modular.dao.BlackInfoMapper; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; import com.casic.missiles.modular.dto.BlackInfoRequest; -import com.casic.missiles.modular.dto.hik.FaceDeletionBatchRequest; -import com.casic.missiles.modular.dto.hik.FaceInfo; -import com.casic.missiles.modular.dto.hik.FacePic; -import com.casic.missiles.modular.dto.hik.FaceSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.BlackInfo; @@ -86,6 +84,10 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); + //数据库照片存海康的人脸url + JSONObject facePicture = (JSONObject)dataJson.get("facePic"); + String faceUrl = facePicture.getString("faceUrl"); + blackInfo.setPicture(faceUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -157,4 +159,19 @@ } return ResponseData.error("批量删除黑名单异常"); } + + + @Override + public Object getBlackPicture(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/service/impl/CaseInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java index 7a25099..6b03d8b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java @@ -132,4 +132,21 @@ public boolean insertCaseInfoBatch(List caseInfos) { return this.saveBatch(caseInfos); } + + @Override + public List caseInfoList(CaseInfoRequest caseInfoRequest) { + try { + List pageList = caseInfoMapper.getCaseInfoList(caseInfoRequest); + pageList.forEach(caseInfo ->{ + caseInfo.setStatusName(dictService.getDictNameByCode(SecurityEventDict.CASE_STATUS, caseInfo.getStatus())); + caseInfo.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, caseInfo.getPosition())); + caseInfo.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, caseInfo.getArea())); + caseInfo.setIsKeyAreaName(dictService.getDictNameByCode(SecurityEventDict.IS_KEY_AREA, caseInfo.getIsKeyArea())); + }); + return pageList; + } catch (DataAccessException ex) { + log.error("安防事件: 查询不分页出现异常, 异常:{}", ex); + } + return null; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java index 2608ba8..94308db 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java @@ -13,6 +13,7 @@ import com.casic.missiles.modular.dao.GroupDeviceMapper; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -21,11 +22,13 @@ import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.GroupDeviceService; 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.dao.DataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -133,11 +136,15 @@ @Override @Transactional(rollbackFor = Exception.class) public List addDeviceInfoBatch(List results) { + List collect = results.stream().filter(result -> + StringUtils.isNotEmpty(result.getIndexCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "设备导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(results)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; - results.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -157,7 +164,6 @@ // return; // } // } - if (StrUtil.isNotEmpty(busConcentrator.getInstallTime())) { try { new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(busConcentrator.getInstallTime()); @@ -173,7 +179,7 @@ if (CollectionUtil.isNotEmpty(list)) { return list; } - this.saveBatch(results); + this.saveBatch(collect); } return list; } @@ -346,5 +352,82 @@ return deviceInfoMapper.updateDeviceInfoBatch(acsDeviceList); } + @Override + public List getDeviceStatusGroup() { + List deviceStatusDTOS = deviceInfoMapper.selectDeviceStatusGroupByStatus(); + if(CollectionUtils.isEmpty(deviceStatusDTOS)){ + return new ArrayList<>(); + } + for (DeviceStatusDTO deviceStatusDTO : deviceStatusDTOS) { + String dictNameByCode = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, deviceStatusDTO.getStatus()); + deviceStatusDTO.setStatusName(dictNameByCode); + } + return deviceStatusDTOS; + } + + @Override + public Map>> getCameraMap(String keywords, List positionIds, List areaIds) { + Map>> map = new HashMap<>(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like("dev_name", keywords); + wrapper.like("dev_code", keywords); + if(!CollectionUtils.isEmpty(positionIds)){ + wrapper.in("position", positionIds); + } + if(!CollectionUtils.isEmpty(areaIds)){ + wrapper.in("area", areaIds); + } + wrapper.in("dev_type", Arrays.asList("2","3","4","5","6","7")); + List deviceInfos = deviceInfoMapper.selectList(wrapper); + + deviceInfos.forEach(cameraDTO -> { + cameraDTO.setPositionName(dictService.getDictNameByCode("devicePosition", cameraDTO.getPosition())); + cameraDTO.setAreaName(dictService.getDictNameByCode("deviceArea", cameraDTO.getArea())); + + if (map.containsKey(cameraDTO.getPositionName())) { + if (map.get(cameraDTO.getPositionName()).containsKey(cameraDTO.getAreaName())) { + map.get(cameraDTO.getPositionName()).get(cameraDTO.getAreaName()).add(cameraDTO); + } else { + map.get(cameraDTO.getPositionName()).put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + } + } else { + TreeMap> areaMap = new TreeMap<>(new Comparator() { + @Override + public int compare(String o1, String o2) { + if(o1.endsWith("F") && o2.endsWith("F")){ + String o1Str = o1.substring(0, o1.length()-1); + String o2Str = o2.substring(0, o2.length()-1); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + if(o1.startsWith("N") && o2.startsWith("N")){ + String o1Str = o1.substring(1, o1.length()); + String o2Str = o2.substring(1, o2.length()); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + return 0; + } + }); + areaMap.put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + map.put(cameraDTO.getPositionName(), areaMap); + } + }); + return map; + } + + @Override + public DeviceInfo deviceInfoByDrawNo(String drawNo) { + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("draw_no", drawNo); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java index a95fff2..e3dff1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -107,6 +108,9 @@ ); return; } + if(StringUtils.isEmpty(busConcentrator.getEquipCode())){ + return; + } if (StrUtil.isNotEmpty(busConcentrator.getProductDate())) { try { new SimpleDateFormat("yyyy-MM-dd").parse(busConcentrator.getProductDate()); 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 ff60402..8ed53d9 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 @@ -5,10 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.core.application.service.AbstractDictService; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.DeviceInfoMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; -import com.casic.missiles.modular.dao.VisitInfoMapper; +import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.*; import com.casic.missiles.modular.service.HikService; @@ -16,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.HashMap; @@ -47,6 +45,9 @@ @Autowired private DeviceInfoMapper deviceInfoMapper; + @Autowired + private CaseInfoMapper caseInfoMapper; + @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -59,7 +60,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息"); + log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -69,6 +70,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -84,7 +86,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到离岗事件,但数据库中无该事件发生的设备信息"); + log.info("接收到离岗事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -94,6 +96,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -109,7 +112,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息"); + log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -119,6 +122,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -135,7 +139,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -145,6 +149,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -157,22 +162,29 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void monitorPointOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return; } // TODO: 2022/7/28 设备在线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(0).getCode()); - if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + int upDevFlag = deviceInfoMapper.updateById(deviceInfo); + + //更新该设备离线事件的解决状态(status=3) + caseInfoMapper.updateStatusByIndexCode(srcIndex); + + if(upDevFlag <= 0){ log.error("海康回调,更新监控点在线状态失败!"); } } @Override + @Transactional(rollbackFor = Exception.class) public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -185,7 +197,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -195,6 +207,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -208,6 +221,7 @@ @Override + @Transactional(rollbackFor = Exception.class) public void deviceOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); @@ -232,7 +246,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息"); + log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -242,10 +256,12 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @Override + @Transactional(rollbackFor = Exception.class) public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -291,6 +307,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void securityPersonnelHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -336,6 +353,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorRegisterHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -367,6 +385,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorCheckOutHandle(JSONObject event) { JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("endTime")); 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 c2714f5..decc60c 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,18 +9,15 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.StaffInfoMapper; import com.casic.missiles.modular.dto.StaffInfoRequest; -import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; -import com.casic.missiles.modular.dto.hik.PersonListDTO; -import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; -import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.dto.hik.*; 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.util.Base64Util; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DataAccessException; @@ -59,10 +57,9 @@ public List staffInfoListPage(Page page, StaffInfoRequest staffInfoRequest) { try { List pageList = staffInfoMapper.getStaffInfoListPage(page, staffInfoRequest); - pageList.forEach(staffInfo -> { + pageList.parallelStream().forEach(staffInfo -> { staffInfo.setStaffTypeName(dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, staffInfo.getStaffType())); - String base64 = Base64Util.transformPictureToBase64(uploadPath + staffInfo.getPicture()); - staffInfo.setPicture(base64); + staffInfo.setPicture(getPictureFromHik(staffInfo.getStaffCode())); }); return pageList; } catch (DataAccessException ex) { @@ -174,7 +171,7 @@ @Override @Transactional(rollbackFor = Exception.class) - public Object deleteBatchStaffInfo(List ids) { + public Object deleteBatchStaffInfo(List ids, List faceIds) { List staffInfos = staffInfoMapper.selectBatchIds(ids); List staffCodes = staffInfos.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); PersonBatchDeleteRequest personBatchDeleteRequest = new PersonBatchDeleteRequest(); @@ -186,6 +183,17 @@ log.error("请求海康,批量删除人员失败,海康response:{}", resultStr); return ResponseData.error("批量删除人员失败"); } + //批量删除人脸 + faceIds.parallelStream().forEach(faceId -> { + PersonBatchDeleteRequest personBatchDeleteRequest2 = new PersonBatchDeleteRequest(); + personBatchDeleteRequest2.setFaceId(faceId); + 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); + } + }); if(staffInfoMapper.deleteBatchIds(ids) > 0){ return ResponseData.success(); } @@ -195,12 +203,16 @@ @Override @Transactional(rollbackFor = Exception.class) public List addStaffInfoBatch(List staffInfos) { + List collect = staffInfos.stream().filter(result -> + StringUtils.isNotEmpty(result.getStaffCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "员工导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(staffInfos)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; List personList = new ArrayList<>(); - staffInfos.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -228,7 +240,7 @@ personSingleAddOrUpdateRequest.setCertificateNo(busConcentrator.getStaffIdCard()); personList.add(personSingleAddOrUpdateRequest); }); - List alreadyList = staffInfoMapper.selectBatchCodes(staffInfos); + List alreadyList = staffInfoMapper.selectBatchCodes(collect); if(CollectionUtil.isNotEmpty(alreadyList)){ List staffCodes = alreadyList.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); list.add("员工staffCode:" + staffCodes + "数据已存在!"); @@ -245,7 +257,7 @@ list.add("批量添加人员失败"); } //批量保存到数据库 - this.saveBatch(staffInfos); + this.saveBatch(collect); } return list; } @@ -292,4 +304,50 @@ public int updateStaffInfoBatch(List personList) { return staffInfoMapper.updateStaffInfoBatch(personList); } + + @Override + public Object getStaffPicture(String staffCode) { + //获取员工详细信息,含图片服务器、uri + String url = getPictureFromHik(staffCode); + return ResponseData.success(url); + } + + private String getPictureFromHik(String staffCode) { + 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 ""; + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + if(Objects.isNull(data)){ + return ""; + } + JSONArray dataArray = (JSONArray) data.get("list"); + if(0 == dataArray.size()){ + return ""; + } + 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 pictureFromHik = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + if(StringUtils.isNotEmpty(pictureFromHik) && !pictureFromHik.startsWith("http")){ + return "https://192.168.10.2:443" + pictureFromHik; + } + return pictureFromHik; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java index 39618ea..42e68ab 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java @@ -1,13 +1,17 @@ package com.casic.missiles.modular.service.impl; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dao.VisitInfoMapper; import com.casic.missiles.modular.dto.VisitorRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.VisitInfo; import com.casic.missiles.modular.service.VisitService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; @@ -50,4 +54,15 @@ VisitInfo visitInfo = visitInfoMapper.selectById(id); return visitInfo; } + + @Override + public String getVisitorPicture(VisitInfo visitInfo) { + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(visitInfo.getPicUri()); + picRequest.setServerIndexCode(visitInfo.getServerIndexCode()); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + return HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java index 191ef79..109eec2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java @@ -1,12 +1,15 @@ package com.casic.missiles.modular.util; +import cn.hutool.core.date.DateUtil; import javafx.util.Pair; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.List; /** * Created by Administrator on 2015/2/25. @@ -113,4 +116,85 @@ calendar.add(Calendar.DATE, -2); return sdf_day.format(calendar.getTime()); } + + public static List getCurrentDateWeekList() { + List list = new ArrayList<>(); + //获取当前日期前30天的日期 + Date now = new Date(); + Date startDate = org.apache.commons.lang3.time.DateUtils.addDays(now, -30); + //获取30天前对应的当前年的第几周 + int startWeek = cn.hutool.core.date.DateUtil.weekOfYear(startDate); + int endWeek = cn.hutool.core.date.DateUtil.weekOfYear(now); + int year = cn.hutool.core.date.DateUtil.thisYear(); + for (int i = startWeek; i < endWeek + 1; i++) { + list.add("" + year + "-" + i); + } + return list; + } + + public static List getCurrentDateHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + for (int i = 0; i < 24; i++) { + if (i < 10) { + list.add(today + " 0" + i); + } else { + list.add(today + " " + i); + } + } + return list; + } + + public static List getCurrentDateMonthList() { + List list = new ArrayList<>(); + int year = cn.hutool.core.date.DateUtil.thisYear(); + for (int i = 1; i < 13; i++) { + if (i < 10) { + list.add("" + year + "-0" + i); + } else { + list.add("" + year + "-" + i); + } + } + return list; + } + + public static List getCurrentDateDayList() { + List list = new ArrayList<>(); + //获取当前日期前7天的日期 + Date now = new Date(); +// Date startDate = org.apache.commons.lang3.time.DateUtils.addDays(now, -7); +// String s = DateUtil.formatDate(startDate); +// list.add(s); + for (int i = 1; i < 8; i++) { + Date date = org.apache.commons.lang3.time.DateUtils.addDays(now, -i); + String s = DateUtil.formatDate(date); + list.add(s); + } + return list; + } + + public static List getCurrentDatePeakHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + list.add(today + " 07"); + list.add(today + " 08"); + list.add(today + " 09"); + list.add(today + " 17"); + list.add(today + " 18"); + list.add(today + " 19"); + return list; + } + + public static List getCurrentDateWorkHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + for (int i = 6; i < 24; i++) { + if (i < 10) { + list.add(today + " 0" + i); + } else { + list.add(today + " " + i); + } + } + return list; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java index 5c7f422..1ab4be7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java @@ -26,7 +26,7 @@ private Session session; private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); - private static Map sessionPool = new HashMap(); + private static Map sessionPool = new HashMap<>(); @OnOpen public void onOpen(Session session, @PathParam(value = "userId") String userId) { diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 835aeb4..f436857 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/**,/eventRcv/**,/hik/**,/staffInfo/**,/**/listPage,/**/list + no-login-urls: /websocket/**,${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,/**/drawNo,/socket/repost #flowable数据源和多数据源配置 db: init: diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index b50b497..d6a3fcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @Description: 设备service @@ -55,4 +58,10 @@ int updateBatchGateGroupStatus(List deviceCodes, String status); int updateDeviceInfoBatch(List acsDeviceList); + + List getDeviceStatusGroup(); + + Map>> getCameraMap(String keywords, List positionIds, List areaIds); + + DeviceInfo deviceInfoByDrawNo(String drawNo); } 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 5fd9e32..0b31726 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 @@ -23,7 +23,7 @@ Object deleteStaffInfo(StaffInfo staffInfo); - Object deleteBatchStaffInfo(List ids); + Object deleteBatchStaffInfo(List ids, List faceIds); List addStaffInfoBatch(List results); @@ -34,4 +34,6 @@ int saveCardInfo(StaffCardRequest staffCardRequest); int updateStaffInfoBatch(List personList); + + Object getStaffPicture(String staffCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java index 2ba97b0..89bd933 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java @@ -16,4 +16,6 @@ List visitInfoListPage(Page page, VisitorRequest visitorRequest); VisitInfo visitInfoDetail(String id); + + String getVisitorPicture(VisitInfo visitInfo); } 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 981b4cd..ea6b8c0 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 @@ -8,10 +8,8 @@ import com.casic.missiles.modular.dao.BlackInfoMapper; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; import com.casic.missiles.modular.dto.BlackInfoRequest; -import com.casic.missiles.modular.dto.hik.FaceDeletionBatchRequest; -import com.casic.missiles.modular.dto.hik.FaceInfo; -import com.casic.missiles.modular.dto.hik.FacePic; -import com.casic.missiles.modular.dto.hik.FaceSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.BlackInfo; @@ -86,6 +84,10 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); + //数据库照片存海康的人脸url + JSONObject facePicture = (JSONObject)dataJson.get("facePic"); + String faceUrl = facePicture.getString("faceUrl"); + blackInfo.setPicture(faceUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -157,4 +159,19 @@ } return ResponseData.error("批量删除黑名单异常"); } + + + @Override + public Object getBlackPicture(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/service/impl/CaseInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java index 7a25099..6b03d8b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java @@ -132,4 +132,21 @@ public boolean insertCaseInfoBatch(List caseInfos) { return this.saveBatch(caseInfos); } + + @Override + public List caseInfoList(CaseInfoRequest caseInfoRequest) { + try { + List pageList = caseInfoMapper.getCaseInfoList(caseInfoRequest); + pageList.forEach(caseInfo ->{ + caseInfo.setStatusName(dictService.getDictNameByCode(SecurityEventDict.CASE_STATUS, caseInfo.getStatus())); + caseInfo.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, caseInfo.getPosition())); + caseInfo.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, caseInfo.getArea())); + caseInfo.setIsKeyAreaName(dictService.getDictNameByCode(SecurityEventDict.IS_KEY_AREA, caseInfo.getIsKeyArea())); + }); + return pageList; + } catch (DataAccessException ex) { + log.error("安防事件: 查询不分页出现异常, 异常:{}", ex); + } + return null; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java index 2608ba8..94308db 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java @@ -13,6 +13,7 @@ import com.casic.missiles.modular.dao.GroupDeviceMapper; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -21,11 +22,13 @@ import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.GroupDeviceService; 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.dao.DataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -133,11 +136,15 @@ @Override @Transactional(rollbackFor = Exception.class) public List addDeviceInfoBatch(List results) { + List collect = results.stream().filter(result -> + StringUtils.isNotEmpty(result.getIndexCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "设备导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(results)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; - results.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -157,7 +164,6 @@ // return; // } // } - if (StrUtil.isNotEmpty(busConcentrator.getInstallTime())) { try { new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(busConcentrator.getInstallTime()); @@ -173,7 +179,7 @@ if (CollectionUtil.isNotEmpty(list)) { return list; } - this.saveBatch(results); + this.saveBatch(collect); } return list; } @@ -346,5 +352,82 @@ return deviceInfoMapper.updateDeviceInfoBatch(acsDeviceList); } + @Override + public List getDeviceStatusGroup() { + List deviceStatusDTOS = deviceInfoMapper.selectDeviceStatusGroupByStatus(); + if(CollectionUtils.isEmpty(deviceStatusDTOS)){ + return new ArrayList<>(); + } + for (DeviceStatusDTO deviceStatusDTO : deviceStatusDTOS) { + String dictNameByCode = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, deviceStatusDTO.getStatus()); + deviceStatusDTO.setStatusName(dictNameByCode); + } + return deviceStatusDTOS; + } + + @Override + public Map>> getCameraMap(String keywords, List positionIds, List areaIds) { + Map>> map = new HashMap<>(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like("dev_name", keywords); + wrapper.like("dev_code", keywords); + if(!CollectionUtils.isEmpty(positionIds)){ + wrapper.in("position", positionIds); + } + if(!CollectionUtils.isEmpty(areaIds)){ + wrapper.in("area", areaIds); + } + wrapper.in("dev_type", Arrays.asList("2","3","4","5","6","7")); + List deviceInfos = deviceInfoMapper.selectList(wrapper); + + deviceInfos.forEach(cameraDTO -> { + cameraDTO.setPositionName(dictService.getDictNameByCode("devicePosition", cameraDTO.getPosition())); + cameraDTO.setAreaName(dictService.getDictNameByCode("deviceArea", cameraDTO.getArea())); + + if (map.containsKey(cameraDTO.getPositionName())) { + if (map.get(cameraDTO.getPositionName()).containsKey(cameraDTO.getAreaName())) { + map.get(cameraDTO.getPositionName()).get(cameraDTO.getAreaName()).add(cameraDTO); + } else { + map.get(cameraDTO.getPositionName()).put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + } + } else { + TreeMap> areaMap = new TreeMap<>(new Comparator() { + @Override + public int compare(String o1, String o2) { + if(o1.endsWith("F") && o2.endsWith("F")){ + String o1Str = o1.substring(0, o1.length()-1); + String o2Str = o2.substring(0, o2.length()-1); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + if(o1.startsWith("N") && o2.startsWith("N")){ + String o1Str = o1.substring(1, o1.length()); + String o2Str = o2.substring(1, o2.length()); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + return 0; + } + }); + areaMap.put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + map.put(cameraDTO.getPositionName(), areaMap); + } + }); + return map; + } + + @Override + public DeviceInfo deviceInfoByDrawNo(String drawNo) { + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("draw_no", drawNo); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java index a95fff2..e3dff1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -107,6 +108,9 @@ ); return; } + if(StringUtils.isEmpty(busConcentrator.getEquipCode())){ + return; + } if (StrUtil.isNotEmpty(busConcentrator.getProductDate())) { try { new SimpleDateFormat("yyyy-MM-dd").parse(busConcentrator.getProductDate()); 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 ff60402..8ed53d9 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 @@ -5,10 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.core.application.service.AbstractDictService; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.DeviceInfoMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; -import com.casic.missiles.modular.dao.VisitInfoMapper; +import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.*; import com.casic.missiles.modular.service.HikService; @@ -16,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.HashMap; @@ -47,6 +45,9 @@ @Autowired private DeviceInfoMapper deviceInfoMapper; + @Autowired + private CaseInfoMapper caseInfoMapper; + @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -59,7 +60,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息"); + log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -69,6 +70,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -84,7 +86,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到离岗事件,但数据库中无该事件发生的设备信息"); + log.info("接收到离岗事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -94,6 +96,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -109,7 +112,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息"); + log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -119,6 +122,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -135,7 +139,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -145,6 +149,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -157,22 +162,29 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void monitorPointOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return; } // TODO: 2022/7/28 设备在线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(0).getCode()); - if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + int upDevFlag = deviceInfoMapper.updateById(deviceInfo); + + //更新该设备离线事件的解决状态(status=3) + caseInfoMapper.updateStatusByIndexCode(srcIndex); + + if(upDevFlag <= 0){ log.error("海康回调,更新监控点在线状态失败!"); } } @Override + @Transactional(rollbackFor = Exception.class) public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -185,7 +197,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -195,6 +207,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -208,6 +221,7 @@ @Override + @Transactional(rollbackFor = Exception.class) public void deviceOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); @@ -232,7 +246,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息"); + log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -242,10 +256,12 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @Override + @Transactional(rollbackFor = Exception.class) public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -291,6 +307,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void securityPersonnelHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -336,6 +353,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorRegisterHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -367,6 +385,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorCheckOutHandle(JSONObject event) { JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("endTime")); 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 c2714f5..decc60c 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,18 +9,15 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.StaffInfoMapper; import com.casic.missiles.modular.dto.StaffInfoRequest; -import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; -import com.casic.missiles.modular.dto.hik.PersonListDTO; -import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; -import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.dto.hik.*; 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.util.Base64Util; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DataAccessException; @@ -59,10 +57,9 @@ public List staffInfoListPage(Page page, StaffInfoRequest staffInfoRequest) { try { List pageList = staffInfoMapper.getStaffInfoListPage(page, staffInfoRequest); - pageList.forEach(staffInfo -> { + pageList.parallelStream().forEach(staffInfo -> { staffInfo.setStaffTypeName(dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, staffInfo.getStaffType())); - String base64 = Base64Util.transformPictureToBase64(uploadPath + staffInfo.getPicture()); - staffInfo.setPicture(base64); + staffInfo.setPicture(getPictureFromHik(staffInfo.getStaffCode())); }); return pageList; } catch (DataAccessException ex) { @@ -174,7 +171,7 @@ @Override @Transactional(rollbackFor = Exception.class) - public Object deleteBatchStaffInfo(List ids) { + public Object deleteBatchStaffInfo(List ids, List faceIds) { List staffInfos = staffInfoMapper.selectBatchIds(ids); List staffCodes = staffInfos.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); PersonBatchDeleteRequest personBatchDeleteRequest = new PersonBatchDeleteRequest(); @@ -186,6 +183,17 @@ log.error("请求海康,批量删除人员失败,海康response:{}", resultStr); return ResponseData.error("批量删除人员失败"); } + //批量删除人脸 + faceIds.parallelStream().forEach(faceId -> { + PersonBatchDeleteRequest personBatchDeleteRequest2 = new PersonBatchDeleteRequest(); + personBatchDeleteRequest2.setFaceId(faceId); + 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); + } + }); if(staffInfoMapper.deleteBatchIds(ids) > 0){ return ResponseData.success(); } @@ -195,12 +203,16 @@ @Override @Transactional(rollbackFor = Exception.class) public List addStaffInfoBatch(List staffInfos) { + List collect = staffInfos.stream().filter(result -> + StringUtils.isNotEmpty(result.getStaffCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "员工导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(staffInfos)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; List personList = new ArrayList<>(); - staffInfos.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -228,7 +240,7 @@ personSingleAddOrUpdateRequest.setCertificateNo(busConcentrator.getStaffIdCard()); personList.add(personSingleAddOrUpdateRequest); }); - List alreadyList = staffInfoMapper.selectBatchCodes(staffInfos); + List alreadyList = staffInfoMapper.selectBatchCodes(collect); if(CollectionUtil.isNotEmpty(alreadyList)){ List staffCodes = alreadyList.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); list.add("员工staffCode:" + staffCodes + "数据已存在!"); @@ -245,7 +257,7 @@ list.add("批量添加人员失败"); } //批量保存到数据库 - this.saveBatch(staffInfos); + this.saveBatch(collect); } return list; } @@ -292,4 +304,50 @@ public int updateStaffInfoBatch(List personList) { return staffInfoMapper.updateStaffInfoBatch(personList); } + + @Override + public Object getStaffPicture(String staffCode) { + //获取员工详细信息,含图片服务器、uri + String url = getPictureFromHik(staffCode); + return ResponseData.success(url); + } + + private String getPictureFromHik(String staffCode) { + 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 ""; + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + if(Objects.isNull(data)){ + return ""; + } + JSONArray dataArray = (JSONArray) data.get("list"); + if(0 == dataArray.size()){ + return ""; + } + 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 pictureFromHik = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + if(StringUtils.isNotEmpty(pictureFromHik) && !pictureFromHik.startsWith("http")){ + return "https://192.168.10.2:443" + pictureFromHik; + } + return pictureFromHik; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java index 39618ea..42e68ab 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java @@ -1,13 +1,17 @@ package com.casic.missiles.modular.service.impl; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dao.VisitInfoMapper; import com.casic.missiles.modular.dto.VisitorRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.VisitInfo; import com.casic.missiles.modular.service.VisitService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; @@ -50,4 +54,15 @@ VisitInfo visitInfo = visitInfoMapper.selectById(id); return visitInfo; } + + @Override + public String getVisitorPicture(VisitInfo visitInfo) { + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(visitInfo.getPicUri()); + picRequest.setServerIndexCode(visitInfo.getServerIndexCode()); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + return HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java index 191ef79..109eec2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java @@ -1,12 +1,15 @@ package com.casic.missiles.modular.util; +import cn.hutool.core.date.DateUtil; import javafx.util.Pair; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.List; /** * Created by Administrator on 2015/2/25. @@ -113,4 +116,85 @@ calendar.add(Calendar.DATE, -2); return sdf_day.format(calendar.getTime()); } + + public static List getCurrentDateWeekList() { + List list = new ArrayList<>(); + //获取当前日期前30天的日期 + Date now = new Date(); + Date startDate = org.apache.commons.lang3.time.DateUtils.addDays(now, -30); + //获取30天前对应的当前年的第几周 + int startWeek = cn.hutool.core.date.DateUtil.weekOfYear(startDate); + int endWeek = cn.hutool.core.date.DateUtil.weekOfYear(now); + int year = cn.hutool.core.date.DateUtil.thisYear(); + for (int i = startWeek; i < endWeek + 1; i++) { + list.add("" + year + "-" + i); + } + return list; + } + + public static List getCurrentDateHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + for (int i = 0; i < 24; i++) { + if (i < 10) { + list.add(today + " 0" + i); + } else { + list.add(today + " " + i); + } + } + return list; + } + + public static List getCurrentDateMonthList() { + List list = new ArrayList<>(); + int year = cn.hutool.core.date.DateUtil.thisYear(); + for (int i = 1; i < 13; i++) { + if (i < 10) { + list.add("" + year + "-0" + i); + } else { + list.add("" + year + "-" + i); + } + } + return list; + } + + public static List getCurrentDateDayList() { + List list = new ArrayList<>(); + //获取当前日期前7天的日期 + Date now = new Date(); +// Date startDate = org.apache.commons.lang3.time.DateUtils.addDays(now, -7); +// String s = DateUtil.formatDate(startDate); +// list.add(s); + for (int i = 1; i < 8; i++) { + Date date = org.apache.commons.lang3.time.DateUtils.addDays(now, -i); + String s = DateUtil.formatDate(date); + list.add(s); + } + return list; + } + + public static List getCurrentDatePeakHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + list.add(today + " 07"); + list.add(today + " 08"); + list.add(today + " 09"); + list.add(today + " 17"); + list.add(today + " 18"); + list.add(today + " 19"); + return list; + } + + public static List getCurrentDateWorkHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + for (int i = 6; i < 24; i++) { + if (i < 10) { + list.add(today + " 0" + i); + } else { + list.add(today + " " + i); + } + } + return list; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java index 5c7f422..1ab4be7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java @@ -26,7 +26,7 @@ private Session session; private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); - private static Map sessionPool = new HashMap(); + private static Map sessionPool = new HashMap<>(); @OnOpen public void onOpen(Session session, @PathParam(value = "userId") String userId) { diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 835aeb4..f436857 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/**,/eventRcv/**,/hik/**,/staffInfo/**,/**/listPage,/**/list + no-login-urls: /websocket/**,${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,/**/drawNo,/socket/repost #flowable数据源和多数据源配置 db: init: diff --git a/casic-web/src/main/resources/config/application-prod.yml b/casic-web/src/main/resources/config/application-prod.yml index 3882020..ba83780 100644 --- a/casic-web/src/main/resources/config/application-prod.yml +++ b/casic-web/src/main/resources/config/application-prod.yml @@ -18,7 +18,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/**,/eventRcv/**,/hik/**,/staffInfo/**,/**/listPage,/**/list + no-login-urls: /websocket/**,${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,/**/drawNo,/socket/repost #flowable数据源和多数据源配置 db: init: diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index b50b497..d6a3fcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @Description: 设备service @@ -55,4 +58,10 @@ int updateBatchGateGroupStatus(List deviceCodes, String status); int updateDeviceInfoBatch(List acsDeviceList); + + List getDeviceStatusGroup(); + + Map>> getCameraMap(String keywords, List positionIds, List areaIds); + + DeviceInfo deviceInfoByDrawNo(String drawNo); } 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 5fd9e32..0b31726 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 @@ -23,7 +23,7 @@ Object deleteStaffInfo(StaffInfo staffInfo); - Object deleteBatchStaffInfo(List ids); + Object deleteBatchStaffInfo(List ids, List faceIds); List addStaffInfoBatch(List results); @@ -34,4 +34,6 @@ int saveCardInfo(StaffCardRequest staffCardRequest); int updateStaffInfoBatch(List personList); + + Object getStaffPicture(String staffCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java index 2ba97b0..89bd933 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java @@ -16,4 +16,6 @@ List visitInfoListPage(Page page, VisitorRequest visitorRequest); VisitInfo visitInfoDetail(String id); + + String getVisitorPicture(VisitInfo visitInfo); } 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 981b4cd..ea6b8c0 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 @@ -8,10 +8,8 @@ import com.casic.missiles.modular.dao.BlackInfoMapper; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; import com.casic.missiles.modular.dto.BlackInfoRequest; -import com.casic.missiles.modular.dto.hik.FaceDeletionBatchRequest; -import com.casic.missiles.modular.dto.hik.FaceInfo; -import com.casic.missiles.modular.dto.hik.FacePic; -import com.casic.missiles.modular.dto.hik.FaceSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.BlackInfo; @@ -86,6 +84,10 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); + //数据库照片存海康的人脸url + JSONObject facePicture = (JSONObject)dataJson.get("facePic"); + String faceUrl = facePicture.getString("faceUrl"); + blackInfo.setPicture(faceUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -157,4 +159,19 @@ } return ResponseData.error("批量删除黑名单异常"); } + + + @Override + public Object getBlackPicture(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/service/impl/CaseInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java index 7a25099..6b03d8b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java @@ -132,4 +132,21 @@ public boolean insertCaseInfoBatch(List caseInfos) { return this.saveBatch(caseInfos); } + + @Override + public List caseInfoList(CaseInfoRequest caseInfoRequest) { + try { + List pageList = caseInfoMapper.getCaseInfoList(caseInfoRequest); + pageList.forEach(caseInfo ->{ + caseInfo.setStatusName(dictService.getDictNameByCode(SecurityEventDict.CASE_STATUS, caseInfo.getStatus())); + caseInfo.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, caseInfo.getPosition())); + caseInfo.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, caseInfo.getArea())); + caseInfo.setIsKeyAreaName(dictService.getDictNameByCode(SecurityEventDict.IS_KEY_AREA, caseInfo.getIsKeyArea())); + }); + return pageList; + } catch (DataAccessException ex) { + log.error("安防事件: 查询不分页出现异常, 异常:{}", ex); + } + return null; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java index 2608ba8..94308db 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java @@ -13,6 +13,7 @@ import com.casic.missiles.modular.dao.GroupDeviceMapper; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -21,11 +22,13 @@ import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.GroupDeviceService; 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.dao.DataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -133,11 +136,15 @@ @Override @Transactional(rollbackFor = Exception.class) public List addDeviceInfoBatch(List results) { + List collect = results.stream().filter(result -> + StringUtils.isNotEmpty(result.getIndexCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "设备导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(results)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; - results.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -157,7 +164,6 @@ // return; // } // } - if (StrUtil.isNotEmpty(busConcentrator.getInstallTime())) { try { new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(busConcentrator.getInstallTime()); @@ -173,7 +179,7 @@ if (CollectionUtil.isNotEmpty(list)) { return list; } - this.saveBatch(results); + this.saveBatch(collect); } return list; } @@ -346,5 +352,82 @@ return deviceInfoMapper.updateDeviceInfoBatch(acsDeviceList); } + @Override + public List getDeviceStatusGroup() { + List deviceStatusDTOS = deviceInfoMapper.selectDeviceStatusGroupByStatus(); + if(CollectionUtils.isEmpty(deviceStatusDTOS)){ + return new ArrayList<>(); + } + for (DeviceStatusDTO deviceStatusDTO : deviceStatusDTOS) { + String dictNameByCode = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, deviceStatusDTO.getStatus()); + deviceStatusDTO.setStatusName(dictNameByCode); + } + return deviceStatusDTOS; + } + + @Override + public Map>> getCameraMap(String keywords, List positionIds, List areaIds) { + Map>> map = new HashMap<>(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like("dev_name", keywords); + wrapper.like("dev_code", keywords); + if(!CollectionUtils.isEmpty(positionIds)){ + wrapper.in("position", positionIds); + } + if(!CollectionUtils.isEmpty(areaIds)){ + wrapper.in("area", areaIds); + } + wrapper.in("dev_type", Arrays.asList("2","3","4","5","6","7")); + List deviceInfos = deviceInfoMapper.selectList(wrapper); + + deviceInfos.forEach(cameraDTO -> { + cameraDTO.setPositionName(dictService.getDictNameByCode("devicePosition", cameraDTO.getPosition())); + cameraDTO.setAreaName(dictService.getDictNameByCode("deviceArea", cameraDTO.getArea())); + + if (map.containsKey(cameraDTO.getPositionName())) { + if (map.get(cameraDTO.getPositionName()).containsKey(cameraDTO.getAreaName())) { + map.get(cameraDTO.getPositionName()).get(cameraDTO.getAreaName()).add(cameraDTO); + } else { + map.get(cameraDTO.getPositionName()).put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + } + } else { + TreeMap> areaMap = new TreeMap<>(new Comparator() { + @Override + public int compare(String o1, String o2) { + if(o1.endsWith("F") && o2.endsWith("F")){ + String o1Str = o1.substring(0, o1.length()-1); + String o2Str = o2.substring(0, o2.length()-1); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + if(o1.startsWith("N") && o2.startsWith("N")){ + String o1Str = o1.substring(1, o1.length()); + String o2Str = o2.substring(1, o2.length()); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + return 0; + } + }); + areaMap.put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + map.put(cameraDTO.getPositionName(), areaMap); + } + }); + return map; + } + + @Override + public DeviceInfo deviceInfoByDrawNo(String drawNo) { + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("draw_no", drawNo); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java index a95fff2..e3dff1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -107,6 +108,9 @@ ); return; } + if(StringUtils.isEmpty(busConcentrator.getEquipCode())){ + return; + } if (StrUtil.isNotEmpty(busConcentrator.getProductDate())) { try { new SimpleDateFormat("yyyy-MM-dd").parse(busConcentrator.getProductDate()); 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 ff60402..8ed53d9 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 @@ -5,10 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.core.application.service.AbstractDictService; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.DeviceInfoMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; -import com.casic.missiles.modular.dao.VisitInfoMapper; +import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.*; import com.casic.missiles.modular.service.HikService; @@ -16,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.HashMap; @@ -47,6 +45,9 @@ @Autowired private DeviceInfoMapper deviceInfoMapper; + @Autowired + private CaseInfoMapper caseInfoMapper; + @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -59,7 +60,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息"); + log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -69,6 +70,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -84,7 +86,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到离岗事件,但数据库中无该事件发生的设备信息"); + log.info("接收到离岗事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -94,6 +96,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -109,7 +112,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息"); + log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -119,6 +122,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -135,7 +139,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -145,6 +149,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -157,22 +162,29 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void monitorPointOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return; } // TODO: 2022/7/28 设备在线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(0).getCode()); - if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + int upDevFlag = deviceInfoMapper.updateById(deviceInfo); + + //更新该设备离线事件的解决状态(status=3) + caseInfoMapper.updateStatusByIndexCode(srcIndex); + + if(upDevFlag <= 0){ log.error("海康回调,更新监控点在线状态失败!"); } } @Override + @Transactional(rollbackFor = Exception.class) public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -185,7 +197,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -195,6 +207,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -208,6 +221,7 @@ @Override + @Transactional(rollbackFor = Exception.class) public void deviceOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); @@ -232,7 +246,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息"); + log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -242,10 +256,12 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @Override + @Transactional(rollbackFor = Exception.class) public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -291,6 +307,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void securityPersonnelHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -336,6 +353,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorRegisterHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -367,6 +385,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorCheckOutHandle(JSONObject event) { JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("endTime")); 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 c2714f5..decc60c 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,18 +9,15 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.StaffInfoMapper; import com.casic.missiles.modular.dto.StaffInfoRequest; -import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; -import com.casic.missiles.modular.dto.hik.PersonListDTO; -import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; -import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.dto.hik.*; 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.util.Base64Util; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DataAccessException; @@ -59,10 +57,9 @@ public List staffInfoListPage(Page page, StaffInfoRequest staffInfoRequest) { try { List pageList = staffInfoMapper.getStaffInfoListPage(page, staffInfoRequest); - pageList.forEach(staffInfo -> { + pageList.parallelStream().forEach(staffInfo -> { staffInfo.setStaffTypeName(dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, staffInfo.getStaffType())); - String base64 = Base64Util.transformPictureToBase64(uploadPath + staffInfo.getPicture()); - staffInfo.setPicture(base64); + staffInfo.setPicture(getPictureFromHik(staffInfo.getStaffCode())); }); return pageList; } catch (DataAccessException ex) { @@ -174,7 +171,7 @@ @Override @Transactional(rollbackFor = Exception.class) - public Object deleteBatchStaffInfo(List ids) { + public Object deleteBatchStaffInfo(List ids, List faceIds) { List staffInfos = staffInfoMapper.selectBatchIds(ids); List staffCodes = staffInfos.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); PersonBatchDeleteRequest personBatchDeleteRequest = new PersonBatchDeleteRequest(); @@ -186,6 +183,17 @@ log.error("请求海康,批量删除人员失败,海康response:{}", resultStr); return ResponseData.error("批量删除人员失败"); } + //批量删除人脸 + faceIds.parallelStream().forEach(faceId -> { + PersonBatchDeleteRequest personBatchDeleteRequest2 = new PersonBatchDeleteRequest(); + personBatchDeleteRequest2.setFaceId(faceId); + 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); + } + }); if(staffInfoMapper.deleteBatchIds(ids) > 0){ return ResponseData.success(); } @@ -195,12 +203,16 @@ @Override @Transactional(rollbackFor = Exception.class) public List addStaffInfoBatch(List staffInfos) { + List collect = staffInfos.stream().filter(result -> + StringUtils.isNotEmpty(result.getStaffCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "员工导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(staffInfos)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; List personList = new ArrayList<>(); - staffInfos.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -228,7 +240,7 @@ personSingleAddOrUpdateRequest.setCertificateNo(busConcentrator.getStaffIdCard()); personList.add(personSingleAddOrUpdateRequest); }); - List alreadyList = staffInfoMapper.selectBatchCodes(staffInfos); + List alreadyList = staffInfoMapper.selectBatchCodes(collect); if(CollectionUtil.isNotEmpty(alreadyList)){ List staffCodes = alreadyList.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); list.add("员工staffCode:" + staffCodes + "数据已存在!"); @@ -245,7 +257,7 @@ list.add("批量添加人员失败"); } //批量保存到数据库 - this.saveBatch(staffInfos); + this.saveBatch(collect); } return list; } @@ -292,4 +304,50 @@ public int updateStaffInfoBatch(List personList) { return staffInfoMapper.updateStaffInfoBatch(personList); } + + @Override + public Object getStaffPicture(String staffCode) { + //获取员工详细信息,含图片服务器、uri + String url = getPictureFromHik(staffCode); + return ResponseData.success(url); + } + + private String getPictureFromHik(String staffCode) { + 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 ""; + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + if(Objects.isNull(data)){ + return ""; + } + JSONArray dataArray = (JSONArray) data.get("list"); + if(0 == dataArray.size()){ + return ""; + } + 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 pictureFromHik = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + if(StringUtils.isNotEmpty(pictureFromHik) && !pictureFromHik.startsWith("http")){ + return "https://192.168.10.2:443" + pictureFromHik; + } + return pictureFromHik; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java index 39618ea..42e68ab 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java @@ -1,13 +1,17 @@ package com.casic.missiles.modular.service.impl; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dao.VisitInfoMapper; import com.casic.missiles.modular.dto.VisitorRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.VisitInfo; import com.casic.missiles.modular.service.VisitService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; @@ -50,4 +54,15 @@ VisitInfo visitInfo = visitInfoMapper.selectById(id); return visitInfo; } + + @Override + public String getVisitorPicture(VisitInfo visitInfo) { + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(visitInfo.getPicUri()); + picRequest.setServerIndexCode(visitInfo.getServerIndexCode()); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + return HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java index 191ef79..109eec2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java @@ -1,12 +1,15 @@ package com.casic.missiles.modular.util; +import cn.hutool.core.date.DateUtil; import javafx.util.Pair; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.List; /** * Created by Administrator on 2015/2/25. @@ -113,4 +116,85 @@ calendar.add(Calendar.DATE, -2); return sdf_day.format(calendar.getTime()); } + + public static List getCurrentDateWeekList() { + List list = new ArrayList<>(); + //获取当前日期前30天的日期 + Date now = new Date(); + Date startDate = org.apache.commons.lang3.time.DateUtils.addDays(now, -30); + //获取30天前对应的当前年的第几周 + int startWeek = cn.hutool.core.date.DateUtil.weekOfYear(startDate); + int endWeek = cn.hutool.core.date.DateUtil.weekOfYear(now); + int year = cn.hutool.core.date.DateUtil.thisYear(); + for (int i = startWeek; i < endWeek + 1; i++) { + list.add("" + year + "-" + i); + } + return list; + } + + public static List getCurrentDateHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + for (int i = 0; i < 24; i++) { + if (i < 10) { + list.add(today + " 0" + i); + } else { + list.add(today + " " + i); + } + } + return list; + } + + public static List getCurrentDateMonthList() { + List list = new ArrayList<>(); + int year = cn.hutool.core.date.DateUtil.thisYear(); + for (int i = 1; i < 13; i++) { + if (i < 10) { + list.add("" + year + "-0" + i); + } else { + list.add("" + year + "-" + i); + } + } + return list; + } + + public static List getCurrentDateDayList() { + List list = new ArrayList<>(); + //获取当前日期前7天的日期 + Date now = new Date(); +// Date startDate = org.apache.commons.lang3.time.DateUtils.addDays(now, -7); +// String s = DateUtil.formatDate(startDate); +// list.add(s); + for (int i = 1; i < 8; i++) { + Date date = org.apache.commons.lang3.time.DateUtils.addDays(now, -i); + String s = DateUtil.formatDate(date); + list.add(s); + } + return list; + } + + public static List getCurrentDatePeakHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + list.add(today + " 07"); + list.add(today + " 08"); + list.add(today + " 09"); + list.add(today + " 17"); + list.add(today + " 18"); + list.add(today + " 19"); + return list; + } + + public static List getCurrentDateWorkHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + for (int i = 6; i < 24; i++) { + if (i < 10) { + list.add(today + " 0" + i); + } else { + list.add(today + " " + i); + } + } + return list; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java index 5c7f422..1ab4be7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java @@ -26,7 +26,7 @@ private Session session; private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); - private static Map sessionPool = new HashMap(); + private static Map sessionPool = new HashMap<>(); @OnOpen public void onOpen(Session session, @PathParam(value = "userId") String userId) { diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 835aeb4..f436857 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/**,/eventRcv/**,/hik/**,/staffInfo/**,/**/listPage,/**/list + no-login-urls: /websocket/**,${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,/**/drawNo,/socket/repost #flowable数据源和多数据源配置 db: init: diff --git a/casic-web/src/main/resources/config/application-prod.yml b/casic-web/src/main/resources/config/application-prod.yml index 3882020..ba83780 100644 --- a/casic-web/src/main/resources/config/application-prod.yml +++ b/casic-web/src/main/resources/config/application-prod.yml @@ -18,7 +18,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/**,/eventRcv/**,/hik/**,/staffInfo/**,/**/listPage,/**/list + no-login-urls: /websocket/**,${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,/**/drawNo,/socket/repost #flowable数据源和多数据源配置 db: init: diff --git a/casic-web/src/main/resources/config/application-test.yml b/casic-web/src/main/resources/config/application-test.yml index fdfb535..3a787b1 100644 --- a/casic-web/src/main/resources/config/application-test.yml +++ b/casic-web/src/main/resources/config/application-test.yml @@ -14,7 +14,7 @@ # store-type: redis casic: # kaptcha-open: false #是否开启登录时验证码 (true/false) - nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/** + nologin-urls: /websocket/**,/user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/** #flowable数据源和多数据源配置 flowable: datasource: diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index b50b497..d6a3fcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @Description: 设备service @@ -55,4 +58,10 @@ int updateBatchGateGroupStatus(List deviceCodes, String status); int updateDeviceInfoBatch(List acsDeviceList); + + List getDeviceStatusGroup(); + + Map>> getCameraMap(String keywords, List positionIds, List areaIds); + + DeviceInfo deviceInfoByDrawNo(String drawNo); } 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 5fd9e32..0b31726 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 @@ -23,7 +23,7 @@ Object deleteStaffInfo(StaffInfo staffInfo); - Object deleteBatchStaffInfo(List ids); + Object deleteBatchStaffInfo(List ids, List faceIds); List addStaffInfoBatch(List results); @@ -34,4 +34,6 @@ int saveCardInfo(StaffCardRequest staffCardRequest); int updateStaffInfoBatch(List personList); + + Object getStaffPicture(String staffCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java index 2ba97b0..89bd933 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java @@ -16,4 +16,6 @@ List visitInfoListPage(Page page, VisitorRequest visitorRequest); VisitInfo visitInfoDetail(String id); + + String getVisitorPicture(VisitInfo visitInfo); } 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 981b4cd..ea6b8c0 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 @@ -8,10 +8,8 @@ import com.casic.missiles.modular.dao.BlackInfoMapper; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; import com.casic.missiles.modular.dto.BlackInfoRequest; -import com.casic.missiles.modular.dto.hik.FaceDeletionBatchRequest; -import com.casic.missiles.modular.dto.hik.FaceInfo; -import com.casic.missiles.modular.dto.hik.FacePic; -import com.casic.missiles.modular.dto.hik.FaceSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.BlackInfo; @@ -86,6 +84,10 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); + //数据库照片存海康的人脸url + JSONObject facePicture = (JSONObject)dataJson.get("facePic"); + String faceUrl = facePicture.getString("faceUrl"); + blackInfo.setPicture(faceUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -157,4 +159,19 @@ } return ResponseData.error("批量删除黑名单异常"); } + + + @Override + public Object getBlackPicture(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/service/impl/CaseInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java index 7a25099..6b03d8b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java @@ -132,4 +132,21 @@ public boolean insertCaseInfoBatch(List caseInfos) { return this.saveBatch(caseInfos); } + + @Override + public List caseInfoList(CaseInfoRequest caseInfoRequest) { + try { + List pageList = caseInfoMapper.getCaseInfoList(caseInfoRequest); + pageList.forEach(caseInfo ->{ + caseInfo.setStatusName(dictService.getDictNameByCode(SecurityEventDict.CASE_STATUS, caseInfo.getStatus())); + caseInfo.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, caseInfo.getPosition())); + caseInfo.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, caseInfo.getArea())); + caseInfo.setIsKeyAreaName(dictService.getDictNameByCode(SecurityEventDict.IS_KEY_AREA, caseInfo.getIsKeyArea())); + }); + return pageList; + } catch (DataAccessException ex) { + log.error("安防事件: 查询不分页出现异常, 异常:{}", ex); + } + return null; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java index 2608ba8..94308db 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java @@ -13,6 +13,7 @@ import com.casic.missiles.modular.dao.GroupDeviceMapper; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -21,11 +22,13 @@ import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.GroupDeviceService; 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.dao.DataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -133,11 +136,15 @@ @Override @Transactional(rollbackFor = Exception.class) public List addDeviceInfoBatch(List results) { + List collect = results.stream().filter(result -> + StringUtils.isNotEmpty(result.getIndexCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "设备导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(results)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; - results.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -157,7 +164,6 @@ // return; // } // } - if (StrUtil.isNotEmpty(busConcentrator.getInstallTime())) { try { new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(busConcentrator.getInstallTime()); @@ -173,7 +179,7 @@ if (CollectionUtil.isNotEmpty(list)) { return list; } - this.saveBatch(results); + this.saveBatch(collect); } return list; } @@ -346,5 +352,82 @@ return deviceInfoMapper.updateDeviceInfoBatch(acsDeviceList); } + @Override + public List getDeviceStatusGroup() { + List deviceStatusDTOS = deviceInfoMapper.selectDeviceStatusGroupByStatus(); + if(CollectionUtils.isEmpty(deviceStatusDTOS)){ + return new ArrayList<>(); + } + for (DeviceStatusDTO deviceStatusDTO : deviceStatusDTOS) { + String dictNameByCode = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, deviceStatusDTO.getStatus()); + deviceStatusDTO.setStatusName(dictNameByCode); + } + return deviceStatusDTOS; + } + + @Override + public Map>> getCameraMap(String keywords, List positionIds, List areaIds) { + Map>> map = new HashMap<>(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like("dev_name", keywords); + wrapper.like("dev_code", keywords); + if(!CollectionUtils.isEmpty(positionIds)){ + wrapper.in("position", positionIds); + } + if(!CollectionUtils.isEmpty(areaIds)){ + wrapper.in("area", areaIds); + } + wrapper.in("dev_type", Arrays.asList("2","3","4","5","6","7")); + List deviceInfos = deviceInfoMapper.selectList(wrapper); + + deviceInfos.forEach(cameraDTO -> { + cameraDTO.setPositionName(dictService.getDictNameByCode("devicePosition", cameraDTO.getPosition())); + cameraDTO.setAreaName(dictService.getDictNameByCode("deviceArea", cameraDTO.getArea())); + + if (map.containsKey(cameraDTO.getPositionName())) { + if (map.get(cameraDTO.getPositionName()).containsKey(cameraDTO.getAreaName())) { + map.get(cameraDTO.getPositionName()).get(cameraDTO.getAreaName()).add(cameraDTO); + } else { + map.get(cameraDTO.getPositionName()).put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + } + } else { + TreeMap> areaMap = new TreeMap<>(new Comparator() { + @Override + public int compare(String o1, String o2) { + if(o1.endsWith("F") && o2.endsWith("F")){ + String o1Str = o1.substring(0, o1.length()-1); + String o2Str = o2.substring(0, o2.length()-1); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + if(o1.startsWith("N") && o2.startsWith("N")){ + String o1Str = o1.substring(1, o1.length()); + String o2Str = o2.substring(1, o2.length()); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + return 0; + } + }); + areaMap.put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + map.put(cameraDTO.getPositionName(), areaMap); + } + }); + return map; + } + + @Override + public DeviceInfo deviceInfoByDrawNo(String drawNo) { + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("draw_no", drawNo); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java index a95fff2..e3dff1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -107,6 +108,9 @@ ); return; } + if(StringUtils.isEmpty(busConcentrator.getEquipCode())){ + return; + } if (StrUtil.isNotEmpty(busConcentrator.getProductDate())) { try { new SimpleDateFormat("yyyy-MM-dd").parse(busConcentrator.getProductDate()); 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 ff60402..8ed53d9 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 @@ -5,10 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.core.application.service.AbstractDictService; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.DeviceInfoMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; -import com.casic.missiles.modular.dao.VisitInfoMapper; +import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.*; import com.casic.missiles.modular.service.HikService; @@ -16,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.HashMap; @@ -47,6 +45,9 @@ @Autowired private DeviceInfoMapper deviceInfoMapper; + @Autowired + private CaseInfoMapper caseInfoMapper; + @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -59,7 +60,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息"); + log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -69,6 +70,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -84,7 +86,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到离岗事件,但数据库中无该事件发生的设备信息"); + log.info("接收到离岗事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -94,6 +96,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -109,7 +112,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息"); + log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -119,6 +122,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -135,7 +139,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -145,6 +149,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -157,22 +162,29 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void monitorPointOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return; } // TODO: 2022/7/28 设备在线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(0).getCode()); - if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + int upDevFlag = deviceInfoMapper.updateById(deviceInfo); + + //更新该设备离线事件的解决状态(status=3) + caseInfoMapper.updateStatusByIndexCode(srcIndex); + + if(upDevFlag <= 0){ log.error("海康回调,更新监控点在线状态失败!"); } } @Override + @Transactional(rollbackFor = Exception.class) public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -185,7 +197,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -195,6 +207,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -208,6 +221,7 @@ @Override + @Transactional(rollbackFor = Exception.class) public void deviceOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); @@ -232,7 +246,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息"); + log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -242,10 +256,12 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @Override + @Transactional(rollbackFor = Exception.class) public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -291,6 +307,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void securityPersonnelHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -336,6 +353,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorRegisterHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -367,6 +385,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorCheckOutHandle(JSONObject event) { JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("endTime")); 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 c2714f5..decc60c 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,18 +9,15 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.StaffInfoMapper; import com.casic.missiles.modular.dto.StaffInfoRequest; -import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; -import com.casic.missiles.modular.dto.hik.PersonListDTO; -import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; -import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.dto.hik.*; 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.util.Base64Util; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DataAccessException; @@ -59,10 +57,9 @@ public List staffInfoListPage(Page page, StaffInfoRequest staffInfoRequest) { try { List pageList = staffInfoMapper.getStaffInfoListPage(page, staffInfoRequest); - pageList.forEach(staffInfo -> { + pageList.parallelStream().forEach(staffInfo -> { staffInfo.setStaffTypeName(dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, staffInfo.getStaffType())); - String base64 = Base64Util.transformPictureToBase64(uploadPath + staffInfo.getPicture()); - staffInfo.setPicture(base64); + staffInfo.setPicture(getPictureFromHik(staffInfo.getStaffCode())); }); return pageList; } catch (DataAccessException ex) { @@ -174,7 +171,7 @@ @Override @Transactional(rollbackFor = Exception.class) - public Object deleteBatchStaffInfo(List ids) { + public Object deleteBatchStaffInfo(List ids, List faceIds) { List staffInfos = staffInfoMapper.selectBatchIds(ids); List staffCodes = staffInfos.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); PersonBatchDeleteRequest personBatchDeleteRequest = new PersonBatchDeleteRequest(); @@ -186,6 +183,17 @@ log.error("请求海康,批量删除人员失败,海康response:{}", resultStr); return ResponseData.error("批量删除人员失败"); } + //批量删除人脸 + faceIds.parallelStream().forEach(faceId -> { + PersonBatchDeleteRequest personBatchDeleteRequest2 = new PersonBatchDeleteRequest(); + personBatchDeleteRequest2.setFaceId(faceId); + 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); + } + }); if(staffInfoMapper.deleteBatchIds(ids) > 0){ return ResponseData.success(); } @@ -195,12 +203,16 @@ @Override @Transactional(rollbackFor = Exception.class) public List addStaffInfoBatch(List staffInfos) { + List collect = staffInfos.stream().filter(result -> + StringUtils.isNotEmpty(result.getStaffCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "员工导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(staffInfos)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; List personList = new ArrayList<>(); - staffInfos.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -228,7 +240,7 @@ personSingleAddOrUpdateRequest.setCertificateNo(busConcentrator.getStaffIdCard()); personList.add(personSingleAddOrUpdateRequest); }); - List alreadyList = staffInfoMapper.selectBatchCodes(staffInfos); + List alreadyList = staffInfoMapper.selectBatchCodes(collect); if(CollectionUtil.isNotEmpty(alreadyList)){ List staffCodes = alreadyList.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); list.add("员工staffCode:" + staffCodes + "数据已存在!"); @@ -245,7 +257,7 @@ list.add("批量添加人员失败"); } //批量保存到数据库 - this.saveBatch(staffInfos); + this.saveBatch(collect); } return list; } @@ -292,4 +304,50 @@ public int updateStaffInfoBatch(List personList) { return staffInfoMapper.updateStaffInfoBatch(personList); } + + @Override + public Object getStaffPicture(String staffCode) { + //获取员工详细信息,含图片服务器、uri + String url = getPictureFromHik(staffCode); + return ResponseData.success(url); + } + + private String getPictureFromHik(String staffCode) { + 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 ""; + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + if(Objects.isNull(data)){ + return ""; + } + JSONArray dataArray = (JSONArray) data.get("list"); + if(0 == dataArray.size()){ + return ""; + } + 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 pictureFromHik = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + if(StringUtils.isNotEmpty(pictureFromHik) && !pictureFromHik.startsWith("http")){ + return "https://192.168.10.2:443" + pictureFromHik; + } + return pictureFromHik; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java index 39618ea..42e68ab 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java @@ -1,13 +1,17 @@ package com.casic.missiles.modular.service.impl; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dao.VisitInfoMapper; import com.casic.missiles.modular.dto.VisitorRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.VisitInfo; import com.casic.missiles.modular.service.VisitService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; @@ -50,4 +54,15 @@ VisitInfo visitInfo = visitInfoMapper.selectById(id); return visitInfo; } + + @Override + public String getVisitorPicture(VisitInfo visitInfo) { + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(visitInfo.getPicUri()); + picRequest.setServerIndexCode(visitInfo.getServerIndexCode()); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + return HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java index 191ef79..109eec2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java @@ -1,12 +1,15 @@ package com.casic.missiles.modular.util; +import cn.hutool.core.date.DateUtil; import javafx.util.Pair; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.List; /** * Created by Administrator on 2015/2/25. @@ -113,4 +116,85 @@ calendar.add(Calendar.DATE, -2); return sdf_day.format(calendar.getTime()); } + + public static List getCurrentDateWeekList() { + List list = new ArrayList<>(); + //获取当前日期前30天的日期 + Date now = new Date(); + Date startDate = org.apache.commons.lang3.time.DateUtils.addDays(now, -30); + //获取30天前对应的当前年的第几周 + int startWeek = cn.hutool.core.date.DateUtil.weekOfYear(startDate); + int endWeek = cn.hutool.core.date.DateUtil.weekOfYear(now); + int year = cn.hutool.core.date.DateUtil.thisYear(); + for (int i = startWeek; i < endWeek + 1; i++) { + list.add("" + year + "-" + i); + } + return list; + } + + public static List getCurrentDateHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + for (int i = 0; i < 24; i++) { + if (i < 10) { + list.add(today + " 0" + i); + } else { + list.add(today + " " + i); + } + } + return list; + } + + public static List getCurrentDateMonthList() { + List list = new ArrayList<>(); + int year = cn.hutool.core.date.DateUtil.thisYear(); + for (int i = 1; i < 13; i++) { + if (i < 10) { + list.add("" + year + "-0" + i); + } else { + list.add("" + year + "-" + i); + } + } + return list; + } + + public static List getCurrentDateDayList() { + List list = new ArrayList<>(); + //获取当前日期前7天的日期 + Date now = new Date(); +// Date startDate = org.apache.commons.lang3.time.DateUtils.addDays(now, -7); +// String s = DateUtil.formatDate(startDate); +// list.add(s); + for (int i = 1; i < 8; i++) { + Date date = org.apache.commons.lang3.time.DateUtils.addDays(now, -i); + String s = DateUtil.formatDate(date); + list.add(s); + } + return list; + } + + public static List getCurrentDatePeakHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + list.add(today + " 07"); + list.add(today + " 08"); + list.add(today + " 09"); + list.add(today + " 17"); + list.add(today + " 18"); + list.add(today + " 19"); + return list; + } + + public static List getCurrentDateWorkHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + for (int i = 6; i < 24; i++) { + if (i < 10) { + list.add(today + " 0" + i); + } else { + list.add(today + " " + i); + } + } + return list; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java index 5c7f422..1ab4be7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java @@ -26,7 +26,7 @@ private Session session; private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); - private static Map sessionPool = new HashMap(); + private static Map sessionPool = new HashMap<>(); @OnOpen public void onOpen(Session session, @PathParam(value = "userId") String userId) { diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 835aeb4..f436857 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/**,/eventRcv/**,/hik/**,/staffInfo/**,/**/listPage,/**/list + no-login-urls: /websocket/**,${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,/**/drawNo,/socket/repost #flowable数据源和多数据源配置 db: init: diff --git a/casic-web/src/main/resources/config/application-prod.yml b/casic-web/src/main/resources/config/application-prod.yml index 3882020..ba83780 100644 --- a/casic-web/src/main/resources/config/application-prod.yml +++ b/casic-web/src/main/resources/config/application-prod.yml @@ -18,7 +18,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/**,/eventRcv/**,/hik/**,/staffInfo/**,/**/listPage,/**/list + no-login-urls: /websocket/**,${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,/**/drawNo,/socket/repost #flowable数据源和多数据源配置 db: init: diff --git a/casic-web/src/main/resources/config/application-test.yml b/casic-web/src/main/resources/config/application-test.yml index fdfb535..3a787b1 100644 --- a/casic-web/src/main/resources/config/application-test.yml +++ b/casic-web/src/main/resources/config/application-test.yml @@ -14,7 +14,7 @@ # store-type: redis casic: # kaptcha-open: false #是否开启登录时验证码 (true/false) - nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/** + nologin-urls: /websocket/**,/user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/** #flowable数据源和多数据源配置 flowable: datasource: diff --git a/casic-web/src/main/resources/config/export/CaseInfoTemp.xlsx b/casic-web/src/main/resources/config/export/CaseInfoTemp.xlsx index 3f0dbbe..bded6ce 100644 --- a/casic-web/src/main/resources/config/export/CaseInfoTemp.xlsx +++ b/casic-web/src/main/resources/config/export/CaseInfoTemp.xlsx Binary files differ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index b50b497..d6a3fcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @Description: 设备service @@ -55,4 +58,10 @@ int updateBatchGateGroupStatus(List deviceCodes, String status); int updateDeviceInfoBatch(List acsDeviceList); + + List getDeviceStatusGroup(); + + Map>> getCameraMap(String keywords, List positionIds, List areaIds); + + DeviceInfo deviceInfoByDrawNo(String drawNo); } 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 5fd9e32..0b31726 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 @@ -23,7 +23,7 @@ Object deleteStaffInfo(StaffInfo staffInfo); - Object deleteBatchStaffInfo(List ids); + Object deleteBatchStaffInfo(List ids, List faceIds); List addStaffInfoBatch(List results); @@ -34,4 +34,6 @@ int saveCardInfo(StaffCardRequest staffCardRequest); int updateStaffInfoBatch(List personList); + + Object getStaffPicture(String staffCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java index 2ba97b0..89bd933 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java @@ -16,4 +16,6 @@ List visitInfoListPage(Page page, VisitorRequest visitorRequest); VisitInfo visitInfoDetail(String id); + + String getVisitorPicture(VisitInfo visitInfo); } 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 981b4cd..ea6b8c0 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 @@ -8,10 +8,8 @@ import com.casic.missiles.modular.dao.BlackInfoMapper; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; import com.casic.missiles.modular.dto.BlackInfoRequest; -import com.casic.missiles.modular.dto.hik.FaceDeletionBatchRequest; -import com.casic.missiles.modular.dto.hik.FaceInfo; -import com.casic.missiles.modular.dto.hik.FacePic; -import com.casic.missiles.modular.dto.hik.FaceSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.BlackInfo; @@ -86,6 +84,10 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); + //数据库照片存海康的人脸url + JSONObject facePicture = (JSONObject)dataJson.get("facePic"); + String faceUrl = facePicture.getString("faceUrl"); + blackInfo.setPicture(faceUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -157,4 +159,19 @@ } return ResponseData.error("批量删除黑名单异常"); } + + + @Override + public Object getBlackPicture(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/service/impl/CaseInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java index 7a25099..6b03d8b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java @@ -132,4 +132,21 @@ public boolean insertCaseInfoBatch(List caseInfos) { return this.saveBatch(caseInfos); } + + @Override + public List caseInfoList(CaseInfoRequest caseInfoRequest) { + try { + List pageList = caseInfoMapper.getCaseInfoList(caseInfoRequest); + pageList.forEach(caseInfo ->{ + caseInfo.setStatusName(dictService.getDictNameByCode(SecurityEventDict.CASE_STATUS, caseInfo.getStatus())); + caseInfo.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, caseInfo.getPosition())); + caseInfo.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, caseInfo.getArea())); + caseInfo.setIsKeyAreaName(dictService.getDictNameByCode(SecurityEventDict.IS_KEY_AREA, caseInfo.getIsKeyArea())); + }); + return pageList; + } catch (DataAccessException ex) { + log.error("安防事件: 查询不分页出现异常, 异常:{}", ex); + } + return null; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java index 2608ba8..94308db 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java @@ -13,6 +13,7 @@ import com.casic.missiles.modular.dao.GroupDeviceMapper; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -21,11 +22,13 @@ import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.GroupDeviceService; 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.dao.DataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -133,11 +136,15 @@ @Override @Transactional(rollbackFor = Exception.class) public List addDeviceInfoBatch(List results) { + List collect = results.stream().filter(result -> + StringUtils.isNotEmpty(result.getIndexCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "设备导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(results)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; - results.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -157,7 +164,6 @@ // return; // } // } - if (StrUtil.isNotEmpty(busConcentrator.getInstallTime())) { try { new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(busConcentrator.getInstallTime()); @@ -173,7 +179,7 @@ if (CollectionUtil.isNotEmpty(list)) { return list; } - this.saveBatch(results); + this.saveBatch(collect); } return list; } @@ -346,5 +352,82 @@ return deviceInfoMapper.updateDeviceInfoBatch(acsDeviceList); } + @Override + public List getDeviceStatusGroup() { + List deviceStatusDTOS = deviceInfoMapper.selectDeviceStatusGroupByStatus(); + if(CollectionUtils.isEmpty(deviceStatusDTOS)){ + return new ArrayList<>(); + } + for (DeviceStatusDTO deviceStatusDTO : deviceStatusDTOS) { + String dictNameByCode = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, deviceStatusDTO.getStatus()); + deviceStatusDTO.setStatusName(dictNameByCode); + } + return deviceStatusDTOS; + } + + @Override + public Map>> getCameraMap(String keywords, List positionIds, List areaIds) { + Map>> map = new HashMap<>(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like("dev_name", keywords); + wrapper.like("dev_code", keywords); + if(!CollectionUtils.isEmpty(positionIds)){ + wrapper.in("position", positionIds); + } + if(!CollectionUtils.isEmpty(areaIds)){ + wrapper.in("area", areaIds); + } + wrapper.in("dev_type", Arrays.asList("2","3","4","5","6","7")); + List deviceInfos = deviceInfoMapper.selectList(wrapper); + + deviceInfos.forEach(cameraDTO -> { + cameraDTO.setPositionName(dictService.getDictNameByCode("devicePosition", cameraDTO.getPosition())); + cameraDTO.setAreaName(dictService.getDictNameByCode("deviceArea", cameraDTO.getArea())); + + if (map.containsKey(cameraDTO.getPositionName())) { + if (map.get(cameraDTO.getPositionName()).containsKey(cameraDTO.getAreaName())) { + map.get(cameraDTO.getPositionName()).get(cameraDTO.getAreaName()).add(cameraDTO); + } else { + map.get(cameraDTO.getPositionName()).put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + } + } else { + TreeMap> areaMap = new TreeMap<>(new Comparator() { + @Override + public int compare(String o1, String o2) { + if(o1.endsWith("F") && o2.endsWith("F")){ + String o1Str = o1.substring(0, o1.length()-1); + String o2Str = o2.substring(0, o2.length()-1); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + if(o1.startsWith("N") && o2.startsWith("N")){ + String o1Str = o1.substring(1, o1.length()); + String o2Str = o2.substring(1, o2.length()); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + return 0; + } + }); + areaMap.put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + map.put(cameraDTO.getPositionName(), areaMap); + } + }); + return map; + } + + @Override + public DeviceInfo deviceInfoByDrawNo(String drawNo) { + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("draw_no", drawNo); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java index a95fff2..e3dff1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -107,6 +108,9 @@ ); return; } + if(StringUtils.isEmpty(busConcentrator.getEquipCode())){ + return; + } if (StrUtil.isNotEmpty(busConcentrator.getProductDate())) { try { new SimpleDateFormat("yyyy-MM-dd").parse(busConcentrator.getProductDate()); 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 ff60402..8ed53d9 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 @@ -5,10 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.core.application.service.AbstractDictService; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.DeviceInfoMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; -import com.casic.missiles.modular.dao.VisitInfoMapper; +import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.*; import com.casic.missiles.modular.service.HikService; @@ -16,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.HashMap; @@ -47,6 +45,9 @@ @Autowired private DeviceInfoMapper deviceInfoMapper; + @Autowired + private CaseInfoMapper caseInfoMapper; + @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -59,7 +60,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息"); + log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -69,6 +70,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -84,7 +86,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到离岗事件,但数据库中无该事件发生的设备信息"); + log.info("接收到离岗事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -94,6 +96,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -109,7 +112,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息"); + log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -119,6 +122,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -135,7 +139,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -145,6 +149,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -157,22 +162,29 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void monitorPointOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return; } // TODO: 2022/7/28 设备在线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(0).getCode()); - if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + int upDevFlag = deviceInfoMapper.updateById(deviceInfo); + + //更新该设备离线事件的解决状态(status=3) + caseInfoMapper.updateStatusByIndexCode(srcIndex); + + if(upDevFlag <= 0){ log.error("海康回调,更新监控点在线状态失败!"); } } @Override + @Transactional(rollbackFor = Exception.class) public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -185,7 +197,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -195,6 +207,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -208,6 +221,7 @@ @Override + @Transactional(rollbackFor = Exception.class) public void deviceOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); @@ -232,7 +246,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息"); + log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -242,10 +256,12 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @Override + @Transactional(rollbackFor = Exception.class) public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -291,6 +307,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void securityPersonnelHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -336,6 +353,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorRegisterHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -367,6 +385,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorCheckOutHandle(JSONObject event) { JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("endTime")); 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 c2714f5..decc60c 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,18 +9,15 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.StaffInfoMapper; import com.casic.missiles.modular.dto.StaffInfoRequest; -import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; -import com.casic.missiles.modular.dto.hik.PersonListDTO; -import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; -import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.dto.hik.*; 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.util.Base64Util; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DataAccessException; @@ -59,10 +57,9 @@ public List staffInfoListPage(Page page, StaffInfoRequest staffInfoRequest) { try { List pageList = staffInfoMapper.getStaffInfoListPage(page, staffInfoRequest); - pageList.forEach(staffInfo -> { + pageList.parallelStream().forEach(staffInfo -> { staffInfo.setStaffTypeName(dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, staffInfo.getStaffType())); - String base64 = Base64Util.transformPictureToBase64(uploadPath + staffInfo.getPicture()); - staffInfo.setPicture(base64); + staffInfo.setPicture(getPictureFromHik(staffInfo.getStaffCode())); }); return pageList; } catch (DataAccessException ex) { @@ -174,7 +171,7 @@ @Override @Transactional(rollbackFor = Exception.class) - public Object deleteBatchStaffInfo(List ids) { + public Object deleteBatchStaffInfo(List ids, List faceIds) { List staffInfos = staffInfoMapper.selectBatchIds(ids); List staffCodes = staffInfos.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); PersonBatchDeleteRequest personBatchDeleteRequest = new PersonBatchDeleteRequest(); @@ -186,6 +183,17 @@ log.error("请求海康,批量删除人员失败,海康response:{}", resultStr); return ResponseData.error("批量删除人员失败"); } + //批量删除人脸 + faceIds.parallelStream().forEach(faceId -> { + PersonBatchDeleteRequest personBatchDeleteRequest2 = new PersonBatchDeleteRequest(); + personBatchDeleteRequest2.setFaceId(faceId); + 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); + } + }); if(staffInfoMapper.deleteBatchIds(ids) > 0){ return ResponseData.success(); } @@ -195,12 +203,16 @@ @Override @Transactional(rollbackFor = Exception.class) public List addStaffInfoBatch(List staffInfos) { + List collect = staffInfos.stream().filter(result -> + StringUtils.isNotEmpty(result.getStaffCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "员工导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(staffInfos)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; List personList = new ArrayList<>(); - staffInfos.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -228,7 +240,7 @@ personSingleAddOrUpdateRequest.setCertificateNo(busConcentrator.getStaffIdCard()); personList.add(personSingleAddOrUpdateRequest); }); - List alreadyList = staffInfoMapper.selectBatchCodes(staffInfos); + List alreadyList = staffInfoMapper.selectBatchCodes(collect); if(CollectionUtil.isNotEmpty(alreadyList)){ List staffCodes = alreadyList.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); list.add("员工staffCode:" + staffCodes + "数据已存在!"); @@ -245,7 +257,7 @@ list.add("批量添加人员失败"); } //批量保存到数据库 - this.saveBatch(staffInfos); + this.saveBatch(collect); } return list; } @@ -292,4 +304,50 @@ public int updateStaffInfoBatch(List personList) { return staffInfoMapper.updateStaffInfoBatch(personList); } + + @Override + public Object getStaffPicture(String staffCode) { + //获取员工详细信息,含图片服务器、uri + String url = getPictureFromHik(staffCode); + return ResponseData.success(url); + } + + private String getPictureFromHik(String staffCode) { + 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 ""; + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + if(Objects.isNull(data)){ + return ""; + } + JSONArray dataArray = (JSONArray) data.get("list"); + if(0 == dataArray.size()){ + return ""; + } + 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 pictureFromHik = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + if(StringUtils.isNotEmpty(pictureFromHik) && !pictureFromHik.startsWith("http")){ + return "https://192.168.10.2:443" + pictureFromHik; + } + return pictureFromHik; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java index 39618ea..42e68ab 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java @@ -1,13 +1,17 @@ package com.casic.missiles.modular.service.impl; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dao.VisitInfoMapper; import com.casic.missiles.modular.dto.VisitorRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.VisitInfo; import com.casic.missiles.modular.service.VisitService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; @@ -50,4 +54,15 @@ VisitInfo visitInfo = visitInfoMapper.selectById(id); return visitInfo; } + + @Override + public String getVisitorPicture(VisitInfo visitInfo) { + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(visitInfo.getPicUri()); + picRequest.setServerIndexCode(visitInfo.getServerIndexCode()); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + return HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java index 191ef79..109eec2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java @@ -1,12 +1,15 @@ package com.casic.missiles.modular.util; +import cn.hutool.core.date.DateUtil; import javafx.util.Pair; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.List; /** * Created by Administrator on 2015/2/25. @@ -113,4 +116,85 @@ calendar.add(Calendar.DATE, -2); return sdf_day.format(calendar.getTime()); } + + public static List getCurrentDateWeekList() { + List list = new ArrayList<>(); + //获取当前日期前30天的日期 + Date now = new Date(); + Date startDate = org.apache.commons.lang3.time.DateUtils.addDays(now, -30); + //获取30天前对应的当前年的第几周 + int startWeek = cn.hutool.core.date.DateUtil.weekOfYear(startDate); + int endWeek = cn.hutool.core.date.DateUtil.weekOfYear(now); + int year = cn.hutool.core.date.DateUtil.thisYear(); + for (int i = startWeek; i < endWeek + 1; i++) { + list.add("" + year + "-" + i); + } + return list; + } + + public static List getCurrentDateHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + for (int i = 0; i < 24; i++) { + if (i < 10) { + list.add(today + " 0" + i); + } else { + list.add(today + " " + i); + } + } + return list; + } + + public static List getCurrentDateMonthList() { + List list = new ArrayList<>(); + int year = cn.hutool.core.date.DateUtil.thisYear(); + for (int i = 1; i < 13; i++) { + if (i < 10) { + list.add("" + year + "-0" + i); + } else { + list.add("" + year + "-" + i); + } + } + return list; + } + + public static List getCurrentDateDayList() { + List list = new ArrayList<>(); + //获取当前日期前7天的日期 + Date now = new Date(); +// Date startDate = org.apache.commons.lang3.time.DateUtils.addDays(now, -7); +// String s = DateUtil.formatDate(startDate); +// list.add(s); + for (int i = 1; i < 8; i++) { + Date date = org.apache.commons.lang3.time.DateUtils.addDays(now, -i); + String s = DateUtil.formatDate(date); + list.add(s); + } + return list; + } + + public static List getCurrentDatePeakHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + list.add(today + " 07"); + list.add(today + " 08"); + list.add(today + " 09"); + list.add(today + " 17"); + list.add(today + " 18"); + list.add(today + " 19"); + return list; + } + + public static List getCurrentDateWorkHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + for (int i = 6; i < 24; i++) { + if (i < 10) { + list.add(today + " 0" + i); + } else { + list.add(today + " " + i); + } + } + return list; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java index 5c7f422..1ab4be7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java @@ -26,7 +26,7 @@ private Session session; private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); - private static Map sessionPool = new HashMap(); + private static Map sessionPool = new HashMap<>(); @OnOpen public void onOpen(Session session, @PathParam(value = "userId") String userId) { diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 835aeb4..f436857 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/**,/eventRcv/**,/hik/**,/staffInfo/**,/**/listPage,/**/list + no-login-urls: /websocket/**,${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,/**/drawNo,/socket/repost #flowable数据源和多数据源配置 db: init: diff --git a/casic-web/src/main/resources/config/application-prod.yml b/casic-web/src/main/resources/config/application-prod.yml index 3882020..ba83780 100644 --- a/casic-web/src/main/resources/config/application-prod.yml +++ b/casic-web/src/main/resources/config/application-prod.yml @@ -18,7 +18,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/**,/eventRcv/**,/hik/**,/staffInfo/**,/**/listPage,/**/list + no-login-urls: /websocket/**,${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,/**/drawNo,/socket/repost #flowable数据源和多数据源配置 db: init: diff --git a/casic-web/src/main/resources/config/application-test.yml b/casic-web/src/main/resources/config/application-test.yml index fdfb535..3a787b1 100644 --- a/casic-web/src/main/resources/config/application-test.yml +++ b/casic-web/src/main/resources/config/application-test.yml @@ -14,7 +14,7 @@ # store-type: redis casic: # kaptcha-open: false #是否开启登录时验证码 (true/false) - nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/** + nologin-urls: /websocket/**,/user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/** #flowable数据源和多数据源配置 flowable: datasource: diff --git a/casic-web/src/main/resources/config/export/CaseInfoTemp.xlsx b/casic-web/src/main/resources/config/export/CaseInfoTemp.xlsx index 3f0dbbe..bded6ce 100644 --- a/casic-web/src/main/resources/config/export/CaseInfoTemp.xlsx +++ b/casic-web/src/main/resources/config/export/CaseInfoTemp.xlsx Binary files differ diff --git a/casic-web/src/main/resources/config/export/DeviceTemp.xlsx b/casic-web/src/main/resources/config/export/DeviceTemp.xlsx index f701bdc..fd4233f 100644 --- a/casic-web/src/main/resources/config/export/DeviceTemp.xlsx +++ b/casic-web/src/main/resources/config/export/DeviceTemp.xlsx Binary files differ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index b50b497..d6a3fcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @Description: 设备service @@ -55,4 +58,10 @@ int updateBatchGateGroupStatus(List deviceCodes, String status); int updateDeviceInfoBatch(List acsDeviceList); + + List getDeviceStatusGroup(); + + Map>> getCameraMap(String keywords, List positionIds, List areaIds); + + DeviceInfo deviceInfoByDrawNo(String drawNo); } 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 5fd9e32..0b31726 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 @@ -23,7 +23,7 @@ Object deleteStaffInfo(StaffInfo staffInfo); - Object deleteBatchStaffInfo(List ids); + Object deleteBatchStaffInfo(List ids, List faceIds); List addStaffInfoBatch(List results); @@ -34,4 +34,6 @@ int saveCardInfo(StaffCardRequest staffCardRequest); int updateStaffInfoBatch(List personList); + + Object getStaffPicture(String staffCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java index 2ba97b0..89bd933 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java @@ -16,4 +16,6 @@ List visitInfoListPage(Page page, VisitorRequest visitorRequest); VisitInfo visitInfoDetail(String id); + + String getVisitorPicture(VisitInfo visitInfo); } 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 981b4cd..ea6b8c0 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 @@ -8,10 +8,8 @@ import com.casic.missiles.modular.dao.BlackInfoMapper; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; import com.casic.missiles.modular.dto.BlackInfoRequest; -import com.casic.missiles.modular.dto.hik.FaceDeletionBatchRequest; -import com.casic.missiles.modular.dto.hik.FaceInfo; -import com.casic.missiles.modular.dto.hik.FacePic; -import com.casic.missiles.modular.dto.hik.FaceSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.BlackInfo; @@ -86,6 +84,10 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); + //数据库照片存海康的人脸url + JSONObject facePicture = (JSONObject)dataJson.get("facePic"); + String faceUrl = facePicture.getString("faceUrl"); + blackInfo.setPicture(faceUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -157,4 +159,19 @@ } return ResponseData.error("批量删除黑名单异常"); } + + + @Override + public Object getBlackPicture(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/service/impl/CaseInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java index 7a25099..6b03d8b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java @@ -132,4 +132,21 @@ public boolean insertCaseInfoBatch(List caseInfos) { return this.saveBatch(caseInfos); } + + @Override + public List caseInfoList(CaseInfoRequest caseInfoRequest) { + try { + List pageList = caseInfoMapper.getCaseInfoList(caseInfoRequest); + pageList.forEach(caseInfo ->{ + caseInfo.setStatusName(dictService.getDictNameByCode(SecurityEventDict.CASE_STATUS, caseInfo.getStatus())); + caseInfo.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, caseInfo.getPosition())); + caseInfo.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, caseInfo.getArea())); + caseInfo.setIsKeyAreaName(dictService.getDictNameByCode(SecurityEventDict.IS_KEY_AREA, caseInfo.getIsKeyArea())); + }); + return pageList; + } catch (DataAccessException ex) { + log.error("安防事件: 查询不分页出现异常, 异常:{}", ex); + } + return null; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java index 2608ba8..94308db 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java @@ -13,6 +13,7 @@ import com.casic.missiles.modular.dao.GroupDeviceMapper; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -21,11 +22,13 @@ import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.GroupDeviceService; 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.dao.DataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -133,11 +136,15 @@ @Override @Transactional(rollbackFor = Exception.class) public List addDeviceInfoBatch(List results) { + List collect = results.stream().filter(result -> + StringUtils.isNotEmpty(result.getIndexCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "设备导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(results)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; - results.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -157,7 +164,6 @@ // return; // } // } - if (StrUtil.isNotEmpty(busConcentrator.getInstallTime())) { try { new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(busConcentrator.getInstallTime()); @@ -173,7 +179,7 @@ if (CollectionUtil.isNotEmpty(list)) { return list; } - this.saveBatch(results); + this.saveBatch(collect); } return list; } @@ -346,5 +352,82 @@ return deviceInfoMapper.updateDeviceInfoBatch(acsDeviceList); } + @Override + public List getDeviceStatusGroup() { + List deviceStatusDTOS = deviceInfoMapper.selectDeviceStatusGroupByStatus(); + if(CollectionUtils.isEmpty(deviceStatusDTOS)){ + return new ArrayList<>(); + } + for (DeviceStatusDTO deviceStatusDTO : deviceStatusDTOS) { + String dictNameByCode = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, deviceStatusDTO.getStatus()); + deviceStatusDTO.setStatusName(dictNameByCode); + } + return deviceStatusDTOS; + } + + @Override + public Map>> getCameraMap(String keywords, List positionIds, List areaIds) { + Map>> map = new HashMap<>(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like("dev_name", keywords); + wrapper.like("dev_code", keywords); + if(!CollectionUtils.isEmpty(positionIds)){ + wrapper.in("position", positionIds); + } + if(!CollectionUtils.isEmpty(areaIds)){ + wrapper.in("area", areaIds); + } + wrapper.in("dev_type", Arrays.asList("2","3","4","5","6","7")); + List deviceInfos = deviceInfoMapper.selectList(wrapper); + + deviceInfos.forEach(cameraDTO -> { + cameraDTO.setPositionName(dictService.getDictNameByCode("devicePosition", cameraDTO.getPosition())); + cameraDTO.setAreaName(dictService.getDictNameByCode("deviceArea", cameraDTO.getArea())); + + if (map.containsKey(cameraDTO.getPositionName())) { + if (map.get(cameraDTO.getPositionName()).containsKey(cameraDTO.getAreaName())) { + map.get(cameraDTO.getPositionName()).get(cameraDTO.getAreaName()).add(cameraDTO); + } else { + map.get(cameraDTO.getPositionName()).put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + } + } else { + TreeMap> areaMap = new TreeMap<>(new Comparator() { + @Override + public int compare(String o1, String o2) { + if(o1.endsWith("F") && o2.endsWith("F")){ + String o1Str = o1.substring(0, o1.length()-1); + String o2Str = o2.substring(0, o2.length()-1); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + if(o1.startsWith("N") && o2.startsWith("N")){ + String o1Str = o1.substring(1, o1.length()); + String o2Str = o2.substring(1, o2.length()); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + return 0; + } + }); + areaMap.put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + map.put(cameraDTO.getPositionName(), areaMap); + } + }); + return map; + } + + @Override + public DeviceInfo deviceInfoByDrawNo(String drawNo) { + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("draw_no", drawNo); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java index a95fff2..e3dff1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -107,6 +108,9 @@ ); return; } + if(StringUtils.isEmpty(busConcentrator.getEquipCode())){ + return; + } if (StrUtil.isNotEmpty(busConcentrator.getProductDate())) { try { new SimpleDateFormat("yyyy-MM-dd").parse(busConcentrator.getProductDate()); 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 ff60402..8ed53d9 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 @@ -5,10 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.core.application.service.AbstractDictService; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.DeviceInfoMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; -import com.casic.missiles.modular.dao.VisitInfoMapper; +import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.*; import com.casic.missiles.modular.service.HikService; @@ -16,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.HashMap; @@ -47,6 +45,9 @@ @Autowired private DeviceInfoMapper deviceInfoMapper; + @Autowired + private CaseInfoMapper caseInfoMapper; + @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -59,7 +60,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息"); + log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -69,6 +70,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -84,7 +86,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到离岗事件,但数据库中无该事件发生的设备信息"); + log.info("接收到离岗事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -94,6 +96,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -109,7 +112,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息"); + log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -119,6 +122,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -135,7 +139,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -145,6 +149,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -157,22 +162,29 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void monitorPointOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return; } // TODO: 2022/7/28 设备在线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(0).getCode()); - if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + int upDevFlag = deviceInfoMapper.updateById(deviceInfo); + + //更新该设备离线事件的解决状态(status=3) + caseInfoMapper.updateStatusByIndexCode(srcIndex); + + if(upDevFlag <= 0){ log.error("海康回调,更新监控点在线状态失败!"); } } @Override + @Transactional(rollbackFor = Exception.class) public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -185,7 +197,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -195,6 +207,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -208,6 +221,7 @@ @Override + @Transactional(rollbackFor = Exception.class) public void deviceOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); @@ -232,7 +246,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息"); + log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -242,10 +256,12 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @Override + @Transactional(rollbackFor = Exception.class) public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -291,6 +307,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void securityPersonnelHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -336,6 +353,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorRegisterHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -367,6 +385,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorCheckOutHandle(JSONObject event) { JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("endTime")); 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 c2714f5..decc60c 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,18 +9,15 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.StaffInfoMapper; import com.casic.missiles.modular.dto.StaffInfoRequest; -import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; -import com.casic.missiles.modular.dto.hik.PersonListDTO; -import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; -import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.dto.hik.*; 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.util.Base64Util; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DataAccessException; @@ -59,10 +57,9 @@ public List staffInfoListPage(Page page, StaffInfoRequest staffInfoRequest) { try { List pageList = staffInfoMapper.getStaffInfoListPage(page, staffInfoRequest); - pageList.forEach(staffInfo -> { + pageList.parallelStream().forEach(staffInfo -> { staffInfo.setStaffTypeName(dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, staffInfo.getStaffType())); - String base64 = Base64Util.transformPictureToBase64(uploadPath + staffInfo.getPicture()); - staffInfo.setPicture(base64); + staffInfo.setPicture(getPictureFromHik(staffInfo.getStaffCode())); }); return pageList; } catch (DataAccessException ex) { @@ -174,7 +171,7 @@ @Override @Transactional(rollbackFor = Exception.class) - public Object deleteBatchStaffInfo(List ids) { + public Object deleteBatchStaffInfo(List ids, List faceIds) { List staffInfos = staffInfoMapper.selectBatchIds(ids); List staffCodes = staffInfos.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); PersonBatchDeleteRequest personBatchDeleteRequest = new PersonBatchDeleteRequest(); @@ -186,6 +183,17 @@ log.error("请求海康,批量删除人员失败,海康response:{}", resultStr); return ResponseData.error("批量删除人员失败"); } + //批量删除人脸 + faceIds.parallelStream().forEach(faceId -> { + PersonBatchDeleteRequest personBatchDeleteRequest2 = new PersonBatchDeleteRequest(); + personBatchDeleteRequest2.setFaceId(faceId); + 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); + } + }); if(staffInfoMapper.deleteBatchIds(ids) > 0){ return ResponseData.success(); } @@ -195,12 +203,16 @@ @Override @Transactional(rollbackFor = Exception.class) public List addStaffInfoBatch(List staffInfos) { + List collect = staffInfos.stream().filter(result -> + StringUtils.isNotEmpty(result.getStaffCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "员工导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(staffInfos)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; List personList = new ArrayList<>(); - staffInfos.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -228,7 +240,7 @@ personSingleAddOrUpdateRequest.setCertificateNo(busConcentrator.getStaffIdCard()); personList.add(personSingleAddOrUpdateRequest); }); - List alreadyList = staffInfoMapper.selectBatchCodes(staffInfos); + List alreadyList = staffInfoMapper.selectBatchCodes(collect); if(CollectionUtil.isNotEmpty(alreadyList)){ List staffCodes = alreadyList.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); list.add("员工staffCode:" + staffCodes + "数据已存在!"); @@ -245,7 +257,7 @@ list.add("批量添加人员失败"); } //批量保存到数据库 - this.saveBatch(staffInfos); + this.saveBatch(collect); } return list; } @@ -292,4 +304,50 @@ public int updateStaffInfoBatch(List personList) { return staffInfoMapper.updateStaffInfoBatch(personList); } + + @Override + public Object getStaffPicture(String staffCode) { + //获取员工详细信息,含图片服务器、uri + String url = getPictureFromHik(staffCode); + return ResponseData.success(url); + } + + private String getPictureFromHik(String staffCode) { + 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 ""; + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + if(Objects.isNull(data)){ + return ""; + } + JSONArray dataArray = (JSONArray) data.get("list"); + if(0 == dataArray.size()){ + return ""; + } + 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 pictureFromHik = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + if(StringUtils.isNotEmpty(pictureFromHik) && !pictureFromHik.startsWith("http")){ + return "https://192.168.10.2:443" + pictureFromHik; + } + return pictureFromHik; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java index 39618ea..42e68ab 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java @@ -1,13 +1,17 @@ package com.casic.missiles.modular.service.impl; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dao.VisitInfoMapper; import com.casic.missiles.modular.dto.VisitorRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.VisitInfo; import com.casic.missiles.modular.service.VisitService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; @@ -50,4 +54,15 @@ VisitInfo visitInfo = visitInfoMapper.selectById(id); return visitInfo; } + + @Override + public String getVisitorPicture(VisitInfo visitInfo) { + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(visitInfo.getPicUri()); + picRequest.setServerIndexCode(visitInfo.getServerIndexCode()); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + return HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java index 191ef79..109eec2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java @@ -1,12 +1,15 @@ package com.casic.missiles.modular.util; +import cn.hutool.core.date.DateUtil; import javafx.util.Pair; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.List; /** * Created by Administrator on 2015/2/25. @@ -113,4 +116,85 @@ calendar.add(Calendar.DATE, -2); return sdf_day.format(calendar.getTime()); } + + public static List getCurrentDateWeekList() { + List list = new ArrayList<>(); + //获取当前日期前30天的日期 + Date now = new Date(); + Date startDate = org.apache.commons.lang3.time.DateUtils.addDays(now, -30); + //获取30天前对应的当前年的第几周 + int startWeek = cn.hutool.core.date.DateUtil.weekOfYear(startDate); + int endWeek = cn.hutool.core.date.DateUtil.weekOfYear(now); + int year = cn.hutool.core.date.DateUtil.thisYear(); + for (int i = startWeek; i < endWeek + 1; i++) { + list.add("" + year + "-" + i); + } + return list; + } + + public static List getCurrentDateHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + for (int i = 0; i < 24; i++) { + if (i < 10) { + list.add(today + " 0" + i); + } else { + list.add(today + " " + i); + } + } + return list; + } + + public static List getCurrentDateMonthList() { + List list = new ArrayList<>(); + int year = cn.hutool.core.date.DateUtil.thisYear(); + for (int i = 1; i < 13; i++) { + if (i < 10) { + list.add("" + year + "-0" + i); + } else { + list.add("" + year + "-" + i); + } + } + return list; + } + + public static List getCurrentDateDayList() { + List list = new ArrayList<>(); + //获取当前日期前7天的日期 + Date now = new Date(); +// Date startDate = org.apache.commons.lang3.time.DateUtils.addDays(now, -7); +// String s = DateUtil.formatDate(startDate); +// list.add(s); + for (int i = 1; i < 8; i++) { + Date date = org.apache.commons.lang3.time.DateUtils.addDays(now, -i); + String s = DateUtil.formatDate(date); + list.add(s); + } + return list; + } + + public static List getCurrentDatePeakHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + list.add(today + " 07"); + list.add(today + " 08"); + list.add(today + " 09"); + list.add(today + " 17"); + list.add(today + " 18"); + list.add(today + " 19"); + return list; + } + + public static List getCurrentDateWorkHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + for (int i = 6; i < 24; i++) { + if (i < 10) { + list.add(today + " 0" + i); + } else { + list.add(today + " " + i); + } + } + return list; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java index 5c7f422..1ab4be7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java @@ -26,7 +26,7 @@ private Session session; private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); - private static Map sessionPool = new HashMap(); + private static Map sessionPool = new HashMap<>(); @OnOpen public void onOpen(Session session, @PathParam(value = "userId") String userId) { diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 835aeb4..f436857 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/**,/eventRcv/**,/hik/**,/staffInfo/**,/**/listPage,/**/list + no-login-urls: /websocket/**,${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,/**/drawNo,/socket/repost #flowable数据源和多数据源配置 db: init: diff --git a/casic-web/src/main/resources/config/application-prod.yml b/casic-web/src/main/resources/config/application-prod.yml index 3882020..ba83780 100644 --- a/casic-web/src/main/resources/config/application-prod.yml +++ b/casic-web/src/main/resources/config/application-prod.yml @@ -18,7 +18,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/**,/eventRcv/**,/hik/**,/staffInfo/**,/**/listPage,/**/list + no-login-urls: /websocket/**,${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,/**/drawNo,/socket/repost #flowable数据源和多数据源配置 db: init: diff --git a/casic-web/src/main/resources/config/application-test.yml b/casic-web/src/main/resources/config/application-test.yml index fdfb535..3a787b1 100644 --- a/casic-web/src/main/resources/config/application-test.yml +++ b/casic-web/src/main/resources/config/application-test.yml @@ -14,7 +14,7 @@ # store-type: redis casic: # kaptcha-open: false #是否开启登录时验证码 (true/false) - nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/** + nologin-urls: /websocket/**,/user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/** #flowable数据源和多数据源配置 flowable: datasource: diff --git a/casic-web/src/main/resources/config/export/CaseInfoTemp.xlsx b/casic-web/src/main/resources/config/export/CaseInfoTemp.xlsx index 3f0dbbe..bded6ce 100644 --- a/casic-web/src/main/resources/config/export/CaseInfoTemp.xlsx +++ b/casic-web/src/main/resources/config/export/CaseInfoTemp.xlsx Binary files differ diff --git a/casic-web/src/main/resources/config/export/DeviceTemp.xlsx b/casic-web/src/main/resources/config/export/DeviceTemp.xlsx index f701bdc..fd4233f 100644 --- a/casic-web/src/main/resources/config/export/DeviceTemp.xlsx +++ b/casic-web/src/main/resources/config/export/DeviceTemp.xlsx Binary files differ diff --git a/casic-web/src/main/resources/config/export/StaffTemp.xlsx b/casic-web/src/main/resources/config/export/StaffTemp.xlsx new file mode 100644 index 0000000..12fe6cb --- /dev/null +++ b/casic-web/src/main/resources/config/export/StaffTemp.xlsx Binary files differ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java index c46f536..9fb1c5a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AssetInfoController.java @@ -31,7 +31,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody AssetInfoRequest assetInfoRequest) { + public Object list(AssetInfoRequest assetInfoRequest) { Page page = PageFactory.defaultPage(); List assetInfos = assetInfoService.assetInfoListPage(page, assetInfoRequest); page.setRecords(assetInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java index bf8c58c..6a2ed73 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/AttendanceController.java @@ -30,7 +30,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List attendanceInfos = attendanceService.attendanceInfoListPage(page, staffInfoRequest); page.setRecords(attendanceInfos); 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 0c06661..57c4fd7 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,18 +1,14 @@ 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.*; @@ -36,7 +32,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody BlackInfoRequest blackInfoRequest) { + public Object list(BlackInfoRequest blackInfoRequest) { Page page = PageFactory.defaultPage(); List blackInfos = blackInfoService.blackInfoListPage(page, blackInfoRequest); page.setRecords(blackInfos); @@ -67,16 +63,7 @@ @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); + return blackInfoService.getBlackPicture(blackPictureRequest); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java index 4a889af..bb42780 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CaseInfoController.java @@ -38,7 +38,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + public Object listPage(CaseInfoRequest caseInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = caseInfoService.caseInfoListPage(page, caseInfoRequest); page.setRecords(caseInfos); @@ -46,6 +46,16 @@ } /** + * 安防事件列表(不分页) + */ + @PostMapping("/list") + @ResponseBody + public Object list(@RequestBody CaseInfoRequest caseInfoRequest) { + List caseInfos = caseInfoService.caseInfoList(caseInfoRequest); + return ResponseData.success(caseInfos); + } + + /** * 编辑事件状态 */ @PostMapping("/update") diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java index 4c26a39..b27bc9f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/CategoryLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody CategoryLevelRequest categoryLevelRequest) { + public Object listPage(CategoryLevelRequest categoryLevelRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = categoryLevelService.categoryLevelListPage(page, categoryLevelRequest); page.setRecords(caseCategoryLevels); 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 666bbee..ad858b6 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 @@ -24,8 +24,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; -import java.util.ArrayList; -import java.util.List; +import java.util.*; /** * @Description: 设备管理Controller @@ -44,7 +43,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody DeviceInfoRequest deviceInfoRequest) { + public Object listPage(DeviceInfoRequest deviceInfoRequest) { Page page = PageFactory.defaultPage(); List deviceInfos = deviceInfoService.deviceInfoList(page, deviceInfoRequest); page.setRecords(deviceInfos); @@ -62,6 +61,75 @@ } /** + * 根据图纸编号查设备信息 + */ + @GetMapping("/drawNo") + @ResponseBody + public Object deviceDrawNo(String drawNo) { + DeviceInfo deviceInfo = deviceInfoService.deviceInfoByDrawNo(drawNo); + return ResponseData.success(deviceInfo); + } + + /** + * 获取摄像头设备列表树形结构 + */ + @PostMapping("/cameraList") + @ResponseBody + public Object cameraList(@RequestBody CameraListRequest cameraListRequest) { + String keywords = cameraListRequest.getKeywords(); + List positionIds = cameraListRequest.getPositionIds(); + List areaIds = cameraListRequest.getAreaIds(); + Map>> map = deviceInfoService.getCameraMap(keywords, positionIds, areaIds); + +// //二级为空处理 +// Map drMap = new HashMap<>(); +// List list = new ArrayList<>(); +// Iterator iterator = map.keySet().iterator(); +// while (iterator.hasNext()){ +// String key = iterator.next(); +// if(!CollectionUtils.isEmpty(map.get(key))){ +// map.get(key).keySet().forEach(drKey -> { +// if("".equals(drKey)){ +// Map> listMap1 = map.get(key); +// List deviceInfos = listMap1.get(""); +// drMap.put(key, deviceInfos); +//// map.remove(key); +// list.add(key); +// } +// }); +// } +// } +// if(!CollectionUtils.isEmpty(list)){ +// for (String s : list) { +// map.remove(s); +// } +// } +// drMap.putAll(map); + + List cameraTreeDTOList = new ArrayList<>(); + for (Map.Entry>> entry : map.entrySet()) { + CameraTreeDTO cameraTreeDTO = new CameraTreeDTO(); + cameraTreeDTO.setDevName(entry.getKey()); + + List cameraChildrenDTOList = new ArrayList<>(); + for (Map.Entry> _entry : entry.getValue().entrySet()) { + CameraChildrenDTO cameraChildrenDTO = new CameraChildrenDTO(); + cameraChildrenDTO.setDevName(_entry.getKey()); + + List cameraDTOList = new ArrayList<>(); + cameraDTOList.addAll(_entry.getValue()); + cameraChildrenDTO.setChildren(cameraDTOList); + + cameraChildrenDTOList.add(cameraChildrenDTO); + } + cameraTreeDTO.setChildren(cameraChildrenDTOList); + cameraTreeDTOList.add(cameraTreeDTO); + } + + return ResponseData.success(cameraTreeDTOList); + } + + /** * 设备增删改 */ @PostMapping("/{operation}") @@ -111,7 +179,7 @@ */ @PostMapping("/repair/listPage") @ResponseBody - public Object RepairListPage(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object RepairListPage(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); Page page = PageFactory.defaultPage(); Page pages = PageUtil.getPages((int) page.getCurrent(), (int) page.getSize(), deviceRepairLogDTOS); @@ -163,7 +231,7 @@ */ @PostMapping("/gateGroup/listPage") @ResponseBody - public Object gateGroupListPage(@RequestBody GateGroupRequest gateGroupRequest) { + public Object gateGroupListPage(GateGroupRequest gateGroupRequest) { Page page = PageFactory.defaultPage(); List list = deviceInfoService.gateGroupListPage(page, gateGroupRequest); page.setRecords(list); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java index a406eb6..f0130f6 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/FireEquipController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody FireEquipRequest fireEquipRequest) { + public Object listPage(FireEquipRequest fireEquipRequest) { Page page = PageFactory.defaultPage(); List fireEquipInfos = fireEquipService.fireEquipInfoListPage(page, fireEquipRequest); page.setRecords(fireEquipInfos); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java index 7da5894..3b6762e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/HazardLevelController.java @@ -28,7 +28,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody HazardLevelRequest hazardLevelRequest) { + public Object listPage(HazardLevelRequest hazardLevelRequest) { Page page = PageFactory.defaultPage(); List caseHazardLevels = hazardLevelService.hazardLevelListPage(page, hazardLevelRequest); page.setRecords(caseHazardLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java new file mode 100644 index 0000000..90ce183 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/SocketController.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.controller; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.dto.ReSocketRequest; +import com.casic.missiles.modular.util.WebSocket; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:52 + */ +@Slf4j +@RestController +@RequestMapping("/socket") +public class SocketController { + + @Autowired + private WebSocket webSocket; + + /** + * 转发socket(免登录) + */ + @PostMapping("/repost") + @ResponseBody + public Object listPage(@RequestBody ReSocketRequest reSocketRequest) { + webSocket.sendAllMessage(JSONObject.toJSONString(reSocketRequest)); + return ResponseData.success(); + } + +} 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 704093c..5845762 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,7 +2,6 @@ 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; @@ -10,7 +9,6 @@ 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; @@ -44,7 +42,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody StaffInfoRequest staffInfoRequest) { + public Object listPage(StaffInfoRequest staffInfoRequest) { Page page = PageFactory.defaultPage(); List caseInfos = staffInfoService.staffInfoListPage(page, staffInfoRequest); page.setRecords(caseInfos); @@ -75,7 +73,7 @@ }else if(OperateTypeEnum.DELETE.getOperateType().equals(operateType)){ return staffInfoService.deleteStaffInfo(staffInfo); }else if(OperateTypeEnum.BATCHDELETE.getOperateType().equals(operateType)){ - return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds()); + return staffInfoService.deleteBatchStaffInfo(staffInfo.getIds(), staffInfo.getFaceIds()); } return null; } @@ -139,37 +137,11 @@ /** * 获取员工照片,海康存储 + * 0917此接口前端不使用,列表接口中使用该接口中service方法 */ @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); + return staffInfoService.getStaffPicture(staffCode); } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java index d86dc30..974553d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorApplyController.java @@ -37,7 +37,7 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorApplyRequest applyRequest) { + public Object listPage(VisitorApplyRequest applyRequest) { Page page = PageFactory.defaultPage(); List caseCategoryLevels = visitorApplyService.visitorApplyListPage(page, applyRequest); page.setRecords(caseCategoryLevels); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java index 38f65b4..9fa00b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/VisitorController.java @@ -31,14 +31,17 @@ */ @PostMapping("/listPage") @ResponseBody - public Object listPage(@RequestBody VisitorRequest visitorRequest) { + public Object listPage(VisitorRequest visitorRequest) { Page page = PageFactory.defaultPage(); List visitorApplies = visitService.visitInfoListPage(page, visitorRequest); - visitorApplies.forEach(visitInfo -> { + visitorApplies.parallelStream().forEach(visitInfo -> { String orderId = visitInfo.getOrderId(); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); visitInfo.setFrequency(visitService.count(queryWrapper)); + //访客照片获取 + String pictureUrl = visitService.getVisitorPicture(visitInfo); + visitInfo.setPicUri(pictureUrl); }); page.setRecords(visitorApplies); return ResponseData.success(super.packForBT(page)); 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 b3fb825..131c98a 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 @@ -1,5 +1,6 @@ package com.casic.missiles.modular.controller.cockpit; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -15,6 +16,8 @@ import com.casic.missiles.modular.redis.RedisUtil; import com.casic.missiles.modular.redis.key.CacheKeys; import com.casic.missiles.modular.service.CockpitService; +import com.casic.missiles.modular.system.model.Dict; +import com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -77,11 +80,11 @@ private AccessGroupConfig accessGroupConfig; /** - * 各楼栋人数计算 + * 1、各楼栋人数计算 */ @GetMapping("/build/peopleNumber") @ResponseBody - public Object buildingPeopleNumber(){ + public Object buildingPeopleNumber() { //查询海康门禁点事件v2,只查询当天的,将返回的list中的所有进出类型进行计算,得到当天的人数 DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); @@ -90,26 +93,30 @@ HashMap jsonMap = new HashMap<>(); HashMap resultMap = new HashMap<>(); cockpitService.dataHandle(doorEventsRequest, configMap, jsonMap, resultMap); - if(resultMap.size() == 0){ - return ResponseData.error("无门禁点数据"); + + //空数据处理,按照配置文件组装返回结构 + if (resultMap.size() < configMap.size()) { + for (Long key : configMap.keySet()) { + resultMap.putIfAbsent(String.valueOf(key), 0); + } } return ResponseData.success(resultMap); } /** - * 每小时各楼栋人数 + * 3、每小时各楼栋人数 */ @GetMapping("/build/numberPerHour") @ResponseBody - public Object buildingNumberPerHour(){ + public Object buildingNumberPerHour() { //当天按小时分组的人数 List list = numberMapper.selectListByTime(); Map> collect = list.stream().collect(Collectors.groupingBy(BuildingNumberDTO::getStatisticTime)); //定时任务中已将每小时三栋楼人数存到数据库 //将一期主楼和录制楼人数合并,二期单算 List> resultList = new ArrayList<>(); - collect.keySet().forEach(key -> { + for (String key : collect.keySet()) { List buildingNumberDTOS = collect.get(key); BuildingNumberDTO mainBuildingOne = buildingNumberDTOS.get(0); BuildingNumberDTO mainBuildingTwo = buildingNumberDTOS.get(1); @@ -118,15 +125,15 @@ 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(mainBuildingOne.getStatisticPositionName() + "、" + recordingBuilding.getStatisticPositionName(), String.valueOf(oneQuantity + recordingQuantity)); resultMap.put(mainBuildingTwo.getStatisticPositionName(), mainBuildingTwo.getStatisticQuantity()); resultList.add(resultMap); - }); + } return ResponseData.success(resultList); } /** - * 今日访客量计算 + * 1、今日访客量计算 */ @GetMapping("/visitor/todayNumber") @ResponseBody @@ -140,7 +147,7 @@ } /** - * 计算设备总数及在线率 + * 2、计算设备总数及在线率 */ @GetMapping("/device/number") @ResponseBody @@ -156,12 +163,12 @@ String result = numberFormat.format((float) online / (float) total * 100); HashMap resultMap = new HashMap<>(); resultMap.put("设备总数", total); - resultMap.put("设备在线率", result+"%"); + resultMap.put("设备在线率", result + "%"); return ResponseData.success(resultMap); } /** - * 安保人员总数及安保人员离岗率 + * 27、安保人员总数及安保人员离岗率 */ @GetMapping("/staff/securityNumber") @ResponseBody @@ -178,54 +185,88 @@ numberFormat.setMaximumFractionDigits(2); String result = numberFormat.format((float) leave / (float) total * 100); HashMap resultMap = new HashMap<>(); - if(0 == total){ + if (0 == total) { resultMap.put("安保人员总数", 0); - resultMap.put("安保人员离岗率", "0%"); - }else{ + resultMap.put("安保人员离岗率", "0"); + } else { resultMap.put("安保人员总数", total); - resultMap.put("安保人员离岗率", result+"%"); + resultMap.put("安保人员离岗率", result + ""); } return ResponseData.success(resultMap); } /** - * 访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 + * 5、访客预约详情,按照访客访问目的字典进行分组,计算占总数的占比 */ @GetMapping("/visitor/applyDetail") @ResponseBody public Object visitorApplyDetail() { List reasonGroup = applyMapper.selectByVisitReason(); + List resultList = new ArrayList<>(); + //空数据处理 + List visitReason = dictService.findInDictByCode(SecurityEventDict.VISIT_REASON); + if (CollectionUtils.isEmpty(reasonGroup)) { + for (Dict dict : visitReason) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(dict.getName()); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + return ResponseData.success(resultList); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = reasonGroup.stream().collect(Collectors.summarizingInt(ApplyReasonGroupDTO::getQuantity)).getSum(); - if(0 == sum){ + 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); ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); applyReasonGroupDTO.setQuantity(group.getQuantity()); applyReasonGroupDTO.setVisitReason(reasonName); - applyReasonGroupDTO.setRatio(result+"%"); + applyReasonGroupDTO.setRatio(result + "%"); resultList.add(applyReasonGroupDTO); }); + //返回数据补全处理 + if (resultList.size() < visitReason.size()) { + List collect = resultList.stream().map(ApplyReasonGroupDTO::getVisitReason).collect(Collectors.toList()); + for (Dict dict : visitReason) { + String name = dict.getName(); + if (!collect.contains(name)) { + ApplyReasonGroupDTO applyReasonGroupDTO = new ApplyReasonGroupDTO(); + applyReasonGroupDTO.setQuantity(0); + applyReasonGroupDTO.setVisitReason(name); + applyReasonGroupDTO.setRatio("0%"); + resultList.add(applyReasonGroupDTO); + } + } + } return ResponseData.success(resultList); } /** - * 重点区域威胁事件历史统计,计算每个月的各级别事件的数量 + * 4、重点区域防控系数组件,重点区域威胁事件历史统计,计算每个月的各级别事件的数量 */ @PostMapping("/case/keyAreaStatistic") @ResponseBody public Object keyAreaEventStatistic(@RequestBody MonthAndLevelGroupDTO monthAndLevelGroupDTO) { + //查询各危险级别权重name,用于构造返回结构 + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + List nameList = caseHazardLevelList.stream().map(CaseHazardLevel::getName).collect(Collectors.toList()); + Object o = redisUtil.get(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear())); List list = JSONArray.parseArray(String.valueOf(o), MonthAndLevelGroupDTO.class); - if(!CollectionUtils.isEmpty(list)){ + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(list)) { Map> resultMap = list.stream().collect(Collectors.groupingBy(MonthAndLevelGroupDTO::getMonth)); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } //查询数据,放入redis List monthAndLevelGroup = caseInfoMapper.selectByLevelAndMonth(monthAndLevelGroupDTO.getYear()); @@ -235,39 +276,64 @@ .withMinute(0).withSecond(0).withNano(0); long between = ChronoUnit.SECONDS.between(LocalDateTime.now(), midnight); redisUtil.set(MessageFormat.format(CacheKeys.MONTH_STATISTIC_KEY, monthAndLevelGroupDTO.getYear()), JSONObject.toJSONString(monthAndLevelGroup), between); - return ResponseData.success(resultMap); + //构造返回结构 + List> results = getResultMap(nameList, resultList, resultMap); + results.stream().sorted(); + return ResponseData.success(results); } /** - * 安防事件类别统计 + * 14、安防事件类别统计 */ @GetMapping("/case/categoryStatistics") @ResponseBody public Object eventCategoryStatistics() { List categoryLevelGroup = caseInfoMapper.selectByCategoryLevel(); - categoryLevelGroup.forEach(group -> { - CaseCategoryLevel caseCategoryLevel = categoryLevelMapper.getCaseCategoryLevel(group.getCategoryLevelCode()); - group.setCategoryLevelName(caseCategoryLevel.getName()); - }); return ResponseData.success(categoryLevelGroup); } /** - * 消防器材类别统计 + * 33、消防器材类别统计 */ @GetMapping("/device/fireEquipStatistics") @ResponseBody public Object fireEquipStatistics() { List equipTypeGroup = fireEquipInfoMapper.selectByEquipType(); + //空数据处理 + List equipType = dictService.findInDictByCode(SecurityEventDict.EQUIP_TYPE); + if (CollectionUtils.isEmpty(equipTypeGroup)) { + for (Dict dict : equipType) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + return ResponseData.success(equipTypeGroup); + } equipTypeGroup.forEach(group -> { String equipTypeName = dictService.getDictNameByCode(SecurityEventDict.EQUIP_TYPE, group.getEquipTypeCode()); group.setEquipTypeName(equipTypeName); }); + //返回数据补全处理 + if (equipTypeGroup.size() < equipType.size()) { + List collect = equipTypeGroup.stream().map(EquipTypeGroupDTO::getEquipTypeCode).collect(Collectors.toList()); + for (Dict dict : equipType) { + String code = dict.getCode(); + if (!collect.contains(code)) { + EquipTypeGroupDTO equipTypeGroupDTO = new EquipTypeGroupDTO(); + equipTypeGroupDTO.setQuantity(0); + equipTypeGroupDTO.setEquipTypeCode(dict.getCode()); + equipTypeGroupDTO.setEquipTypeName(dict.getName()); + equipTypeGroup.add(equipTypeGroupDTO); + } + } + } return ResponseData.success(equipTypeGroup); } /** - * 机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 + * 9、机动力量实时在岗率,在岗人数除以总应在岗人数,用离岗+6小时内恢复为100%,6小时外再计算 */ @GetMapping("/staff/beOnDutyRatio") @ResponseBody @@ -276,61 +342,123 @@ wrapper.eq("staff_type", 2); // TODO: 2022/9/2 后续使用产品确定的每天出勤的安保人员的数量 Integer total = staffInfoMapper.selectCount(wrapper); - if(0 == total){ + if (0 == total) { return ResponseData.success(null); } + List currentDateHourList = DateUtils.getCurrentDateHourList(); //当日离岗事件按设备去重后的个数 // TODO: 2022/9/2 目前相当于24小时内的计算,之后看需要可改成自定义小时数计算离岗率,即离岗+6小时内仅一次离岗则恢复为100%,多次则累加离岗次数计算离岗率 List onDutyRatioDTOS = caseInfoMapper.selectDemobilizedCountByHour(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + //补全空数据 + if (CollectionUtils.isEmpty(onDutyRatioDTOS)) { + for (String date : currentDateHourList) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + return ResponseData.success(onDutyRatioDTOS); + } 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+"%"); + dto.setRatio(result + "%"); }); + //补全空数据 + List collect = onDutyRatioDTOS.stream().map(OnDutyRatioDTO::getDate).collect(Collectors.toList()); + for (String date : currentDateHourList) { + if (!collect.contains(date)) { + OnDutyRatioDTO onDutyRatioDTO = new OnDutyRatioDTO(); + onDutyRatioDTO.setDate(date); + onDutyRatioDTO.setRatio("0%"); + onDutyRatioDTO.setQuantity(String.valueOf(0)); + onDutyRatioDTOS.add(onDutyRatioDTO); + } + } return ResponseData.success(onDutyRatioDTOS); } /** - * 闸机速通门统计-设备状态分组计算数量,devType传闸机字典key + * 17、闸机速通门统计-设备状态分组计算数量,devType传闸机字典key * 视频频监控摄像机统计-设备状态分组计算数量,devType传摄像头字典key */ @PostMapping("/device/statistics") @ResponseBody public Object GateStatusStatistics(@RequestBody GateStatusGroupDTO gateStatusGroupDTO) { - List gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + List gateStatusGroup = null; + //2代表所有摄像头(对应字典2-7) + if ("2".equals(gateStatusGroupDTO.getDevType())) { + gateStatusGroup = deviceInfoMapper.selectByTypeForCamera(); + } else { + gateStatusGroup = deviceInfoMapper.selectByType(gateStatusGroupDTO.getDevType()); + } HashMap resultMap = new HashMap<>(); + //空数据处理 + List deviceStatus = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); + if (CollectionUtils.isEmpty(gateStatusGroup)) { + List resultList = new ArrayList<>(); + for (Dict dict : deviceStatus) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + resultMap.put("total", 0); + resultMap.put("list", resultList); + return ResponseData.success(resultMap); + } NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = gateStatusGroup.stream().collect(Collectors.summarizingInt(GateStatusGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("无该类设备信息"); } List resultList = new ArrayList<>(); gateStatusGroup.forEach(group -> { + if ("2".equals(gateStatusGroupDTO.getDevType())) { + group.setDevType("2"); + } String devStatus = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, group.getStatus()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); gateStatusGroupResponse.setStatus(devStatus); - gateStatusGroupResponse.setRatio(result+"%"); + gateStatusGroupResponse.setRatio(result + "%"); + gateStatusGroupResponse.setQuantity(group.getQuantity()); resultList.add(gateStatusGroupResponse); }); + //返回数据补全处理 + if (resultList.size() < deviceStatus.size()) { + List collect = resultList.stream().map(GateStatusGroupResponse::getStatus).collect(Collectors.toList()); + for (Dict dict : deviceStatus) { + String name = dict.getName(); + if (!collect.contains(name)) { + GateStatusGroupResponse gateStatusGroupResponse = new GateStatusGroupResponse(); + gateStatusGroupResponse.setStatus(dict.getName()); + gateStatusGroupResponse.setRatio("0%"); + gateStatusGroupResponse.setQuantity(0); + resultList.add(gateStatusGroupResponse); + } + } + } resultMap.put("total", sum); resultMap.put("list", resultList); return ResponseData.success(resultMap); } /** - * 安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + * 11、安全防护分析,设备加所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 * 0907需求变更:展示所有楼栋的所有楼层的评分 * 0908需求变更:展示所有楼栋的评分 */ @PostMapping("/device/securityScore") @ResponseBody public Object SecurityScore(@RequestBody SecurityScoreDTO securityScoreDTO) { - //按发生事件的设备所在的area划分计算评分,当天发生的事件 + //按发生事件的设备所在的position划分计算评分,当天发生的事件 String position = securityScoreDTO.getPosition(); List caseInfos = caseInfoMapper.selectByPosition(position); //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 @@ -353,7 +481,7 @@ String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); //每个事件的扣分 - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); securityScoreDTO1.setScore(score); securityScoreDTOs.add(securityScoreDTO1); }); @@ -362,8 +490,17 @@ List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) ).collect(Collectors.toList()); - Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); Map resultMap = new HashMap<>(); + //空数据处理 + List devicePosition = dictService.findInDictByCode(SecurityEventDict.DEVICE_POSITION); + if (CollectionUtils.isEmpty(collect2)) { + for (Dict dict : devicePosition) { + resultMap.put(dict.getName(), 100.0); + } + return ResponseData.success(resultMap); + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); collect.keySet().forEach(key -> { List list = collect.get(key); @@ -371,6 +508,16 @@ String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); resultMap.put(dictValue, 100 - collect1.getSum()); }); + //返回数据补全处理 + if (collect.size() < devicePosition.size()) { + Set strings = resultMap.keySet(); + for (Dict dict : devicePosition) { + String name = dict.getName(); + if (!strings.contains(name)) { + resultMap.put(dict.getName(), 100.0); + } + } + } //按楼层分组计算评分 // collect.keySet().forEach(key -> { // Map map = new HashMap<>(); @@ -387,20 +534,66 @@ } /** - * 安防事件时域性频次统计,统计每月安防事件个数 + * 10、安防事件时域性频次统计,统计每月安防事件个数 */ - @PostMapping("/device/securityFrequency") + @GetMapping("/device/securityFrequency") @ResponseBody - public Object SecurityFrequency(@RequestBody SecurityFrequencyDTO securityFrequencyDTO) { - String year = securityFrequencyDTO.getYear(); - String month = securityFrequencyDTO.getMonth(); - if(!StringUtils.isEmpty(year) && StringUtils.isEmpty(month)){ - Integer quantity = caseInfoMapper.selectCountByMonth(year, month); - securityFrequencyDTO.setQuantity(quantity); - return ResponseData.success(securityFrequencyDTO); + public Object SecurityFrequency() { + String year = String.valueOf(DateUtil.thisYear()); + String month = String.valueOf(DateUtil.thisMonth()); + Integer quantity = caseInfoMapper.selectCountByMonth(year, month); + SecurityFrequencyDTO securityFrequencyDTO = new SecurityFrequencyDTO(); + securityFrequencyDTO.setQuantity(quantity); + securityFrequencyDTO.setYear(year); + securityFrequencyDTO.setMonth(month); + return ResponseData.success(securityFrequencyDTO); + } + + /** + * 34、查询所在楼层评分,计算规则:发生安防事件*类别权重*级别权重算分 + */ + @PostMapping("/device/areaScore") + @ResponseBody + public Object areaScore(@RequestBody SecurityScoreDTO securityScoreDTO) { + //按发生事件的设备所在的area划分计算评分,当天发生的事件 + String position = securityScoreDTO.getPosition(); + String area = securityScoreDTO.getArea(); + if (StringUtils.isEmpty(position) || StringUtils.isEmpty(area)) { + return null; } - List list = caseInfoMapper.selectPreMonthCount(); - return ResponseData.success(list); + Map resultMap = new HashMap<>(); + List caseInfos = caseInfoMapper.selectByPositionAndArea(position, area); + if (Objects.isNull(caseInfos)) { + resultMap.put("安防评分", 100.0); + return ResponseData.success(resultMap); + } + //查询各危险级别权重、各类别权重,放入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()); + String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); + String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); + //每个事件的扣分 + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); + securityScoreDTO1.setScore(score); + securityScoreDTOs.add(securityScoreDTO1); + }); + DoubleSummaryStatistics collect = securityScoreDTOs.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + resultMap.put("安防评分", 100 - collect.getSum()); + return ResponseData.success(resultMap); } /** @@ -409,13 +602,13 @@ @PostMapping("/caseInfo/heatMap") @ResponseBody public Object HeatMap(@RequestBody HeatMapDTO heatMapDTO) { - if(!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())){ + if (!Objects.isNull(heatMapDTO) && Objects.isNull(heatMapDTO.getMinute())) { heatMapDTO.setMinute(3); } List caseInfoList = caseInfoMapper.selectPersonnelGatherByTime(heatMapDTO.getMinute(), SecurityEventType.PERSONNEL_GATHER_EVENT); Map> collect = caseInfoList.stream().collect(Collectors.groupingBy(CaseInfo::getIndexCode)); HashMap resultMap = new HashMap<>(); - if(CollectionUtils.isEmpty(collect)){ + if (CollectionUtils.isEmpty(collect)) { return ResponseData.success(); } collect.keySet().forEach(key -> { @@ -424,4 +617,42 @@ return ResponseData.success(resultMap); } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { + resultMap.keySet().forEach(key -> { + List monthAndLevelGroupDTOS = resultMap.get(key); + HashMap hashMap = new HashMap<>(); + for (MonthAndLevelGroupDTO andLevelGroupDTO : monthAndLevelGroupDTOS) { +// hashMap.put("年份", andLevelGroupDTO.getYear()); + hashMap.put("月份", Integer.valueOf(andLevelGroupDTO.getMonth())); + hashMap.put(andLevelGroupDTO.getLevelName(), String.valueOf(andLevelGroupDTO.getQuantity())); + } + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + }); + //12个月份,用于构造返回结构 + List list1 = new ArrayList<>(); + for (Map map : resultList) { + list1.add(String.valueOf(map.get("月份"))); + } + for (int i = 1; i < 13; i++) { + if (CollectionUtils.isEmpty(list1) || list1.contains(String.valueOf(i))) { + continue; + } + HashMap hashMap = new HashMap<>(); + hashMap.put("月份", i); + for (String s : nameList) { + if (!hashMap.keySet().contains(s)) { + hashMap.put(s, "0"); + } + } + resultList.add(hashMap); + } + List> results = resultList.stream().sorted(Comparator.comparingInt(e -> (int) e.get("月份"))).collect(Collectors.toList()); + return results; + } + } 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 da67d28..93c1949 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 @@ -2,18 +2,20 @@ import cn.hutool.core.date.DateUnit; import cn.hutool.core.date.DateUtil; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; 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.SecurityEventDict; 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 com.casic.missiles.modular.util.DateUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; @@ -24,6 +26,8 @@ import java.util.*; import java.util.stream.Collectors; +import static com.casic.missiles.modular.util.DateUtils.getCurrentDateDayList; + /** * @Description: 驾驶舱二级页面-物管信息 * @Author: wangpeng @@ -51,6 +55,9 @@ @Autowired private DeviceInfoService deviceInfoService; + @Autowired + private AbstractDictService dictService; + /** * 安防事件时域频次统计,每月的每天安防事件个数(原方案) * 月维度:展示每个月的每天的数据 @@ -69,28 +76,51 @@ } /** - * 安防事件时域频次统计,统计变为近365天/一个月/近7天 + * 12、安防事件时域频次统计,统计变为近365天/一个月/近7天 */ @PostMapping("/case/time/keyAreaStatistic/{dimension}") @ResponseBody public Object keyAreaData(@PathVariable("dimension") String dimension) { - List resultList = null; - if("year".equals(dimension)){ + List resultList = null; + List dateList = null; + if ("year".equals(dimension)) { //近365天数据按月分组统计 resultList = caseInfoMapper.selectPreMonthCountByNearYear(); - }else if("month".equals(dimension)) { + dateList = DateUtils.getCurrentDateMonthList(); + } else if ("month".equals(dimension)) { //近30天数据按周分组统计 resultList = caseInfoMapper.selectPreWeekCountByThirtyDay(); - }else if("week".equals(dimension)){ + dateList = DateUtils.getCurrentDateWeekList(); + } else if ("week".equals(dimension)) { //近7天数据按天分组统计 resultList = caseInfoMapper.selectPreDayCountBySevenDay(); + dateList = getCurrentDateDayList(); + } + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } else { + for (String date : dateList) { + List collect = resultList.stream().map(PreMonthOrWeekCaseDTO::getDimension).collect(Collectors.toList()); + if (!collect.contains(date)) { + PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); + preMonthOrWeekCaseDTO.setDimension(date); + preMonthOrWeekCaseDTO.setQuantity(0); + resultList.add(preMonthOrWeekCaseDTO); + } + } } return ResponseData.success(resultList); } /** - * 安防事件频域频次统计,每年的每月/每周各级别安防事件个数 + * 13、安防事件频域频次统计,每年的每月/每周各级别安防事件个数 * 年维度:展示平均每个月和每周的数据 */ @PostMapping("/case/frequency/keyAreaStatistic") @@ -104,15 +134,15 @@ 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()))){ + if (year.equals(String.valueOf(DateUtil.thisYear()))) { monthAndWeekDTO.setMonthQuantity(sum / DateUtil.thisMonth()); strAvgMap.put(key, monthAndWeekDTO); - }else{ + } else { monthAndWeekDTO.setMonthQuantity(sum / 12); strAvgMap.put(key, monthAndWeekDTO); } @@ -123,28 +153,28 @@ for (String key : collect1.keySet()) { List preMonthOrWeekCaseDTOS = collect.get(key); int sum = preMonthOrWeekCaseDTOS.stream().mapToInt(PreMonthOrWeekCaseDTO::getQuantity).sum(); - if(year.equals(String.valueOf(DateUtil.thisYear()))){ - if(!Objects.isNull(strAvgMap.get(key))){ + 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{ + } 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))){ + } 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{ + } else { MonthAndWeekDTO monthAndWeekDTO = new MonthAndWeekDTO(); String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); @@ -160,83 +190,121 @@ } /** - * 员工出勤率,优先级3 + * 18、员工出勤率,优先级3 * 物业/安保人员出勤人数除以物业/安保人员总数,一天有一次记录就算考勤 + * 0914变更为取消staffType入参,查询全 */ @PostMapping("/staff/attendanceRatio") @ResponseBody public Object attendanceRatio(@RequestBody AttendanceRatioDTO attendanceRatioDTO) { - //员工类型字典key - String staffType = attendanceRatioDTO.getStaffType(); + //各类型员工及总数 + List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + Map> typeNumMap = staffTypeAndSumDTOS.stream().collect(Collectors.groupingBy(StaffTypeAndSumDTO::getStaffType)); + String dateDimension = attendanceRatioDTO.getDateDimension(); List attendanceRatioDTOS = new ArrayList<>(); - //考勤的人数,按员工类型和单次考勤过滤 - if("week".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(staffType); - }else if("month".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(staffType); - }else if("year".equals(dateDimension)){ - attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(staffType); + //考勤的人数,按单次考勤过滤 + if ("week".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForWeek(); + } else if ("month".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForMonth(); + } else if ("year".equals(dateDimension)) { + attendanceRatioDTOS = attendanceInfoMapper.getCountByTypeAndDateForYear(); } - if(CollectionUtils.isEmpty(attendanceRatioDTOS)){ + if (CollectionUtils.isEmpty(attendanceRatioDTOS)) { return ResponseData.error("该查询条件下,无员工出勤数据!"); } - //该类型员工总数 - QueryWrapper wrapper = new QueryWrapper<>(); - wrapper.eq("staff_type", staffType); - Integer sum = staffInfoMapper.selectCount(wrapper); - if(sum <= 0){ - return ResponseData.error("该查询条件下,员工管理中无该类型员工数据!"); - } - NumberFormat numberFormat = NumberFormat.getInstance(); // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); //计算出勤率 - attendanceRatioDTOS.forEach(attendanceRatio -> { - attendanceRatio.setDateDimension(dateDimension); - attendanceRatio.setStaffType(staffType); - String ratio = numberFormat.format((float) attendanceRatio.getQuantity() / (float) sum * 100); - attendanceRatio.setAttendanceRatio(ratio+"%"); + + List> resultList = new ArrayList<>(); + Map> dateMap = attendanceRatioDTOS.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); + dateMap.keySet().forEach(key -> { + HashMap hashMap = new HashMap<>(); + List attendances = dateMap.get(key); + attendances.forEach(attendanceRatio -> { + attendanceRatio.setDateDimension(dateDimension); + attendanceRatio.setStaffType(attendanceRatio.getStaffType()); + List staffSum = typeNumMap.get(attendanceRatio.getStaffType()); + String ratio = numberFormat.format(((float) attendanceRatio.getQuantity() / (float) staffSum.get(0).getSum()) * 100); + attendanceRatio.setAttendanceRatio(ratio + "%"); + //构造返回结构 + hashMap.put("时间", attendanceRatio.getDate()); + String name = dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, attendanceRatio.getStaffType()); + hashMap.put(name, attendanceRatio.getAttendanceRatio()); + }); + resultList.add(hashMap); }); - return ResponseData.success(attendanceRatioDTOS); + return ResponseData.success(resultList); } /** - * 员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) + * 19、员工考勤人数变化,统计当天(横坐标为时)及近7天(横坐标为天)的考勤人数变化,只要发生一次考勤识别,次数的基数就正常增加(没有上班下班区分) */ @PostMapping("/staff/attendanceNumber/{dimension}") @ResponseBody public Object attendanceNumber(@PathVariable("dimension") String dimension) { List attendanceNumberDTOs = null; List> resultList = new ArrayList<>(); - if("week".equals(dimension)){ + List dateList = new ArrayList<>(); + if ("week".equals(dimension)) { //近7天数据按天分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForWeek(); - }else if("day".equals(dimension)) { + dateList = DateUtils.getCurrentDateDayList(); + } else if ("day".equals(dimension)) { //今天数据按小时分组统计 attendanceNumberDTOs = attendanceInfoMapper.getCountForDay(); + dateList = DateUtils.getCurrentDateHourList(); } - if(CollectionUtils.isEmpty(attendanceNumberDTOs)){ + 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<>(); + AttendanceNumberDTO attendanceNumberDTO = attendanceNumberDTOS.get(0); + if (attendanceNumberDTOS.size() >= 2) { + AttendanceNumberDTO attendanceNumberDTO2 = attendanceNumberDTOS.get(1); + resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); + } resultMap.put(attendanceNumberDTO.getStaffType(), attendanceNumberDTO.getQuantity()); - resultMap.put(attendanceNumberDTO2.getStaffType(), attendanceNumberDTO2.getQuantity()); resultMap.put("staticTime", attendanceNumberDTO.getDate()); resultList.add(resultMap); }); + //补全空数据处理 + if (CollectionUtils.isEmpty(resultList)) { + for (String date : dateList) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } else { + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = map.get("staticTime"); + collectList.add(staticTime); + } + for (String date : dateList) { + if (!collectList.contains(date)) { + Map resultMap = new HashMap<>(); + resultMap.put("1", "0"); + resultMap.put("2", "0"); + resultMap.put("staticTime", date); + resultList.add(resultMap); + } + } + } return ResponseData.success(resultList); } /** - * 早晚高峰区域安防评估 + * 20、早晚高峰区域安防评估 */ @PostMapping("/security/assessment/{dimension}") @ResponseBody @@ -253,55 +321,123 @@ categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); }); HashMap hashMap = new HashMap<>(); - if("week".equals(dimension)){ + 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(" "); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - - }else{ + } 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> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } 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); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDatePeakHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } + } return null; } /** - * 重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 + * 23、重点区域安防事态评估,统计重点区域6:00-23:00按小时分组数据 */ @GetMapping("/security/keyAreaStatistic") @ResponseBody @@ -323,25 +459,59 @@ caseInfos.forEach(caseInfo -> { String hazardWeight = hazardScoreMap.get(caseInfo.getHazardLevelCode()); String categoryWeight = categoryScoreMap.get(caseInfo.getCategoryLevelCode()); - Double score = Double.valueOf(hazardWeight)*Double.valueOf(categoryWeight); + Double score = Double.valueOf(hazardWeight) * Double.valueOf(categoryWeight); String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(new ArrayList<>()); + } } /** - * 安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 + * 25、安防机动支援力量调配响应评估,根据事件已解决状态及已解决时间-发送时间,按时间(小时)分组统计 */ @GetMapping("/security/responseAssess") @ResponseBody @@ -361,35 +531,71 @@ 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; + Double score = Double.valueOf(hazardWeight) * between; String[] array = caseInfo.getHappenTime().split(":"); String dayTime = array[0]; BigDecimal preScore; - if(hashMap.containsKey(dayTime)){ + if (hashMap.containsKey(dayTime)) { Double aDouble = hashMap.get(dayTime); preScore = new BigDecimal(aDouble.toString()); - }else{ + } else { preScore = new BigDecimal("100.0"); } BigDecimal nowScore = new BigDecimal(score.toString()); hashMap.put(dayTime, preScore.subtract(nowScore).doubleValue()); }); - return ResponseData.success(hashMap); + + List> resultList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(hashMap)) { + hashMap.keySet().forEach(key -> { + HashMap map = new HashMap<>(); + map.put("日期", key); + map.put("安防评估", hashMap.get(key)); + resultList.add(map); + }); + //补全空数据处理 + List collectList = new ArrayList<>(); + for (Map map : resultList) { + String staticTime = String.valueOf(map.get("日期")); + collectList.add(staticTime); + } + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + if (!collectList.contains(date)) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + } + return ResponseData.success(resultList); + } else { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateDayList(); + for (String date : dateList) { + HashMap map = new HashMap<>(); + map.put("日期", date); + map.put("安防评估", 100); + resultList.add(map); + } + return ResponseData.success(resultList); + } } /** - * 重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 26、重点区域威胁事件类型统计,优先级2,统计近7天和近30天 + * 未处理返回补全空数据 */ @GetMapping("/case/hazardLevelStatistics/{dimension}") @ResponseBody public Object HazardLevelStatistics(@PathVariable("dimension") String dimension) { List hazardLevelGroup = null; - if("week".equals(dimension)){ + if ("week".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelWeek(); - }else if("month".equals(dimension)) { + } else if ("month".equals(dimension)) { hazardLevelGroup = caseInfoMapper.selectByHazardLevelMonth(); } - if(CollectionUtils.isEmpty(hazardLevelGroup)){ + if (CollectionUtils.isEmpty(hazardLevelGroup)) { log.info("重点区域威胁事件类型统计,无安防事件"); return ResponseData.error("无安防事件发生!"); } @@ -397,14 +603,14 @@ // 设置精确到小数点后2位 numberFormat.setMaximumFractionDigits(2); long sum = hazardLevelGroup.stream().collect(Collectors.summarizingInt(HazardLevelGroupDTO::getQuantity)).getSum(); - if(sum <= 0){ + if (sum <= 0) { return ResponseData.error("安防事件总数为0"); } hazardLevelGroup.forEach(group -> { CaseHazardLevel caseHazardLevel = hazardLevelMapper.getCaseHazardLevel(group.getLevelCode()); group.setLevelName(caseHazardLevel.getName()); String result = numberFormat.format((float) group.getQuantity() / (float) sum * 100); - group.setLevelRatio(result+"%"); + group.setLevelRatio(result + "%"); }); HazardLevelGroupResponse hazardLevelGroupResponse = new HazardLevelGroupResponse(); hazardLevelGroupResponse.setHazardLevelGroup(hazardLevelGroup); @@ -413,20 +619,62 @@ } /** - * 近30天/近一周安保人员到岗排行 + * 8、近一月安保人员到岗排行 * 问题:没有排班表,只能计算出勤的安保人员排行,并且只有人脸摄像头才能识别考勤,只能计算识别到的考勤排行 * 项目:计算一个月每天的所有的保安出勤个数,横坐标天,纵坐标个数及哪个摄像头缺勤(摄像头位置名) + * 产品:用考勤来计算 */ - + @GetMapping("/security/rank") + @ResponseBody + public Object securityRank() { + //考勤表近一个月按人员分组的考勤个数前十名 + List list = attendanceInfoMapper.getCountForRank(); + List> resultList = new ArrayList<>(); + if (CollectionUtils.isEmpty(list)) { + //补全空数据处理 + List staffList = staffInfoMapper.selectListLimitTen(); + for (StaffInfo staffInfo : staffList) { + HashMap hashMap = new HashMap<>(); + hashMap.put(staffInfo.getStaffName(), "0%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + //构造返回结构 + for (SecurityRankDTO dto : list) { + // TODO: 2022/9/15 分母使用30,后续看产品定义 + HashMap hashMap = new HashMap<>(); + String result = numberFormat.format(Float.valueOf(dto.getQuantity()) / (float) 30 * 100); + hashMap.put("name", dto.getStaffName()); + hashMap.put("ratio", result + "%"); + resultList.add(hashMap); + } + return ResponseData.success(resultList); + } /** - * 安保等级评估,发生离岗事件减1分 + * 29、安保等级评估,发生离岗事件减1分 */ @GetMapping("/security/levelAssess") @ResponseBody public Object securityLevelAssess() { //今天数据按小时分组统计 List resultList = caseInfoMapper.selectListByType(SecurityEventType.PERSONNEL_DEMOBILIZED_EVENT); + if (CollectionUtils.isEmpty(resultList)) { + //补全空数据处理 + List dateList = DateUtils.getCurrentDateWorkHourList(); + for (String date : dateList) { + SecurityLevelAssessDTO levelAssessDTO = new SecurityLevelAssessDTO(); + levelAssessDTO.setScore(new BigDecimal("100.0").doubleValue()); + levelAssessDTO.setDate(date); +// levelAssessDTO.setQuantity(); + resultList.add(levelAssessDTO); + } + return ResponseData.success(resultList); + } resultList.forEach(result -> { BigDecimal deScore = new BigDecimal(result.getQuantity()); BigDecimal preScore = new BigDecimal("100.0"); @@ -438,11 +686,20 @@ /** * 设备状态计算系数和评判,即设备维修管理查询(不分页) */ - @PostMapping("/device/repairList") + @GetMapping("/device/repairList") @ResponseBody - public Object repairList(@RequestBody DeviceRepairRequest deviceRepairRequest) { + public Object repairList(DeviceRepairRequest deviceRepairRequest) { List deviceRepairLogDTOS = deviceInfoService.deviceRepairListPage(deviceRepairRequest); return ResponseData.success(deviceRepairLogDTOS); } + /** + * 设备在线状态统计 + */ + @GetMapping("/device/deviceStatus") + @ResponseBody + public Object deviceStatus() { + List deviceStatusDTOS = deviceInfoService.getDeviceStatusGroup(); + return ResponseData.success(deviceStatusDTOS); + } } 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 6d9e78e..191def1 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 @@ -6,6 +6,7 @@ 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.WebSocketDTO; import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventType; @@ -138,6 +139,7 @@ private void caseHandle(HikRecvEvent hikRecvEvent, Number eventType, CaseInfo caseInfo) { JSONArray eventArray = hikRecvEvent.getEventArray(); + log.info("接收到的安防事件的数据为:{}", JSONObject.toJSONString(eventArray)); List caseInfos = new ArrayList<>(); Iterator iterator = eventArray.iterator(); while (iterator.hasNext()) { @@ -157,11 +159,18 @@ if (StringUtils.isEmpty(faceGroupCode)) { return; } + //获取重点人员抓拍照片 + JSONObject snap = (JSONObject) faceRecognitionResult.get("snap"); + String faceUrl = ""; + if(!Objects.isNull(snap)){ + faceUrl = snap.getString("faceUrl"); + } HikFaceGroupInfo blackListGroup = hikFaceGroupInfoMapper.selectByName("blackList"); HikFaceGroupInfo propertyPersonnelGroup = hikFaceGroupInfoMapper.selectByName("propertyPersonnel"); HikFaceGroupInfo securityPersonnelGroup = hikFaceGroupInfoMapper.selectByName("securityPersonnel"); if (faceGroupCode.equals(blackListGroup.getFaceGroupCode())) { //黑名单分组处理 + caseInfo1.setEventPicture(faceUrl); caseInfo1 = hikService.blackListHandle(event, caseInfo1); } else if (faceGroupCode.equals(propertyPersonnelGroup.getFaceGroupCode())) { //考勤分组处理-物业人员,添加到考勤表,员工不走闸机 @@ -210,9 +219,12 @@ log.error("安防事件批量入库异常!"); } // TODO: 2022/8/15 webSocket推送 - if (CollectionUtils.isEmpty(caseInfos)) { + if (!CollectionUtils.isEmpty(caseInfos)) { log.info("webSocket事件推送"); - webSocket.sendAllMessage(JSONObject.toJSONString(caseInfos)); + WebSocketDTO webSocketDTO = new WebSocketDTO(); + webSocketDTO.setType("case"); + webSocketDTO.setData(caseInfos); + webSocket.sendAllMessage(JSONObject.toJSONString(webSocketDTO)); } return; } 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 ec87e46..04c3458 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 @@ -5,6 +5,7 @@ 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.dto.statistics.SecurityRankDTO; import com.casic.missiles.modular.model.AttendanceInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,13 +23,15 @@ AttendanceInfo selectByCodeAndDate(@Param("staffCode") String staffCode); - List getCountByTypeAndDateForWeek(@Param("staffType")String staffType); + List getCountByTypeAndDateForWeek(); - List getCountByTypeAndDateForMonth(@Param("staffType")String staffType); + List getCountByTypeAndDateForMonth(); - List getCountByTypeAndDateForYear(@Param("staffType")String staffType); + List getCountByTypeAndDateForYear(); List getCountForWeek(); List getCountForDay(); + + List getCountForRank(); } 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 fc6b103..02c1f49 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 @@ -65,4 +65,10 @@ List selectDemobilizedCountByHour(@Param("eventType") Number eventType); List selectPersonnelGatherByTime(@Param("minute") Integer minute, @Param("eventType") Number eventType); + + int updateStatusByIndexCode(@Param("indexCode") String indexCode); + + List getCaseInfoList(@Param("caseInfoRequest") CaseInfoRequest caseInfoRequest); + + List selectByPositionAndArea(@Param("position") String position, @Param("area") String area); } 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 f747192..222b0c6 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 @@ -5,6 +5,7 @@ import com.casic.missiles.modular.dto.DeviceInfoDTO; import com.casic.missiles.modular.dto.DeviceInfoRequest; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.dto.statistics.GateStatusGroupDTO; import com.casic.missiles.modular.model.DeviceInfo; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +38,9 @@ int updateStatusBatchByCodes(@Param("deviceCodes") List deviceCodes, @Param("status")String status); int updateDeviceInfoBatch(@Param("acsDeviceList") List acsDeviceList); + + List selectByTypeForCamera(); + + List selectDeviceStatusGroupByStatus(); + } 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 a554961..4c94656 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 @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; +import com.casic.missiles.modular.dto.statistics.StaffTypeAndSumDTO; import com.casic.missiles.modular.model.StaffInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -29,4 +30,8 @@ int updateByCodeForCard(@Param("staffCode") String staffCode, @Param("cardNo") String cardNo); int updateStaffInfoBatch(@Param("personList") List personList); + + List selectCountByType(); + + List selectListLimitTen(); } 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 f8bdd6e..a07c992 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 @@ -37,37 +37,28 @@ + + \ 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 581fbea..f7999a1 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 @@ -22,7 +22,7 @@ - update bus_case_info set status = #{status} where id = #{id} + update bus_case_info set status = #{caseInfoRequest.status} where id = #{caseInfoRequest.id} @@ -202,4 +202,47 @@ WHERE DATE_SUB(NOW(), INTERVAL #{minute} MINUTE) <= date(happen_time) AND hik_event_type = #{eventType} + + + update bus_case_info + set status = 3 + where index_code = #{indexCode} + + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceInfoMapper.xml index cddcf4f..bc3cbfc 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 @@ -112,4 +112,17 @@ where ip = #{device.ip} + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInfoMapper.xml index 072d9ca..2e94ec9 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 @@ -21,12 +21,10 @@ + SELECT staff_type, count(id) AS sum + FROM bus_staff_info + WHERE staff_type is not null + GROUP BY staff_type + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml index 1ee7486..3c388b7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitorApplyMapper.xml @@ -25,7 +25,7 @@ \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java new file mode 100644 index 0000000..9c6a0c6 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraChildrenDTO.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import com.casic.missiles.modular.model.DeviceInfo; +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:44 + */ +@Data +public class CameraChildrenDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java new file mode 100644 index 0000000..bc43579 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraListRequest.java @@ -0,0 +1,17 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:33 + */ +@Data +public class CameraListRequest { + private String keywords; + private List positionIds; + private List areaIds; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java new file mode 100644 index 0000000..10eb165 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CameraTreeDTO.java @@ -0,0 +1,16 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/17 15:43 + */ +@Data +public class CameraTreeDTO { + private String devName; + private List children; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java index b2ce351..c10655e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/CaseInfoRequest.java @@ -14,4 +14,6 @@ private String type; private String status; private String description; + private String happenStartTime; + private String happenEndTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java new file mode 100644 index 0000000..4893f63 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/ReSocketRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/19 11:54 + */ +@Data +public class ReSocketRequest { + private String type; + private String message; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java new file mode 100644 index 0000000..ee3e97b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/WebSocketDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: websocket请求结果实体结构 + * @Author: wangpeng + * @Date: 2022/9/12 13:55 + */ +@Data +public class WebSocketDTO { + //前端用于区分消息类型 + private String type; + private Object data; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java index 83f66d0..1e7198e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/AttendanceRatioDTO.java @@ -10,14 +10,13 @@ */ @Data public class AttendanceRatioDTO { - //物业or安保人员,入参 - @JsonIgnore - private String staffType; //日期维度,周、月、年,入参 @JsonIgnore private String dateDimension; //出勤数量,计算出勤率使用 private Integer quantity; + //员工类别,出参 + private String staffType; //日期,具体周、月、年,出参 private String date; //出勤率,出参 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java new file mode 100644 index 0000000..8e59d5e --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/DeviceStatusDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/16 9:12 + */ +@Data +public class DeviceStatusDTO { + private String status; + private String statusName; + private Integer quantity; +} 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 index d16f4e5..6ded3b4 100644 --- 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 @@ -13,4 +13,6 @@ private String status; //占比 private String ratio; + //数量 + private Integer quantity; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java new file mode 100644 index 0000000..3ed8403 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/SecurityRankDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2022/9/15 11:03 + */ +@Data +public class SecurityRankDTO { + private String staffCode; + private String staffName; + private Integer quantity; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java new file mode 100644 index 0000000..af4acd8 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/StaffTypeAndSumDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: 员工类型及对应数量实体 + * @Author: wangpeng + * @Date: 2022/9/14 16:46 + */ +@Data +public class StaffTypeAndSumDTO { + private String staffType; + private Integer sum; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java index 7e519cf..6cb7b1d 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/CaseInfo.java @@ -28,7 +28,7 @@ public class CaseInfo extends Model { @TableId private Long id; -// @ExcelProperty("危险级别编码") + @ExcelProperty("危险级别编码") private String hazardLevelCode; @ExcelProperty("危险级别") private String levelName; @@ -68,6 +68,9 @@ private String happenTime; //海康事件编码 private Long hikEventType; + private String eventPicture; + @TableField(exist = false) + private String drawNo; private String createTime; private String updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java index 965add3..8b31cca 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/DeviceInfo.java @@ -68,6 +68,8 @@ private String sn; @TableField(exist = false) private String isKeyAreaName; + @ExcelProperty("图纸编号") + private String drawNo; private String createTime; private String updateTime; diff --git a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java index 46dc570..0dc8104 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/model/StaffInfo.java @@ -55,4 +55,6 @@ private String updateTime; @TableField(exist = false) private List ids; + @TableField(exist = false) + private List faceIds; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java index d94c696..d915eec 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/BlackInfoService.java @@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; import com.casic.missiles.modular.model.BlackInfo; import java.util.List; @@ -21,4 +22,6 @@ Object deleteBatchBlackInfo(BlackInfo blackInfo); List blackInfoListPage(Page page, BlackInfoRequest blackInfoRequest); + + Object getBlackPicture(BlackPictureRequest blackPictureRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java index d96da4e..316188e 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CaseInfoService.java @@ -20,4 +20,6 @@ List addCaseInfoBatch(List results); boolean insertCaseInfoBatch(List caseInfos); + + List caseInfoList(CaseInfoRequest caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java index b50b497..d6a3fcb 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/DeviceInfoService.java @@ -4,10 +4,13 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; import java.util.List; +import java.util.Map; +import java.util.TreeMap; /** * @Description: 设备service @@ -55,4 +58,10 @@ int updateBatchGateGroupStatus(List deviceCodes, String status); int updateDeviceInfoBatch(List acsDeviceList); + + List getDeviceStatusGroup(); + + Map>> getCameraMap(String keywords, List positionIds, List areaIds); + + DeviceInfo deviceInfoByDrawNo(String drawNo); } 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 5fd9e32..0b31726 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 @@ -23,7 +23,7 @@ Object deleteStaffInfo(StaffInfo staffInfo); - Object deleteBatchStaffInfo(List ids); + Object deleteBatchStaffInfo(List ids, List faceIds); List addStaffInfoBatch(List results); @@ -34,4 +34,6 @@ int saveCardInfo(StaffCardRequest staffCardRequest); int updateStaffInfoBatch(List personList); + + Object getStaffPicture(String staffCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java index 2ba97b0..89bd933 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/VisitService.java @@ -16,4 +16,6 @@ List visitInfoListPage(Page page, VisitorRequest visitorRequest); VisitInfo visitInfoDetail(String id); + + String getVisitorPicture(VisitInfo visitInfo); } 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 981b4cd..ea6b8c0 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 @@ -8,10 +8,8 @@ import com.casic.missiles.modular.dao.BlackInfoMapper; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; import com.casic.missiles.modular.dto.BlackInfoRequest; -import com.casic.missiles.modular.dto.hik.FaceDeletionBatchRequest; -import com.casic.missiles.modular.dto.hik.FaceInfo; -import com.casic.missiles.modular.dto.hik.FacePic; -import com.casic.missiles.modular.dto.hik.FaceSingleAddOrUpdateRequest; +import com.casic.missiles.modular.dto.BlackPictureRequest; +import com.casic.missiles.modular.dto.hik.*; import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.BlackInfo; @@ -86,6 +84,10 @@ //设置海康人脸唯一标识、人脸分组唯一标识 blackInfo.setIndexCode(String.valueOf(dataJson.get("indexCode"))); blackInfo.setFaceGroupIndexCode(String.valueOf(dataJson.get("faceGroupIndexCode"))); + //数据库照片存海康的人脸url + JSONObject facePicture = (JSONObject)dataJson.get("facePic"); + String faceUrl = facePicture.getString("faceUrl"); + blackInfo.setPicture(faceUrl); //插入数据库 if(blackInfoMapper.insert(blackInfo) > 0){ return ResponseData.success(); @@ -157,4 +159,19 @@ } return ResponseData.error("批量删除黑名单异常"); } + + + @Override + public Object getBlackPicture(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/service/impl/CaseInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java index 7a25099..6b03d8b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CaseInfoServiceImpl.java @@ -132,4 +132,21 @@ public boolean insertCaseInfoBatch(List caseInfos) { return this.saveBatch(caseInfos); } + + @Override + public List caseInfoList(CaseInfoRequest caseInfoRequest) { + try { + List pageList = caseInfoMapper.getCaseInfoList(caseInfoRequest); + pageList.forEach(caseInfo ->{ + caseInfo.setStatusName(dictService.getDictNameByCode(SecurityEventDict.CASE_STATUS, caseInfo.getStatus())); + caseInfo.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, caseInfo.getPosition())); + caseInfo.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, caseInfo.getArea())); + caseInfo.setIsKeyAreaName(dictService.getDictNameByCode(SecurityEventDict.IS_KEY_AREA, caseInfo.getIsKeyArea())); + }); + return pageList; + } catch (DataAccessException ex) { + log.error("安防事件: 查询不分页出现异常, 异常:{}", ex); + } + return null; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java index 2608ba8..94308db 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/DeviceInfoServiceImpl.java @@ -13,6 +13,7 @@ import com.casic.missiles.modular.dao.GroupDeviceMapper; import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.hik.AcsDeviceListDTO; +import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.DeviceRepairLog; @@ -21,11 +22,13 @@ import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.GroupDeviceService; 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.dao.DataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -133,11 +136,15 @@ @Override @Transactional(rollbackFor = Exception.class) public List addDeviceInfoBatch(List results) { + List collect = results.stream().filter(result -> + StringUtils.isNotEmpty(result.getIndexCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "设备导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(results)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; - results.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -157,7 +164,6 @@ // return; // } // } - if (StrUtil.isNotEmpty(busConcentrator.getInstallTime())) { try { new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(busConcentrator.getInstallTime()); @@ -173,7 +179,7 @@ if (CollectionUtil.isNotEmpty(list)) { return list; } - this.saveBatch(results); + this.saveBatch(collect); } return list; } @@ -346,5 +352,82 @@ return deviceInfoMapper.updateDeviceInfoBatch(acsDeviceList); } + @Override + public List getDeviceStatusGroup() { + List deviceStatusDTOS = deviceInfoMapper.selectDeviceStatusGroupByStatus(); + if(CollectionUtils.isEmpty(deviceStatusDTOS)){ + return new ArrayList<>(); + } + for (DeviceStatusDTO deviceStatusDTO : deviceStatusDTOS) { + String dictNameByCode = dictService.getDictNameByCode(SecurityEventDict.DEVICE_STATUS, deviceStatusDTO.getStatus()); + deviceStatusDTO.setStatusName(dictNameByCode); + } + return deviceStatusDTOS; + } + + @Override + public Map>> getCameraMap(String keywords, List positionIds, List areaIds) { + Map>> map = new HashMap<>(); + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.like("dev_name", keywords); + wrapper.like("dev_code", keywords); + if(!CollectionUtils.isEmpty(positionIds)){ + wrapper.in("position", positionIds); + } + if(!CollectionUtils.isEmpty(areaIds)){ + wrapper.in("area", areaIds); + } + wrapper.in("dev_type", Arrays.asList("2","3","4","5","6","7")); + List deviceInfos = deviceInfoMapper.selectList(wrapper); + + deviceInfos.forEach(cameraDTO -> { + cameraDTO.setPositionName(dictService.getDictNameByCode("devicePosition", cameraDTO.getPosition())); + cameraDTO.setAreaName(dictService.getDictNameByCode("deviceArea", cameraDTO.getArea())); + + if (map.containsKey(cameraDTO.getPositionName())) { + if (map.get(cameraDTO.getPositionName()).containsKey(cameraDTO.getAreaName())) { + map.get(cameraDTO.getPositionName()).get(cameraDTO.getAreaName()).add(cameraDTO); + } else { + map.get(cameraDTO.getPositionName()).put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + } + } else { + TreeMap> areaMap = new TreeMap<>(new Comparator() { + @Override + public int compare(String o1, String o2) { + if(o1.endsWith("F") && o2.endsWith("F")){ + String o1Str = o1.substring(0, o1.length()-1); + String o2Str = o2.substring(0, o2.length()-1); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + if(o1.startsWith("N") && o2.startsWith("N")){ + String o1Str = o1.substring(1, o1.length()); + String o2Str = o2.substring(1, o2.length()); + return Double.valueOf(o1Str).compareTo(Double.valueOf(o2Str)); + } + return 0; + } + }); + areaMap.put(cameraDTO.getAreaName(), new ArrayList() { + { + add(cameraDTO); + } + }); + map.put(cameraDTO.getPositionName(), areaMap); + } + }); + return map; + } + + @Override + public DeviceInfo deviceInfoByDrawNo(String drawNo) { + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("draw_no", drawNo); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java index a95fff2..e3dff1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/FireEquipServiceImpl.java @@ -16,6 +16,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import org.springframework.validation.BeanPropertyBindingResult; import org.springframework.validation.FieldError; import org.springframework.validation.Validator; @@ -107,6 +108,9 @@ ); return; } + if(StringUtils.isEmpty(busConcentrator.getEquipCode())){ + return; + } if (StrUtil.isNotEmpty(busConcentrator.getProductDate())) { try { new SimpleDateFormat("yyyy-MM-dd").parse(busConcentrator.getProductDate()); 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 ff60402..8ed53d9 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 @@ -5,10 +5,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.casic.missiles.core.application.service.AbstractDictService; -import com.casic.missiles.modular.dao.AttendanceInfoMapper; -import com.casic.missiles.modular.dao.DeviceInfoMapper; -import com.casic.missiles.modular.dao.StaffInfoMapper; -import com.casic.missiles.modular.dao.VisitInfoMapper; +import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.*; import com.casic.missiles.modular.service.HikService; @@ -16,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.HashMap; @@ -47,6 +45,9 @@ @Autowired private DeviceInfoMapper deviceInfoMapper; + @Autowired + private CaseInfoMapper caseInfoMapper; + @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -59,7 +60,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息"); + log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -69,6 +70,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -84,7 +86,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到离岗事件,但数据库中无该事件发生的设备信息"); + log.info("接收到离岗事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -94,6 +96,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -109,7 +112,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息"); + log.info("接收到人员聚集事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -119,6 +122,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @@ -135,7 +139,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态("未解决"的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -145,6 +149,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -157,22 +162,29 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void monitorPointOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到监控点上线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return; } // TODO: 2022/7/28 设备在线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); deviceInfo.setStatus(deviceDict.get(0).getCode()); - if(deviceInfoMapper.updateById(deviceInfo) <= 0){ + int upDevFlag = deviceInfoMapper.updateById(deviceInfo); + + //更新该设备离线事件的解决状态(status=3) + caseInfoMapper.updateStatusByIndexCode(srcIndex); + + if(upDevFlag <= 0){ log.error("海康回调,更新监控点在线状态失败!"); } } @Override + @Transactional(rollbackFor = Exception.class) public CaseInfo deviceOfflineHandle(JSONObject event, CaseInfo caseInfo) { //加入到安防事件 String srcIndex = event.getString("srcIndex"); //海康资源唯一标识 @@ -185,7 +197,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息"); + log.info("接收到装置离线事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -195,6 +207,7 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 //更新设备状态 // TODO: 2022/7/28 设备离线字典值选择 List deviceDict = dictService.findInDictByCode(SecurityEventDict.DEVICE_STATUS); @@ -208,6 +221,7 @@ @Override + @Transactional(rollbackFor = Exception.class) public void deviceOnlineHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); @@ -232,7 +246,7 @@ caseInfo.setStatus(dict.get(0).getCode()); //事件状态(未解决的字典值) DeviceInfo deviceInfo = deviceInfoMapper.getByIndexCode(srcIndex); if(Objects.isNull(deviceInfo)){ - log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息"); + log.info("接收到高空抛物事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } caseInfo.setIndexCode(srcIndex); @@ -242,10 +256,12 @@ caseInfo.setArea(deviceInfo.getArea()); //区域 caseInfo.setIsKeyArea(deviceInfo.getIsKeyArea()); caseInfo.setDetailLocation(deviceInfo.getDetailLocation()); + caseInfo.setDrawNo(deviceInfo.getDrawNo()); //图纸编号 return caseInfo; } @Override + @Transactional(rollbackFor = Exception.class) public void propertyAttendanceHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -291,6 +307,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void securityPersonnelHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -336,6 +353,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorRegisterHandle(JSONObject event) { String srcIndex = event.getString("srcIndex"); JSONObject data = (JSONObject) event.get("data"); @@ -367,6 +385,7 @@ } @Override + @Transactional(rollbackFor = Exception.class) public void visitorCheckOutHandle(JSONObject event) { JSONObject data = (JSONObject) event.get("data"); DateTime parse = DateUtil.parse(data.getString("endTime")); 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 c2714f5..decc60c 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 @@ -1,6 +1,7 @@ package com.casic.missiles.modular.service.impl; import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -8,18 +9,15 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.StaffInfoMapper; import com.casic.missiles.modular.dto.StaffInfoRequest; -import com.casic.missiles.modular.dto.hik.PersonBatchDeleteRequest; -import com.casic.missiles.modular.dto.hik.PersonListDTO; -import com.casic.missiles.modular.dto.hik.PersonSingleAddOrUpdateRequest; -import com.casic.missiles.modular.dto.hik.StaffCardRequest; +import com.casic.missiles.modular.dto.hik.*; 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.util.Base64Util; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DataAccessException; @@ -59,10 +57,9 @@ public List staffInfoListPage(Page page, StaffInfoRequest staffInfoRequest) { try { List pageList = staffInfoMapper.getStaffInfoListPage(page, staffInfoRequest); - pageList.forEach(staffInfo -> { + pageList.parallelStream().forEach(staffInfo -> { staffInfo.setStaffTypeName(dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, staffInfo.getStaffType())); - String base64 = Base64Util.transformPictureToBase64(uploadPath + staffInfo.getPicture()); - staffInfo.setPicture(base64); + staffInfo.setPicture(getPictureFromHik(staffInfo.getStaffCode())); }); return pageList; } catch (DataAccessException ex) { @@ -174,7 +171,7 @@ @Override @Transactional(rollbackFor = Exception.class) - public Object deleteBatchStaffInfo(List ids) { + public Object deleteBatchStaffInfo(List ids, List faceIds) { List staffInfos = staffInfoMapper.selectBatchIds(ids); List staffCodes = staffInfos.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); PersonBatchDeleteRequest personBatchDeleteRequest = new PersonBatchDeleteRequest(); @@ -186,6 +183,17 @@ log.error("请求海康,批量删除人员失败,海康response:{}", resultStr); return ResponseData.error("批量删除人员失败"); } + //批量删除人脸 + faceIds.parallelStream().forEach(faceId -> { + PersonBatchDeleteRequest personBatchDeleteRequest2 = new PersonBatchDeleteRequest(); + personBatchDeleteRequest2.setFaceId(faceId); + 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); + } + }); if(staffInfoMapper.deleteBatchIds(ids) > 0){ return ResponseData.success(); } @@ -195,12 +203,16 @@ @Override @Transactional(rollbackFor = Exception.class) public List addStaffInfoBatch(List staffInfos) { + List collect = staffInfos.stream().filter(result -> + StringUtils.isNotEmpty(result.getStaffCode()) + ).collect(Collectors.toList()); + BeanPropertyBindingResult beanPropertyBindingResult = new BeanPropertyBindingResult(DeviceInfo.class, "员工导入校验"); List list = new ArrayList<>(); - if (!CollectionUtil.isEmpty(staffInfos)) { + if (!CollectionUtil.isEmpty(collect)) { final Integer[] index = {0}; List personList = new ArrayList<>(); - staffInfos.forEach(busConcentrator -> { + collect.forEach(busConcentrator -> { validator.validate(busConcentrator, beanPropertyBindingResult); index[0]++; if (beanPropertyBindingResult.hasErrors()) { @@ -228,7 +240,7 @@ personSingleAddOrUpdateRequest.setCertificateNo(busConcentrator.getStaffIdCard()); personList.add(personSingleAddOrUpdateRequest); }); - List alreadyList = staffInfoMapper.selectBatchCodes(staffInfos); + List alreadyList = staffInfoMapper.selectBatchCodes(collect); if(CollectionUtil.isNotEmpty(alreadyList)){ List staffCodes = alreadyList.stream().map(StaffInfo::getStaffCode).collect(Collectors.toList()); list.add("员工staffCode:" + staffCodes + "数据已存在!"); @@ -245,7 +257,7 @@ list.add("批量添加人员失败"); } //批量保存到数据库 - this.saveBatch(staffInfos); + this.saveBatch(collect); } return list; } @@ -292,4 +304,50 @@ public int updateStaffInfoBatch(List personList) { return staffInfoMapper.updateStaffInfoBatch(personList); } + + @Override + public Object getStaffPicture(String staffCode) { + //获取员工详细信息,含图片服务器、uri + String url = getPictureFromHik(staffCode); + return ResponseData.success(url); + } + + private String getPictureFromHik(String staffCode) { + 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 ""; + } + //获取照片 + JSONObject data = (JSONObject) resultJson.get("data"); + if(Objects.isNull(data)){ + return ""; + } + JSONArray dataArray = (JSONArray) data.get("list"); + if(0 == dataArray.size()){ + return ""; + } + 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 pictureFromHik = HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + if(StringUtils.isNotEmpty(pictureFromHik) && !pictureFromHik.startsWith("http")){ + return "https://192.168.10.2:443" + pictureFromHik; + } + return pictureFromHik; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java index 39618ea..42e68ab 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/VisitServiceImpl.java @@ -1,13 +1,17 @@ package com.casic.missiles.modular.service.impl; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.modular.dao.VisitInfoMapper; import com.casic.missiles.modular.dto.VisitorRequest; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.model.VisitInfo; import com.casic.missiles.modular.service.VisitService; +import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; @@ -50,4 +54,15 @@ VisitInfo visitInfo = visitInfoMapper.selectById(id); return visitInfo; } + + @Override + public String getVisitorPicture(VisitInfo visitInfo) { + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(visitInfo.getPicUri()); + picRequest.setServerIndexCode(visitInfo.getServerIndexCode()); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + return HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody); + + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java index 191ef79..109eec2 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/DateUtils.java @@ -1,12 +1,15 @@ package com.casic.missiles.modular.util; +import cn.hutool.core.date.DateUtil; import javafx.util.Pair; import java.text.ParseException; import java.text.SimpleDateFormat; +import java.util.ArrayList; import java.util.Calendar; import java.util.Date; +import java.util.List; /** * Created by Administrator on 2015/2/25. @@ -113,4 +116,85 @@ calendar.add(Calendar.DATE, -2); return sdf_day.format(calendar.getTime()); } + + public static List getCurrentDateWeekList() { + List list = new ArrayList<>(); + //获取当前日期前30天的日期 + Date now = new Date(); + Date startDate = org.apache.commons.lang3.time.DateUtils.addDays(now, -30); + //获取30天前对应的当前年的第几周 + int startWeek = cn.hutool.core.date.DateUtil.weekOfYear(startDate); + int endWeek = cn.hutool.core.date.DateUtil.weekOfYear(now); + int year = cn.hutool.core.date.DateUtil.thisYear(); + for (int i = startWeek; i < endWeek + 1; i++) { + list.add("" + year + "-" + i); + } + return list; + } + + public static List getCurrentDateHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + for (int i = 0; i < 24; i++) { + if (i < 10) { + list.add(today + " 0" + i); + } else { + list.add(today + " " + i); + } + } + return list; + } + + public static List getCurrentDateMonthList() { + List list = new ArrayList<>(); + int year = cn.hutool.core.date.DateUtil.thisYear(); + for (int i = 1; i < 13; i++) { + if (i < 10) { + list.add("" + year + "-0" + i); + } else { + list.add("" + year + "-" + i); + } + } + return list; + } + + public static List getCurrentDateDayList() { + List list = new ArrayList<>(); + //获取当前日期前7天的日期 + Date now = new Date(); +// Date startDate = org.apache.commons.lang3.time.DateUtils.addDays(now, -7); +// String s = DateUtil.formatDate(startDate); +// list.add(s); + for (int i = 1; i < 8; i++) { + Date date = org.apache.commons.lang3.time.DateUtils.addDays(now, -i); + String s = DateUtil.formatDate(date); + list.add(s); + } + return list; + } + + public static List getCurrentDatePeakHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + list.add(today + " 07"); + list.add(today + " 08"); + list.add(today + " 09"); + list.add(today + " 17"); + list.add(today + " 18"); + list.add(today + " 19"); + return list; + } + + public static List getCurrentDateWorkHourList() { + List list = new ArrayList<>(); + String today = DateUtil.today(); + for (int i = 6; i < 24; i++) { + if (i < 10) { + list.add(today + " 0" + i); + } else { + list.add(today + " " + i); + } + } + return list; + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java b/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java index 5c7f422..1ab4be7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/WebSocket.java @@ -26,7 +26,7 @@ private Session session; private static CopyOnWriteArraySet webSockets = new CopyOnWriteArraySet<>(); - private static Map sessionPool = new HashMap(); + private static Map sessionPool = new HashMap<>(); @OnOpen public void onOpen(Session session, @PathParam(value = "userId") String userId) { diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index 835aeb4..f436857 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/**,/eventRcv/**,/hik/**,/staffInfo/**,/**/listPage,/**/list + no-login-urls: /websocket/**,${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,/**/drawNo,/socket/repost #flowable数据源和多数据源配置 db: init: diff --git a/casic-web/src/main/resources/config/application-prod.yml b/casic-web/src/main/resources/config/application-prod.yml index 3882020..ba83780 100644 --- a/casic-web/src/main/resources/config/application-prod.yml +++ b/casic-web/src/main/resources/config/application-prod.yml @@ -18,7 +18,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/**,/eventRcv/**,/hik/**,/staffInfo/**,/**/listPage,/**/list + no-login-urls: /websocket/**,${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,/**/drawNo,/socket/repost #flowable数据源和多数据源配置 db: init: diff --git a/casic-web/src/main/resources/config/application-test.yml b/casic-web/src/main/resources/config/application-test.yml index fdfb535..3a787b1 100644 --- a/casic-web/src/main/resources/config/application-test.yml +++ b/casic-web/src/main/resources/config/application-test.yml @@ -14,7 +14,7 @@ # store-type: redis casic: # kaptcha-open: false #是否开启登录时验证码 (true/false) - nologin-urls: /user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/** + nologin-urls: /websocket/**,/user/login,/user/appLogin,/kaptcha/base64,/config/baseConfig,/route/mockToken,/workflow/** #flowable数据源和多数据源配置 flowable: datasource: diff --git a/casic-web/src/main/resources/config/export/CaseInfoTemp.xlsx b/casic-web/src/main/resources/config/export/CaseInfoTemp.xlsx index 3f0dbbe..bded6ce 100644 --- a/casic-web/src/main/resources/config/export/CaseInfoTemp.xlsx +++ b/casic-web/src/main/resources/config/export/CaseInfoTemp.xlsx Binary files differ diff --git a/casic-web/src/main/resources/config/export/DeviceTemp.xlsx b/casic-web/src/main/resources/config/export/DeviceTemp.xlsx index f701bdc..fd4233f 100644 --- a/casic-web/src/main/resources/config/export/DeviceTemp.xlsx +++ b/casic-web/src/main/resources/config/export/DeviceTemp.xlsx Binary files differ diff --git a/casic-web/src/main/resources/config/export/StaffTemp.xlsx b/casic-web/src/main/resources/config/export/StaffTemp.xlsx new file mode 100644 index 0000000..12fe6cb --- /dev/null +++ b/casic-web/src/main/resources/config/export/StaffTemp.xlsx Binary files differ diff --git a/casic-web/src/main/resources/config/export/staffTemp.xlsx b/casic-web/src/main/resources/config/export/staffTemp.xlsx deleted file mode 100644 index 12fe6cb..0000000 --- a/casic-web/src/main/resources/config/export/staffTemp.xlsx +++ /dev/null Binary files differ