diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java new file mode 100644 index 0000000..445467d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询响应 + * @Author: wangpeng + * @Date: 2023/1/30 9:11 + */ +@Data +public class PersonListResponse { + //人员类型,黑名单/访客/员工所属组织 + private String personType; + //姓名 + private String personName; + //员工类型:工号,黑名单类型:黑名单编号,访客类型:无 + private String personNo; + //人员图片 + private String personPicture; + //性别 + private String gender; + + @JsonIgnore + private String staffCode; + @JsonIgnore + private String picUri; + @JsonIgnore + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java new file mode 100644 index 0000000..445467d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询响应 + * @Author: wangpeng + * @Date: 2023/1/30 9:11 + */ +@Data +public class PersonListResponse { + //人员类型,黑名单/访客/员工所属组织 + private String personType; + //姓名 + private String personName; + //员工类型:工号,黑名单类型:黑名单编号,访客类型:无 + private String personNo; + //人员图片 + private String personPicture; + //性别 + private String gender; + + @JsonIgnore + private String staffCode; + @JsonIgnore + private String picUri; + @JsonIgnore + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java new file mode 100644 index 0000000..afd8673 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/9 16:59 + */ +@Data +public class SearchPicturesResponse { + private String devName; + private String drawNo; + private String position; + private String positionName; + private String area; + private String areaName; + private String facePicUrl; + private String bkgPicUrl; + private String similarity; + private String time; + private String sex; + private String rect; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java new file mode 100644 index 0000000..445467d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询响应 + * @Author: wangpeng + * @Date: 2023/1/30 9:11 + */ +@Data +public class PersonListResponse { + //人员类型,黑名单/访客/员工所属组织 + private String personType; + //姓名 + private String personName; + //员工类型:工号,黑名单类型:黑名单编号,访客类型:无 + private String personNo; + //人员图片 + private String personPicture; + //性别 + private String gender; + + @JsonIgnore + private String staffCode; + @JsonIgnore + private String picUri; + @JsonIgnore + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java new file mode 100644 index 0000000..afd8673 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/9 16:59 + */ +@Data +public class SearchPicturesResponse { + private String devName; + private String drawNo; + private String position; + private String positionName; + private String area; + private String areaName; + private String facePicUrl; + private String bkgPicUrl; + private String similarity; + private String time; + private String sex; + private String rect; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java new file mode 100644 index 0000000..ce703af --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/29 16:24 + */ +@Data +public class RepairTodayDTO { + private Integer number; + private String position; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java new file mode 100644 index 0000000..445467d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询响应 + * @Author: wangpeng + * @Date: 2023/1/30 9:11 + */ +@Data +public class PersonListResponse { + //人员类型,黑名单/访客/员工所属组织 + private String personType; + //姓名 + private String personName; + //员工类型:工号,黑名单类型:黑名单编号,访客类型:无 + private String personNo; + //人员图片 + private String personPicture; + //性别 + private String gender; + + @JsonIgnore + private String staffCode; + @JsonIgnore + private String picUri; + @JsonIgnore + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java new file mode 100644 index 0000000..afd8673 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/9 16:59 + */ +@Data +public class SearchPicturesResponse { + private String devName; + private String drawNo; + private String position; + private String positionName; + private String area; + private String areaName; + private String facePicUrl; + private String bkgPicUrl; + private String similarity; + private String time; + private String sex; + private String rect; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java new file mode 100644 index 0000000..ce703af --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/29 16:24 + */ +@Data +public class RepairTodayDTO { + private Integer number; + private String position; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index bb00c7c..8de64ef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -14,6 +14,7 @@ import com.casic.missiles.modular.model.StatisticNumber; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.service.StaffInoutLogService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -46,6 +47,8 @@ private AbstractDictService dictService; @Autowired private StaffInfoService staffInfoService; + @Autowired + private StaffInoutLogService inoutLogService; /** * 统计一期二期楼栋,每小时存储各楼栋人数 @@ -130,6 +133,15 @@ } + /** + * 每天0点删除一周外的人员进出记录 + */ + @Scheduled(cron = "0 0 0 * * ?") + @Transactional + public void deleteStaffInOutLog() { + inoutLogService.deleteMoreThanWeekLog(); + } + private List getSyncPersonList(PersonListRequest request, JSONObject resultJson, List personList) { if (!"0".equals(resultJson.get("code"))) { log.error("请求海康,获取人员列表v2失败,海康response:{}", resultJson.toJSONString()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java new file mode 100644 index 0000000..445467d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询响应 + * @Author: wangpeng + * @Date: 2023/1/30 9:11 + */ +@Data +public class PersonListResponse { + //人员类型,黑名单/访客/员工所属组织 + private String personType; + //姓名 + private String personName; + //员工类型:工号,黑名单类型:黑名单编号,访客类型:无 + private String personNo; + //人员图片 + private String personPicture; + //性别 + private String gender; + + @JsonIgnore + private String staffCode; + @JsonIgnore + private String picUri; + @JsonIgnore + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java new file mode 100644 index 0000000..afd8673 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/9 16:59 + */ +@Data +public class SearchPicturesResponse { + private String devName; + private String drawNo; + private String position; + private String positionName; + private String area; + private String areaName; + private String facePicUrl; + private String bkgPicUrl; + private String similarity; + private String time; + private String sex; + private String rect; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java new file mode 100644 index 0000000..ce703af --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/29 16:24 + */ +@Data +public class RepairTodayDTO { + private Integer number; + private String position; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index bb00c7c..8de64ef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -14,6 +14,7 @@ import com.casic.missiles.modular.model.StatisticNumber; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.service.StaffInoutLogService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -46,6 +47,8 @@ private AbstractDictService dictService; @Autowired private StaffInfoService staffInfoService; + @Autowired + private StaffInoutLogService inoutLogService; /** * 统计一期二期楼栋,每小时存储各楼栋人数 @@ -130,6 +133,15 @@ } + /** + * 每天0点删除一周外的人员进出记录 + */ + @Scheduled(cron = "0 0 0 * * ?") + @Transactional + public void deleteStaffInOutLog() { + inoutLogService.deleteMoreThanWeekLog(); + } + private List getSyncPersonList(PersonListRequest request, JSONObject resultJson, List personList) { if (!"0".equals(resultJson.get("code"))) { log.error("请求海康,获取人员列表v2失败,海康response:{}", resultJson.toJSONString()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java index 7a7fe8a..fbfda1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java @@ -45,4 +45,8 @@ Object areaScore(SecurityScoreDTO securityScoreDTO); Object heatMap(HeatMapDTO heatMapDTO); + + Object eventNumber(); + + Object offlineRate(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java new file mode 100644 index 0000000..445467d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询响应 + * @Author: wangpeng + * @Date: 2023/1/30 9:11 + */ +@Data +public class PersonListResponse { + //人员类型,黑名单/访客/员工所属组织 + private String personType; + //姓名 + private String personName; + //员工类型:工号,黑名单类型:黑名单编号,访客类型:无 + private String personNo; + //人员图片 + private String personPicture; + //性别 + private String gender; + + @JsonIgnore + private String staffCode; + @JsonIgnore + private String picUri; + @JsonIgnore + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java new file mode 100644 index 0000000..afd8673 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/9 16:59 + */ +@Data +public class SearchPicturesResponse { + private String devName; + private String drawNo; + private String position; + private String positionName; + private String area; + private String areaName; + private String facePicUrl; + private String bkgPicUrl; + private String similarity; + private String time; + private String sex; + private String rect; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java new file mode 100644 index 0000000..ce703af --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/29 16:24 + */ +@Data +public class RepairTodayDTO { + private Integer number; + private String position; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index bb00c7c..8de64ef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -14,6 +14,7 @@ import com.casic.missiles.modular.model.StatisticNumber; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.service.StaffInoutLogService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -46,6 +47,8 @@ private AbstractDictService dictService; @Autowired private StaffInfoService staffInfoService; + @Autowired + private StaffInoutLogService inoutLogService; /** * 统计一期二期楼栋,每小时存储各楼栋人数 @@ -130,6 +133,15 @@ } + /** + * 每天0点删除一周外的人员进出记录 + */ + @Scheduled(cron = "0 0 0 * * ?") + @Transactional + public void deleteStaffInOutLog() { + inoutLogService.deleteMoreThanWeekLog(); + } + private List getSyncPersonList(PersonListRequest request, JSONObject resultJson, List personList) { if (!"0".equals(resultJson.get("code"))) { log.error("请求海康,获取人员列表v2失败,海康response:{}", resultJson.toJSONString()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java index 7a7fe8a..fbfda1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java @@ -45,4 +45,8 @@ Object areaScore(SecurityScoreDTO securityScoreDTO); Object heatMap(HeatMapDTO heatMapDTO); + + Object eventNumber(); + + Object offlineRate(); } 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 7e29e1f..09efe70 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 @@ -66,4 +66,6 @@ DeviceInfo deviceInfoByDrawNo(String drawNo); List getDeviceStatusGroupByArea(DeviceAreaRequest deviceAreaRequest); + + DeviceInfo selectByIndexCode(String cameraIndexCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java new file mode 100644 index 0000000..445467d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询响应 + * @Author: wangpeng + * @Date: 2023/1/30 9:11 + */ +@Data +public class PersonListResponse { + //人员类型,黑名单/访客/员工所属组织 + private String personType; + //姓名 + private String personName; + //员工类型:工号,黑名单类型:黑名单编号,访客类型:无 + private String personNo; + //人员图片 + private String personPicture; + //性别 + private String gender; + + @JsonIgnore + private String staffCode; + @JsonIgnore + private String picUri; + @JsonIgnore + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java new file mode 100644 index 0000000..afd8673 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/9 16:59 + */ +@Data +public class SearchPicturesResponse { + private String devName; + private String drawNo; + private String position; + private String positionName; + private String area; + private String areaName; + private String facePicUrl; + private String bkgPicUrl; + private String similarity; + private String time; + private String sex; + private String rect; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java new file mode 100644 index 0000000..ce703af --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/29 16:24 + */ +@Data +public class RepairTodayDTO { + private Integer number; + private String position; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index bb00c7c..8de64ef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -14,6 +14,7 @@ import com.casic.missiles.modular.model.StatisticNumber; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.service.StaffInoutLogService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -46,6 +47,8 @@ private AbstractDictService dictService; @Autowired private StaffInfoService staffInfoService; + @Autowired + private StaffInoutLogService inoutLogService; /** * 统计一期二期楼栋,每小时存储各楼栋人数 @@ -130,6 +133,15 @@ } + /** + * 每天0点删除一周外的人员进出记录 + */ + @Scheduled(cron = "0 0 0 * * ?") + @Transactional + public void deleteStaffInOutLog() { + inoutLogService.deleteMoreThanWeekLog(); + } + private List getSyncPersonList(PersonListRequest request, JSONObject resultJson, List personList) { if (!"0".equals(resultJson.get("code"))) { log.error("请求海康,获取人员列表v2失败,海康response:{}", resultJson.toJSONString()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java index 7a7fe8a..fbfda1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java @@ -45,4 +45,8 @@ Object areaScore(SecurityScoreDTO securityScoreDTO); Object heatMap(HeatMapDTO heatMapDTO); + + Object eventNumber(); + + Object offlineRate(); } 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 7e29e1f..09efe70 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 @@ -66,4 +66,6 @@ DeviceInfo deviceInfoByDrawNo(String drawNo); List getDeviceStatusGroupByArea(DeviceAreaRequest deviceAreaRequest); + + DeviceInfo selectByIndexCode(String cameraIndexCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java index 5b8189f..09fce1a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java @@ -1,8 +1,12 @@ package com.casic.missiles.modular.service; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; +import java.util.List; + /** * @Description: * @Author: wangpeng @@ -42,4 +46,8 @@ Object other(); Object highFrequency(); + + Object securityScore(); + + List personList(PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java new file mode 100644 index 0000000..445467d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询响应 + * @Author: wangpeng + * @Date: 2023/1/30 9:11 + */ +@Data +public class PersonListResponse { + //人员类型,黑名单/访客/员工所属组织 + private String personType; + //姓名 + private String personName; + //员工类型:工号,黑名单类型:黑名单编号,访客类型:无 + private String personNo; + //人员图片 + private String personPicture; + //性别 + private String gender; + + @JsonIgnore + private String staffCode; + @JsonIgnore + private String picUri; + @JsonIgnore + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java new file mode 100644 index 0000000..afd8673 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/9 16:59 + */ +@Data +public class SearchPicturesResponse { + private String devName; + private String drawNo; + private String position; + private String positionName; + private String area; + private String areaName; + private String facePicUrl; + private String bkgPicUrl; + private String similarity; + private String time; + private String sex; + private String rect; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java new file mode 100644 index 0000000..ce703af --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/29 16:24 + */ +@Data +public class RepairTodayDTO { + private Integer number; + private String position; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index bb00c7c..8de64ef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -14,6 +14,7 @@ import com.casic.missiles.modular.model.StatisticNumber; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.service.StaffInoutLogService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -46,6 +47,8 @@ private AbstractDictService dictService; @Autowired private StaffInfoService staffInfoService; + @Autowired + private StaffInoutLogService inoutLogService; /** * 统计一期二期楼栋,每小时存储各楼栋人数 @@ -130,6 +133,15 @@ } + /** + * 每天0点删除一周外的人员进出记录 + */ + @Scheduled(cron = "0 0 0 * * ?") + @Transactional + public void deleteStaffInOutLog() { + inoutLogService.deleteMoreThanWeekLog(); + } + private List getSyncPersonList(PersonListRequest request, JSONObject resultJson, List personList) { if (!"0".equals(resultJson.get("code"))) { log.error("请求海康,获取人员列表v2失败,海康response:{}", resultJson.toJSONString()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java index 7a7fe8a..fbfda1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java @@ -45,4 +45,8 @@ Object areaScore(SecurityScoreDTO securityScoreDTO); Object heatMap(HeatMapDTO heatMapDTO); + + Object eventNumber(); + + Object offlineRate(); } 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 7e29e1f..09efe70 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 @@ -66,4 +66,6 @@ DeviceInfo deviceInfoByDrawNo(String drawNo); List getDeviceStatusGroupByArea(DeviceAreaRequest deviceAreaRequest); + + DeviceInfo selectByIndexCode(String cameraIndexCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java index 5b8189f..09fce1a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java @@ -1,8 +1,12 @@ package com.casic.missiles.modular.service; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; +import java.util.List; + /** * @Description: * @Author: wangpeng @@ -42,4 +46,8 @@ Object other(); Object highFrequency(); + + Object securityScore(); + + List personList(PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java index 5a92eba..ed5b3a4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java @@ -15,4 +15,6 @@ public interface StaffInoutLogService extends IService { List staffInoutLogListPage(Page page, StaffInoutLogRequest inoutLogRequest); + + void deleteMoreThanWeekLog(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java new file mode 100644 index 0000000..445467d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询响应 + * @Author: wangpeng + * @Date: 2023/1/30 9:11 + */ +@Data +public class PersonListResponse { + //人员类型,黑名单/访客/员工所属组织 + private String personType; + //姓名 + private String personName; + //员工类型:工号,黑名单类型:黑名单编号,访客类型:无 + private String personNo; + //人员图片 + private String personPicture; + //性别 + private String gender; + + @JsonIgnore + private String staffCode; + @JsonIgnore + private String picUri; + @JsonIgnore + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java new file mode 100644 index 0000000..afd8673 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/9 16:59 + */ +@Data +public class SearchPicturesResponse { + private String devName; + private String drawNo; + private String position; + private String positionName; + private String area; + private String areaName; + private String facePicUrl; + private String bkgPicUrl; + private String similarity; + private String time; + private String sex; + private String rect; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java new file mode 100644 index 0000000..ce703af --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/29 16:24 + */ +@Data +public class RepairTodayDTO { + private Integer number; + private String position; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index bb00c7c..8de64ef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -14,6 +14,7 @@ import com.casic.missiles.modular.model.StatisticNumber; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.service.StaffInoutLogService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -46,6 +47,8 @@ private AbstractDictService dictService; @Autowired private StaffInfoService staffInfoService; + @Autowired + private StaffInoutLogService inoutLogService; /** * 统计一期二期楼栋,每小时存储各楼栋人数 @@ -130,6 +133,15 @@ } + /** + * 每天0点删除一周外的人员进出记录 + */ + @Scheduled(cron = "0 0 0 * * ?") + @Transactional + public void deleteStaffInOutLog() { + inoutLogService.deleteMoreThanWeekLog(); + } + private List getSyncPersonList(PersonListRequest request, JSONObject resultJson, List personList) { if (!"0".equals(resultJson.get("code"))) { log.error("请求海康,获取人员列表v2失败,海康response:{}", resultJson.toJSONString()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java index 7a7fe8a..fbfda1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java @@ -45,4 +45,8 @@ Object areaScore(SecurityScoreDTO securityScoreDTO); Object heatMap(HeatMapDTO heatMapDTO); + + Object eventNumber(); + + Object offlineRate(); } 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 7e29e1f..09efe70 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 @@ -66,4 +66,6 @@ DeviceInfo deviceInfoByDrawNo(String drawNo); List getDeviceStatusGroupByArea(DeviceAreaRequest deviceAreaRequest); + + DeviceInfo selectByIndexCode(String cameraIndexCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java index 5b8189f..09fce1a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java @@ -1,8 +1,12 @@ package com.casic.missiles.modular.service; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; +import java.util.List; + /** * @Description: * @Author: wangpeng @@ -42,4 +46,8 @@ Object other(); Object highFrequency(); + + Object securityScore(); + + List personList(PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java index 5a92eba..ed5b3a4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java @@ -15,4 +15,6 @@ public interface StaffInoutLogService extends IService { List staffInoutLogListPage(Page page, StaffInoutLogRequest inoutLogRequest); + + void deleteMoreThanWeekLog(); } 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 1c34f68..972d3ab 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 @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.config.DeviceLinkageConfig; import com.casic.missiles.modular.dao.CaseInfoMapper; import com.casic.missiles.modular.dao.CategoryLevelMapper; import com.casic.missiles.modular.dao.DeviceInfoMapper; @@ -59,6 +60,9 @@ @Resource private DeviceInfoMapper deviceInfoMapper; + @Autowired + private DeviceLinkageConfig deviceLinkageConfig; + @Override public List caseInfoListPage(Page page, CaseInfoRequest caseInfoRequest) { try { @@ -78,6 +82,29 @@ @Override public int updateStatus(CaseInfoRequest caseInfoRequest) { +// //若事件为黑名单事件且事件为未解决,将闸机设置为门闭(即非常闭,可正常开关门) +// CaseInfo caseInfo = caseInfoMapper.selectById(caseInfoRequest.getId()); +// if(!Objects.isNull(caseInfo) && 1644175361 == caseInfo.getHikEventType() +// && caseInfo.getDescription().contains("黑名单") && "3" != caseInfo.getStatus() +// && "3" == caseInfoRequest.getStatus()){ +// HashMap> configMap = deviceLinkageConfig.getConfigMap(); +// List list = configMap.get(caseInfo.getIndexCode()); +// //海康门禁点反控 +// DoorControlRequest doorControlRequest = new DoorControlRequest(); +// //需根据设备编号获取到对应的门禁点唯一标识 +// doorControlRequest.setDoorIndexCodes(list); +// //门闭 +// doorControlRequest.setControlType(1); +// String body = JSONObject.toJSONString(doorControlRequest); +// String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); +// JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); +// if (!"0".equals(resultJson.get("code"))) { +// log.error("解决黑名单事件,请求海康,门禁点反控失败,海康response:{}", resultStr); +// }else{ +// log.info("解决黑名单事件,请求海康,门禁点反控成功"); +// } +// } + return caseInfoMapper.updateStatusById(caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java new file mode 100644 index 0000000..445467d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询响应 + * @Author: wangpeng + * @Date: 2023/1/30 9:11 + */ +@Data +public class PersonListResponse { + //人员类型,黑名单/访客/员工所属组织 + private String personType; + //姓名 + private String personName; + //员工类型:工号,黑名单类型:黑名单编号,访客类型:无 + private String personNo; + //人员图片 + private String personPicture; + //性别 + private String gender; + + @JsonIgnore + private String staffCode; + @JsonIgnore + private String picUri; + @JsonIgnore + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java new file mode 100644 index 0000000..afd8673 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/9 16:59 + */ +@Data +public class SearchPicturesResponse { + private String devName; + private String drawNo; + private String position; + private String positionName; + private String area; + private String areaName; + private String facePicUrl; + private String bkgPicUrl; + private String similarity; + private String time; + private String sex; + private String rect; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java new file mode 100644 index 0000000..ce703af --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/29 16:24 + */ +@Data +public class RepairTodayDTO { + private Integer number; + private String position; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index bb00c7c..8de64ef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -14,6 +14,7 @@ import com.casic.missiles.modular.model.StatisticNumber; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.service.StaffInoutLogService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -46,6 +47,8 @@ private AbstractDictService dictService; @Autowired private StaffInfoService staffInfoService; + @Autowired + private StaffInoutLogService inoutLogService; /** * 统计一期二期楼栋,每小时存储各楼栋人数 @@ -130,6 +133,15 @@ } + /** + * 每天0点删除一周外的人员进出记录 + */ + @Scheduled(cron = "0 0 0 * * ?") + @Transactional + public void deleteStaffInOutLog() { + inoutLogService.deleteMoreThanWeekLog(); + } + private List getSyncPersonList(PersonListRequest request, JSONObject resultJson, List personList) { if (!"0".equals(resultJson.get("code"))) { log.error("请求海康,获取人员列表v2失败,海康response:{}", resultJson.toJSONString()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java index 7a7fe8a..fbfda1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java @@ -45,4 +45,8 @@ Object areaScore(SecurityScoreDTO securityScoreDTO); Object heatMap(HeatMapDTO heatMapDTO); + + Object eventNumber(); + + Object offlineRate(); } 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 7e29e1f..09efe70 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 @@ -66,4 +66,6 @@ DeviceInfo deviceInfoByDrawNo(String drawNo); List getDeviceStatusGroupByArea(DeviceAreaRequest deviceAreaRequest); + + DeviceInfo selectByIndexCode(String cameraIndexCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java index 5b8189f..09fce1a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java @@ -1,8 +1,12 @@ package com.casic.missiles.modular.service; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; +import java.util.List; + /** * @Description: * @Author: wangpeng @@ -42,4 +46,8 @@ Object other(); Object highFrequency(); + + Object securityScore(); + + List personList(PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java index 5a92eba..ed5b3a4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java @@ -15,4 +15,6 @@ public interface StaffInoutLogService extends IService { List staffInoutLogListPage(Page page, StaffInoutLogRequest inoutLogRequest); + + void deleteMoreThanWeekLog(); } 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 1c34f68..972d3ab 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 @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.config.DeviceLinkageConfig; import com.casic.missiles.modular.dao.CaseInfoMapper; import com.casic.missiles.modular.dao.CategoryLevelMapper; import com.casic.missiles.modular.dao.DeviceInfoMapper; @@ -59,6 +60,9 @@ @Resource private DeviceInfoMapper deviceInfoMapper; + @Autowired + private DeviceLinkageConfig deviceLinkageConfig; + @Override public List caseInfoListPage(Page page, CaseInfoRequest caseInfoRequest) { try { @@ -78,6 +82,29 @@ @Override public int updateStatus(CaseInfoRequest caseInfoRequest) { +// //若事件为黑名单事件且事件为未解决,将闸机设置为门闭(即非常闭,可正常开关门) +// CaseInfo caseInfo = caseInfoMapper.selectById(caseInfoRequest.getId()); +// if(!Objects.isNull(caseInfo) && 1644175361 == caseInfo.getHikEventType() +// && caseInfo.getDescription().contains("黑名单") && "3" != caseInfo.getStatus() +// && "3" == caseInfoRequest.getStatus()){ +// HashMap> configMap = deviceLinkageConfig.getConfigMap(); +// List list = configMap.get(caseInfo.getIndexCode()); +// //海康门禁点反控 +// DoorControlRequest doorControlRequest = new DoorControlRequest(); +// //需根据设备编号获取到对应的门禁点唯一标识 +// doorControlRequest.setDoorIndexCodes(list); +// //门闭 +// doorControlRequest.setControlType(1); +// String body = JSONObject.toJSONString(doorControlRequest); +// String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); +// JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); +// if (!"0".equals(resultJson.get("code"))) { +// log.error("解决黑名单事件,请求海康,门禁点反控失败,海康response:{}", resultStr); +// }else{ +// log.info("解决黑名单事件,请求海康,门禁点反控成功"); +// } +// } + return caseInfoMapper.updateStatusById(caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index f452b5f..6f4956b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -105,7 +105,7 @@ doorEventsRequest.setPageNo(i); String body1 = JSONObject.toJSONString(doorEventsRequest); String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); - JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); if (!"0".equals(resultJson1.get("code"))) { log.error("请求海康,循环查询海康门禁点事件v2失败,海康response:{}", resultStr1); return; @@ -147,7 +147,7 @@ //进门 if (1 == inAndOutType) { ++num; - } else if (0 == inAndOutType) { + } else { --num; } } @@ -655,6 +655,33 @@ return ResponseData.success(resultMap); } + @Override + public Object eventNumber() { + List caseInfos = caseInfoMapper.selectListByToday4(); + List resolvedCaseInfos = caseInfos.stream().filter(caseInfo -> "3".equals(caseInfo.getStatus())).collect(Collectors.toList()); + HashMap resultMap = new HashMap<>(); + resultMap.put("今日事件数", caseInfos.size()); + resultMap.put("今日事件处置数", resolvedCaseInfos.size()); + return ResponseData.success(resultMap); + } + + @Override + public Object offlineRate() { + QueryWrapper wrapper = new QueryWrapper<>(); + Integer total = deviceInfoMapper.selectCount(wrapper); + QueryWrapper wrapper1 = new QueryWrapper<>(); + wrapper1.eq("status", 2); //字典值:在线1、离线2、故障3 + Integer offline = deviceInfoMapper.selectCount(wrapper1); + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format((float) offline / (float) total * 100); + HashMap resultMap = new HashMap<>(); +// resultMap.put("设备总数", total); + resultMap.put("设备离线率", result + "%"); + return ResponseData.success(resultMap); + } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { resultMap.keySet().forEach(key -> { List monthAndLevelGroupDTOS = resultMap.get(key); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java new file mode 100644 index 0000000..445467d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询响应 + * @Author: wangpeng + * @Date: 2023/1/30 9:11 + */ +@Data +public class PersonListResponse { + //人员类型,黑名单/访客/员工所属组织 + private String personType; + //姓名 + private String personName; + //员工类型:工号,黑名单类型:黑名单编号,访客类型:无 + private String personNo; + //人员图片 + private String personPicture; + //性别 + private String gender; + + @JsonIgnore + private String staffCode; + @JsonIgnore + private String picUri; + @JsonIgnore + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java new file mode 100644 index 0000000..afd8673 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/9 16:59 + */ +@Data +public class SearchPicturesResponse { + private String devName; + private String drawNo; + private String position; + private String positionName; + private String area; + private String areaName; + private String facePicUrl; + private String bkgPicUrl; + private String similarity; + private String time; + private String sex; + private String rect; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java new file mode 100644 index 0000000..ce703af --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/29 16:24 + */ +@Data +public class RepairTodayDTO { + private Integer number; + private String position; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index bb00c7c..8de64ef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -14,6 +14,7 @@ import com.casic.missiles.modular.model.StatisticNumber; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.service.StaffInoutLogService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -46,6 +47,8 @@ private AbstractDictService dictService; @Autowired private StaffInfoService staffInfoService; + @Autowired + private StaffInoutLogService inoutLogService; /** * 统计一期二期楼栋,每小时存储各楼栋人数 @@ -130,6 +133,15 @@ } + /** + * 每天0点删除一周外的人员进出记录 + */ + @Scheduled(cron = "0 0 0 * * ?") + @Transactional + public void deleteStaffInOutLog() { + inoutLogService.deleteMoreThanWeekLog(); + } + private List getSyncPersonList(PersonListRequest request, JSONObject resultJson, List personList) { if (!"0".equals(resultJson.get("code"))) { log.error("请求海康,获取人员列表v2失败,海康response:{}", resultJson.toJSONString()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java index 7a7fe8a..fbfda1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java @@ -45,4 +45,8 @@ Object areaScore(SecurityScoreDTO securityScoreDTO); Object heatMap(HeatMapDTO heatMapDTO); + + Object eventNumber(); + + Object offlineRate(); } 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 7e29e1f..09efe70 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 @@ -66,4 +66,6 @@ DeviceInfo deviceInfoByDrawNo(String drawNo); List getDeviceStatusGroupByArea(DeviceAreaRequest deviceAreaRequest); + + DeviceInfo selectByIndexCode(String cameraIndexCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java index 5b8189f..09fce1a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java @@ -1,8 +1,12 @@ package com.casic.missiles.modular.service; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; +import java.util.List; + /** * @Description: * @Author: wangpeng @@ -42,4 +46,8 @@ Object other(); Object highFrequency(); + + Object securityScore(); + + List personList(PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java index 5a92eba..ed5b3a4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java @@ -15,4 +15,6 @@ public interface StaffInoutLogService extends IService { List staffInoutLogListPage(Page page, StaffInoutLogRequest inoutLogRequest); + + void deleteMoreThanWeekLog(); } 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 1c34f68..972d3ab 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 @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.config.DeviceLinkageConfig; import com.casic.missiles.modular.dao.CaseInfoMapper; import com.casic.missiles.modular.dao.CategoryLevelMapper; import com.casic.missiles.modular.dao.DeviceInfoMapper; @@ -59,6 +60,9 @@ @Resource private DeviceInfoMapper deviceInfoMapper; + @Autowired + private DeviceLinkageConfig deviceLinkageConfig; + @Override public List caseInfoListPage(Page page, CaseInfoRequest caseInfoRequest) { try { @@ -78,6 +82,29 @@ @Override public int updateStatus(CaseInfoRequest caseInfoRequest) { +// //若事件为黑名单事件且事件为未解决,将闸机设置为门闭(即非常闭,可正常开关门) +// CaseInfo caseInfo = caseInfoMapper.selectById(caseInfoRequest.getId()); +// if(!Objects.isNull(caseInfo) && 1644175361 == caseInfo.getHikEventType() +// && caseInfo.getDescription().contains("黑名单") && "3" != caseInfo.getStatus() +// && "3" == caseInfoRequest.getStatus()){ +// HashMap> configMap = deviceLinkageConfig.getConfigMap(); +// List list = configMap.get(caseInfo.getIndexCode()); +// //海康门禁点反控 +// DoorControlRequest doorControlRequest = new DoorControlRequest(); +// //需根据设备编号获取到对应的门禁点唯一标识 +// doorControlRequest.setDoorIndexCodes(list); +// //门闭 +// doorControlRequest.setControlType(1); +// String body = JSONObject.toJSONString(doorControlRequest); +// String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); +// JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); +// if (!"0".equals(resultJson.get("code"))) { +// log.error("解决黑名单事件,请求海康,门禁点反控失败,海康response:{}", resultStr); +// }else{ +// log.info("解决黑名单事件,请求海康,门禁点反控成功"); +// } +// } + return caseInfoMapper.updateStatusById(caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index f452b5f..6f4956b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -105,7 +105,7 @@ doorEventsRequest.setPageNo(i); String body1 = JSONObject.toJSONString(doorEventsRequest); String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); - JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); if (!"0".equals(resultJson1.get("code"))) { log.error("请求海康,循环查询海康门禁点事件v2失败,海康response:{}", resultStr1); return; @@ -147,7 +147,7 @@ //进门 if (1 == inAndOutType) { ++num; - } else if (0 == inAndOutType) { + } else { --num; } } @@ -655,6 +655,33 @@ return ResponseData.success(resultMap); } + @Override + public Object eventNumber() { + List caseInfos = caseInfoMapper.selectListByToday4(); + List resolvedCaseInfos = caseInfos.stream().filter(caseInfo -> "3".equals(caseInfo.getStatus())).collect(Collectors.toList()); + HashMap resultMap = new HashMap<>(); + resultMap.put("今日事件数", caseInfos.size()); + resultMap.put("今日事件处置数", resolvedCaseInfos.size()); + return ResponseData.success(resultMap); + } + + @Override + public Object offlineRate() { + QueryWrapper wrapper = new QueryWrapper<>(); + Integer total = deviceInfoMapper.selectCount(wrapper); + QueryWrapper wrapper1 = new QueryWrapper<>(); + wrapper1.eq("status", 2); //字典值:在线1、离线2、故障3 + Integer offline = deviceInfoMapper.selectCount(wrapper1); + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format((float) offline / (float) total * 100); + HashMap resultMap = new HashMap<>(); +// resultMap.put("设备总数", total); + resultMap.put("设备离线率", result + "%"); + return ResponseData.success(resultMap); + } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { resultMap.keySet().forEach(key -> { List monthAndLevelGroupDTOS = resultMap.get(key); 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 2dd34b6..76d8ff6 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 @@ -469,4 +469,12 @@ return deviceStatusDTOS; } + @Override + public DeviceInfo selectByIndexCode(String cameraIndexCode) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("index_code", cameraIndexCode); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java new file mode 100644 index 0000000..445467d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询响应 + * @Author: wangpeng + * @Date: 2023/1/30 9:11 + */ +@Data +public class PersonListResponse { + //人员类型,黑名单/访客/员工所属组织 + private String personType; + //姓名 + private String personName; + //员工类型:工号,黑名单类型:黑名单编号,访客类型:无 + private String personNo; + //人员图片 + private String personPicture; + //性别 + private String gender; + + @JsonIgnore + private String staffCode; + @JsonIgnore + private String picUri; + @JsonIgnore + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java new file mode 100644 index 0000000..afd8673 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/9 16:59 + */ +@Data +public class SearchPicturesResponse { + private String devName; + private String drawNo; + private String position; + private String positionName; + private String area; + private String areaName; + private String facePicUrl; + private String bkgPicUrl; + private String similarity; + private String time; + private String sex; + private String rect; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java new file mode 100644 index 0000000..ce703af --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/29 16:24 + */ +@Data +public class RepairTodayDTO { + private Integer number; + private String position; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index bb00c7c..8de64ef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -14,6 +14,7 @@ import com.casic.missiles.modular.model.StatisticNumber; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.service.StaffInoutLogService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -46,6 +47,8 @@ private AbstractDictService dictService; @Autowired private StaffInfoService staffInfoService; + @Autowired + private StaffInoutLogService inoutLogService; /** * 统计一期二期楼栋,每小时存储各楼栋人数 @@ -130,6 +133,15 @@ } + /** + * 每天0点删除一周外的人员进出记录 + */ + @Scheduled(cron = "0 0 0 * * ?") + @Transactional + public void deleteStaffInOutLog() { + inoutLogService.deleteMoreThanWeekLog(); + } + private List getSyncPersonList(PersonListRequest request, JSONObject resultJson, List personList) { if (!"0".equals(resultJson.get("code"))) { log.error("请求海康,获取人员列表v2失败,海康response:{}", resultJson.toJSONString()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java index 7a7fe8a..fbfda1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java @@ -45,4 +45,8 @@ Object areaScore(SecurityScoreDTO securityScoreDTO); Object heatMap(HeatMapDTO heatMapDTO); + + Object eventNumber(); + + Object offlineRate(); } 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 7e29e1f..09efe70 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 @@ -66,4 +66,6 @@ DeviceInfo deviceInfoByDrawNo(String drawNo); List getDeviceStatusGroupByArea(DeviceAreaRequest deviceAreaRequest); + + DeviceInfo selectByIndexCode(String cameraIndexCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java index 5b8189f..09fce1a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java @@ -1,8 +1,12 @@ package com.casic.missiles.modular.service; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; +import java.util.List; + /** * @Description: * @Author: wangpeng @@ -42,4 +46,8 @@ Object other(); Object highFrequency(); + + Object securityScore(); + + List personList(PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java index 5a92eba..ed5b3a4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java @@ -15,4 +15,6 @@ public interface StaffInoutLogService extends IService { List staffInoutLogListPage(Page page, StaffInoutLogRequest inoutLogRequest); + + void deleteMoreThanWeekLog(); } 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 1c34f68..972d3ab 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 @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.config.DeviceLinkageConfig; import com.casic.missiles.modular.dao.CaseInfoMapper; import com.casic.missiles.modular.dao.CategoryLevelMapper; import com.casic.missiles.modular.dao.DeviceInfoMapper; @@ -59,6 +60,9 @@ @Resource private DeviceInfoMapper deviceInfoMapper; + @Autowired + private DeviceLinkageConfig deviceLinkageConfig; + @Override public List caseInfoListPage(Page page, CaseInfoRequest caseInfoRequest) { try { @@ -78,6 +82,29 @@ @Override public int updateStatus(CaseInfoRequest caseInfoRequest) { +// //若事件为黑名单事件且事件为未解决,将闸机设置为门闭(即非常闭,可正常开关门) +// CaseInfo caseInfo = caseInfoMapper.selectById(caseInfoRequest.getId()); +// if(!Objects.isNull(caseInfo) && 1644175361 == caseInfo.getHikEventType() +// && caseInfo.getDescription().contains("黑名单") && "3" != caseInfo.getStatus() +// && "3" == caseInfoRequest.getStatus()){ +// HashMap> configMap = deviceLinkageConfig.getConfigMap(); +// List list = configMap.get(caseInfo.getIndexCode()); +// //海康门禁点反控 +// DoorControlRequest doorControlRequest = new DoorControlRequest(); +// //需根据设备编号获取到对应的门禁点唯一标识 +// doorControlRequest.setDoorIndexCodes(list); +// //门闭 +// doorControlRequest.setControlType(1); +// String body = JSONObject.toJSONString(doorControlRequest); +// String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); +// JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); +// if (!"0".equals(resultJson.get("code"))) { +// log.error("解决黑名单事件,请求海康,门禁点反控失败,海康response:{}", resultStr); +// }else{ +// log.info("解决黑名单事件,请求海康,门禁点反控成功"); +// } +// } + return caseInfoMapper.updateStatusById(caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index f452b5f..6f4956b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -105,7 +105,7 @@ doorEventsRequest.setPageNo(i); String body1 = JSONObject.toJSONString(doorEventsRequest); String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); - JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); if (!"0".equals(resultJson1.get("code"))) { log.error("请求海康,循环查询海康门禁点事件v2失败,海康response:{}", resultStr1); return; @@ -147,7 +147,7 @@ //进门 if (1 == inAndOutType) { ++num; - } else if (0 == inAndOutType) { + } else { --num; } } @@ -655,6 +655,33 @@ return ResponseData.success(resultMap); } + @Override + public Object eventNumber() { + List caseInfos = caseInfoMapper.selectListByToday4(); + List resolvedCaseInfos = caseInfos.stream().filter(caseInfo -> "3".equals(caseInfo.getStatus())).collect(Collectors.toList()); + HashMap resultMap = new HashMap<>(); + resultMap.put("今日事件数", caseInfos.size()); + resultMap.put("今日事件处置数", resolvedCaseInfos.size()); + return ResponseData.success(resultMap); + } + + @Override + public Object offlineRate() { + QueryWrapper wrapper = new QueryWrapper<>(); + Integer total = deviceInfoMapper.selectCount(wrapper); + QueryWrapper wrapper1 = new QueryWrapper<>(); + wrapper1.eq("status", 2); //字典值:在线1、离线2、故障3 + Integer offline = deviceInfoMapper.selectCount(wrapper1); + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format((float) offline / (float) total * 100); + HashMap resultMap = new HashMap<>(); +// resultMap.put("设备总数", total); + resultMap.put("设备离线率", result + "%"); + return ResponseData.success(resultMap); + } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { resultMap.keySet().forEach(key -> { List monthAndLevelGroupDTOS = resultMap.get(key); 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 2dd34b6..76d8ff6 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 @@ -469,4 +469,12 @@ return deviceStatusDTOS; } + @Override + public DeviceInfo selectByIndexCode(String cameraIndexCode) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("index_code", cameraIndexCode); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } + } 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 0f02ccb..c676f2a 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,6 +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.config.DeviceLinkageConfig; import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; @@ -31,27 +32,22 @@ @Slf4j @Service public class HikServiceImpl implements HikService { - @Resource private AbstractDictService dictService; - @Autowired private StaffInfoMapper staffInfoMapper; - @Autowired private AttendanceInfoMapper attendanceInfoMapper; - @Autowired private VisitInfoMapper visitInfoMapper; - @Autowired private DeviceInfoMapper deviceInfoMapper; - @Autowired private CaseInfoMapper caseInfoMapper; - @Autowired private StaffInoutLogMapper inoutLogMapper; + @Autowired + private DeviceLinkageConfig deviceLinkageConfig; @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { @@ -71,6 +67,26 @@ log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } +// //发生黑名单事件,若匹配联动配置,常闭指定闸机 +// HashMap> configMap = deviceLinkageConfig.getConfigMap(); +// if(!CollectionUtils.isEmpty(configMap.get(srcIndex))){ +// List list = configMap.get(srcIndex); +// //海康门禁点反控 +// DoorControlRequest doorControlRequest = new DoorControlRequest(); +// //需根据设备编号获取到对应的门禁点唯一标识 +// doorControlRequest.setDoorIndexCodes(list); +// //常闭 +// doorControlRequest.setControlType(3); +// String body = JSONObject.toJSONString(doorControlRequest); +// String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); +// JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); +// if (!"0".equals(resultJson.get("code"))) { +// log.error("发生黑名单事件,请求海康,门禁点反控失败,海康response:{}", resultStr); +// }else{ +// log.info("发生黑名单事件,请求海康,门禁点反控成功"); +// } +// } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java new file mode 100644 index 0000000..445467d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询响应 + * @Author: wangpeng + * @Date: 2023/1/30 9:11 + */ +@Data +public class PersonListResponse { + //人员类型,黑名单/访客/员工所属组织 + private String personType; + //姓名 + private String personName; + //员工类型:工号,黑名单类型:黑名单编号,访客类型:无 + private String personNo; + //人员图片 + private String personPicture; + //性别 + private String gender; + + @JsonIgnore + private String staffCode; + @JsonIgnore + private String picUri; + @JsonIgnore + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java new file mode 100644 index 0000000..afd8673 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/9 16:59 + */ +@Data +public class SearchPicturesResponse { + private String devName; + private String drawNo; + private String position; + private String positionName; + private String area; + private String areaName; + private String facePicUrl; + private String bkgPicUrl; + private String similarity; + private String time; + private String sex; + private String rect; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java new file mode 100644 index 0000000..ce703af --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/29 16:24 + */ +@Data +public class RepairTodayDTO { + private Integer number; + private String position; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index bb00c7c..8de64ef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -14,6 +14,7 @@ import com.casic.missiles.modular.model.StatisticNumber; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.service.StaffInoutLogService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -46,6 +47,8 @@ private AbstractDictService dictService; @Autowired private StaffInfoService staffInfoService; + @Autowired + private StaffInoutLogService inoutLogService; /** * 统计一期二期楼栋,每小时存储各楼栋人数 @@ -130,6 +133,15 @@ } + /** + * 每天0点删除一周外的人员进出记录 + */ + @Scheduled(cron = "0 0 0 * * ?") + @Transactional + public void deleteStaffInOutLog() { + inoutLogService.deleteMoreThanWeekLog(); + } + private List getSyncPersonList(PersonListRequest request, JSONObject resultJson, List personList) { if (!"0".equals(resultJson.get("code"))) { log.error("请求海康,获取人员列表v2失败,海康response:{}", resultJson.toJSONString()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java index 7a7fe8a..fbfda1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java @@ -45,4 +45,8 @@ Object areaScore(SecurityScoreDTO securityScoreDTO); Object heatMap(HeatMapDTO heatMapDTO); + + Object eventNumber(); + + Object offlineRate(); } 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 7e29e1f..09efe70 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 @@ -66,4 +66,6 @@ DeviceInfo deviceInfoByDrawNo(String drawNo); List getDeviceStatusGroupByArea(DeviceAreaRequest deviceAreaRequest); + + DeviceInfo selectByIndexCode(String cameraIndexCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java index 5b8189f..09fce1a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java @@ -1,8 +1,12 @@ package com.casic.missiles.modular.service; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; +import java.util.List; + /** * @Description: * @Author: wangpeng @@ -42,4 +46,8 @@ Object other(); Object highFrequency(); + + Object securityScore(); + + List personList(PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java index 5a92eba..ed5b3a4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java @@ -15,4 +15,6 @@ public interface StaffInoutLogService extends IService { List staffInoutLogListPage(Page page, StaffInoutLogRequest inoutLogRequest); + + void deleteMoreThanWeekLog(); } 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 1c34f68..972d3ab 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 @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.config.DeviceLinkageConfig; import com.casic.missiles.modular.dao.CaseInfoMapper; import com.casic.missiles.modular.dao.CategoryLevelMapper; import com.casic.missiles.modular.dao.DeviceInfoMapper; @@ -59,6 +60,9 @@ @Resource private DeviceInfoMapper deviceInfoMapper; + @Autowired + private DeviceLinkageConfig deviceLinkageConfig; + @Override public List caseInfoListPage(Page page, CaseInfoRequest caseInfoRequest) { try { @@ -78,6 +82,29 @@ @Override public int updateStatus(CaseInfoRequest caseInfoRequest) { +// //若事件为黑名单事件且事件为未解决,将闸机设置为门闭(即非常闭,可正常开关门) +// CaseInfo caseInfo = caseInfoMapper.selectById(caseInfoRequest.getId()); +// if(!Objects.isNull(caseInfo) && 1644175361 == caseInfo.getHikEventType() +// && caseInfo.getDescription().contains("黑名单") && "3" != caseInfo.getStatus() +// && "3" == caseInfoRequest.getStatus()){ +// HashMap> configMap = deviceLinkageConfig.getConfigMap(); +// List list = configMap.get(caseInfo.getIndexCode()); +// //海康门禁点反控 +// DoorControlRequest doorControlRequest = new DoorControlRequest(); +// //需根据设备编号获取到对应的门禁点唯一标识 +// doorControlRequest.setDoorIndexCodes(list); +// //门闭 +// doorControlRequest.setControlType(1); +// String body = JSONObject.toJSONString(doorControlRequest); +// String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); +// JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); +// if (!"0".equals(resultJson.get("code"))) { +// log.error("解决黑名单事件,请求海康,门禁点反控失败,海康response:{}", resultStr); +// }else{ +// log.info("解决黑名单事件,请求海康,门禁点反控成功"); +// } +// } + return caseInfoMapper.updateStatusById(caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index f452b5f..6f4956b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -105,7 +105,7 @@ doorEventsRequest.setPageNo(i); String body1 = JSONObject.toJSONString(doorEventsRequest); String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); - JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); if (!"0".equals(resultJson1.get("code"))) { log.error("请求海康,循环查询海康门禁点事件v2失败,海康response:{}", resultStr1); return; @@ -147,7 +147,7 @@ //进门 if (1 == inAndOutType) { ++num; - } else if (0 == inAndOutType) { + } else { --num; } } @@ -655,6 +655,33 @@ return ResponseData.success(resultMap); } + @Override + public Object eventNumber() { + List caseInfos = caseInfoMapper.selectListByToday4(); + List resolvedCaseInfos = caseInfos.stream().filter(caseInfo -> "3".equals(caseInfo.getStatus())).collect(Collectors.toList()); + HashMap resultMap = new HashMap<>(); + resultMap.put("今日事件数", caseInfos.size()); + resultMap.put("今日事件处置数", resolvedCaseInfos.size()); + return ResponseData.success(resultMap); + } + + @Override + public Object offlineRate() { + QueryWrapper wrapper = new QueryWrapper<>(); + Integer total = deviceInfoMapper.selectCount(wrapper); + QueryWrapper wrapper1 = new QueryWrapper<>(); + wrapper1.eq("status", 2); //字典值:在线1、离线2、故障3 + Integer offline = deviceInfoMapper.selectCount(wrapper1); + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format((float) offline / (float) total * 100); + HashMap resultMap = new HashMap<>(); +// resultMap.put("设备总数", total); + resultMap.put("设备离线率", result + "%"); + return ResponseData.success(resultMap); + } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { resultMap.keySet().forEach(key -> { List monthAndLevelGroupDTOS = resultMap.get(key); 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 2dd34b6..76d8ff6 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 @@ -469,4 +469,12 @@ return deviceStatusDTOS; } + @Override + public DeviceInfo selectByIndexCode(String cameraIndexCode) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("index_code", cameraIndexCode); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } + } 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 0f02ccb..c676f2a 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,6 +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.config.DeviceLinkageConfig; import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; @@ -31,27 +32,22 @@ @Slf4j @Service public class HikServiceImpl implements HikService { - @Resource private AbstractDictService dictService; - @Autowired private StaffInfoMapper staffInfoMapper; - @Autowired private AttendanceInfoMapper attendanceInfoMapper; - @Autowired private VisitInfoMapper visitInfoMapper; - @Autowired private DeviceInfoMapper deviceInfoMapper; - @Autowired private CaseInfoMapper caseInfoMapper; - @Autowired private StaffInoutLogMapper inoutLogMapper; + @Autowired + private DeviceLinkageConfig deviceLinkageConfig; @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { @@ -71,6 +67,26 @@ log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } +// //发生黑名单事件,若匹配联动配置,常闭指定闸机 +// HashMap> configMap = deviceLinkageConfig.getConfigMap(); +// if(!CollectionUtils.isEmpty(configMap.get(srcIndex))){ +// List list = configMap.get(srcIndex); +// //海康门禁点反控 +// DoorControlRequest doorControlRequest = new DoorControlRequest(); +// //需根据设备编号获取到对应的门禁点唯一标识 +// doorControlRequest.setDoorIndexCodes(list); +// //常闭 +// doorControlRequest.setControlType(3); +// String body = JSONObject.toJSONString(doorControlRequest); +// String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); +// JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); +// if (!"0".equals(resultJson.get("code"))) { +// log.error("发生黑名单事件,请求海康,门禁点反控失败,海康response:{}", resultStr); +// }else{ +// log.info("发生黑名单事件,请求海康,门禁点反控成功"); +// } +// } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java index b2e826f..cf61c40 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java @@ -12,13 +12,18 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.config.CockpitConfig; import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.*; import com.casic.missiles.modular.service.PropertyManageService; import com.casic.missiles.modular.system.model.Dict; import com.casic.missiles.modular.util.DateUtils; +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; @@ -43,6 +48,8 @@ @Autowired private StaffInfoMapper staffInfoMapper; @Autowired + private BlackInfoMapper blackInfoMapper; + @Autowired private CaseInfoMapper caseInfoMapper; @Autowired private HazardLevelMapper hazardLevelMapper; @@ -53,6 +60,8 @@ @Autowired private DeviceRepairLogMapper repairLogMapper; @Autowired + private FireEquipInfoMapper fireEquipInfoMapper; + @Autowired private CockpitConfig cockpitConfig; @Autowired private AbstractDictService dictService; @@ -167,20 +176,38 @@ for (String date : dateList) { Integer flag = 0; for (PreMonthOrWeekCaseDTO dto : resultList) { - if(dto.getDimension().equals(date)){ + if (dto.getDimension().equals(date)) { finalList.add(dto); flag = 1; } } - if(flag == 0){ + if (flag == 0) { PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); preMonthOrWeekCaseDTO.setDimension(date); preMonthOrWeekCaseDTO.setQuantity(0); finalList.add(preMonthOrWeekCaseDTO); } } + if ("month".equals(dimension)) { + finalList.stream().forEach(f -> { + String dimension1 = f.getDimension(); + StringBuilder stringBuilder = new StringBuilder(dimension1); + stringBuilder.insert(5, "第"); + stringBuilder.append("周"); + f.setDimension(String.valueOf(stringBuilder)); + }); + } return ResponseData.success(finalList); } + if ("month".equals(dimension)) { + resultList.stream().forEach(f -> { + String dimension1 = f.getDimension(); + StringBuilder stringBuilder = new StringBuilder(dimension1); + stringBuilder.insert(5, "第"); + stringBuilder.append("周"); + f.setDimension(String.valueOf(stringBuilder)); + }); + } return ResponseData.success(resultList); } @@ -200,7 +227,7 @@ String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); if (year.equals(String.valueOf(DateUtil.thisYear()))) { - monthAndWeekDTO.setMonthQuantity(sum / (DateUtil.thisMonth()+1)); + monthAndWeekDTO.setMonthQuantity(sum / (DateUtil.thisMonth() + 1)); strAvgMap.put(key, monthAndWeekDTO); } else { monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -247,7 +274,7 @@ resultList.add(strAvgMap.get(key)); }); //输出顺序 - if(!CollectionUtils.isEmpty(resultList) && resultList.size() > 1){ + if (!CollectionUtils.isEmpty(resultList) && resultList.size() > 1) { Collections.swap(resultList, 1, 2); } return ResponseData.success(resultList); @@ -734,15 +761,18 @@ return assessResultJson; } JSONArray assessData = JSONArray.parseArray(JSON.toJSONString(assessResultJson.getData())); - //所有类型的员工出勤 - List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + //物业和安保类型的员工出勤 + List collect = staffInfoMapper.selectCountByType(); + List staffTypeAndSumDTOS = collect.stream().filter(staffTypeAndSumDTO -> + !"3".equals(staffTypeAndSumDTO.getStaffType()) + ).collect(Collectors.toList()); long sum = staffTypeAndSumDTOS.stream().collect(Collectors.summarizingInt(StaffTypeAndSumDTO::getSum)).getSum(); List countByTypeAndDateForWeek = attendanceInfoMapper.getCountByTypeAndDateForWeek(); Map> dateMap = countByTypeAndDateForWeek.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); HashMap attendanceMap = new HashMap<>(); dateMap.keySet().forEach(key -> { List attendanceRatioDTOS = dateMap.get(key); - //当天所有类型的员工的出勤人数 + //当天物业和安保类型的员工的出勤人数 long sum1 = attendanceRatioDTOS.stream().collect(Collectors.summarizingInt(AttendanceRatioDTO::getQuantity)).getSum(); //出勤占比评分 Double attendanceRatio = ((float) sum1 / (float) sum) * 100 * cockpitConfig.getCommuteWeight(); @@ -1138,7 +1168,7 @@ securityScoreMap.put(date, BigDecimal.valueOf(100)); } } - if(CollectionUtils.isEmpty(repairMap)){ + if (CollectionUtils.isEmpty(repairMap)) { for (String date : dateList) { repairMap.put(date, BigDecimal.valueOf(100)); } @@ -1177,10 +1207,172 @@ return ResponseData.success(list); } + @Override + public Object securityScore() { + //按发生事件的设备所在的position划分计算评分,当天发生的事件 + String position = null; + List caseInfos = caseInfoMapper.selectByPosition(position); + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + + List securityScoreDTOs = new ArrayList<>(); + caseInfos.forEach(caseInfo -> { + SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); + securityScoreDTO1.setArea(caseInfo.getArea()); + 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); + }); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + 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); + } + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); + }); + //返回数据补全处理 + 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); + } + } + } + + //各楼栋设备维修次数(发生一次维修减5分) + //当天在设备维修期间的设备个数及所在楼栋 + List todayDTOList = repairLogMapper.selectTodayList(); + if(!CollectionUtils.isEmpty(todayDTOList)){ + for (RepairTodayDTO today : todayDTOList) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, today.getPosition()); + Double d = resultMap.get(dictValue) - today.getNumber()*5; + resultMap.put(dictValue, d); + } + } + + //各楼栋消防设备有效期(距有效期不到三个月减5分) + //当天在设备维修期间的设备个数及所在楼栋 + List repairTodayDTOList = fireEquipInfoMapper.selectNearExpireList(); + if(!CollectionUtils.isEmpty(repairTodayDTOList)){ + for (RepairTodayDTO today : repairTodayDTOList) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, today.getPosition()); + Double d = resultMap.get(dictValue) - today.getNumber()*5; + resultMap.put(dictValue, d); + } + } + + //各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + List list = visitInfoMapper.selectListForToDay(); + //未在申请时间段内离开减分(包括无离开时间和有离开时间两种情况)、未在申请区域内离开减分 + if(!CollectionUtils.isEmpty(list)){ + for (MultiScoreVisitorDTO visitorDTO : list) { + //无离开时间 + if (StringUtils.isEmpty(visitorDTO.getOutTime()) && StringUtils.isNotEmpty(visitorDTO.getVisitPosition())) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - cockpitConfig.getVisitorWeight().get("NoRecordPointDeduct"); + resultMap.put(dictValue, d); + } else if(StringUtils.isNotEmpty(visitorDTO.getVisitPosition()) && StringUtils.isNotEmpty(visitorDTO.getOutTime())){ + DateTime applyOutDateTime = DateUtil.parseDateTime(visitorDTO.getApplyOutTime()); + DateTime outDateTime = DateUtil.parseDateTime(visitorDTO.getOutTime()); + //未在申请时间段离开(在申请离开时间后离开) + if (DateUtil.compare(outDateTime, applyOutDateTime) > 0) { + long betweenHour = DateUtil.between(outDateTime, applyOutDateTime, DateUnit.HOUR); + Double score = betweenHour * cockpitConfig.getVisitorWeight().get("singlePointDeduct"); + //该访客扣分到达最多分 + if (score >= cockpitConfig.getVisitorWeight().get("mostPointDeduct")) { + score = cockpitConfig.getVisitorWeight().get("mostPointDeduct"); + } + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - score; + resultMap.put(dictValue, d); + } + //未在申请区域离开 + if (StringUtils.isNotEmpty(visitorDTO.getApplyVisitPosition()) && !visitorDTO.getApplyVisitPosition().equals(visitorDTO.getVisitPosition())) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - cockpitConfig.getVisitorWeight().get("singlePointDeduct"); + resultMap.put(dictValue, d); + } + } + } + } + return ResponseData.success(resultMap); + } + + @Override + public List personList(PersonListRequest personListRequest) { + //查询员工列表 + List staffList = staffInfoMapper.selectForPersonList(personListRequest); + staffList.stream().parallel().forEach(staff -> { + getFiledFromHik(staff); + }); + + //查询黑名单列表 + List blackList = blackInfoMapper.selectForPersonList(personListRequest); + blackList.stream().forEach(black -> { + black.setPersonType("黑名单"); + }); + + //查询访客列表 + List visitList = visitInfoMapper.selectForPersonList(personListRequest); + visitList.stream().forEach(visit -> { + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(visit.getPicUri()); + picRequest.setServerIndexCode(visit.getServerIndexCode()); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + visit.setPersonPicture(HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody)); + visit.setPersonType("访客"); + }); + + //列表结合,顺序:员工、黑名单、访客 + List resultList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(staffList)){ + staffList.addAll(blackList); + staffList.addAll(visitList); + resultList = staffList; + }else if(!CollectionUtils.isEmpty(blackList)){ + blackList.addAll(visitList); + resultList = blackList; + }else { + resultList = visitList; + } + return resultList; + } + private List> getForResult(List weekCaseDTOS, List weekCaseKeyAreaDTOS, - List caseInfos, HashMap weekCaseMap, HashMap caseScoreMap, - HashMap keyAreaScoreMap, HashMap assessScoreMap, - List dateList){ + List caseInfos, HashMap weekCaseMap, HashMap caseScoreMap, + HashMap keyAreaScoreMap, HashMap assessScoreMap, + List dateList) { Map keyAreaWeight = cockpitConfig.getKeyAreaWeight(); weekCaseKeyAreaDTOS.forEach(dto -> { weekCaseMap.put(dto.getDimension(), BigDecimal.valueOf(dto.getQuantity())); @@ -1270,4 +1462,53 @@ }); return resultList; } + + private void getFiledFromHik(PersonListResponse staffInfo) { + String staffCode = staffInfo.getStaffCode(); + 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; + } + log.info("请求海康,根据人员唯一字段获取人员详细信息response:{}", resultStr); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + if(0 == personPhoto.size()){ + return; + } + //海康组织名 + String orgPathName = jsonObject.getString("orgPathName"); + String replace = orgPathName.replace("🆗", ""); + staffInfo.setPersonType(replace); + 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")){ + staffInfo.setPersonPicture("https://192.168.10.2:443" + pictureFromHik); + }else{ + staffInfo.setPersonPicture(pictureFromHik); + } + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java new file mode 100644 index 0000000..445467d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询响应 + * @Author: wangpeng + * @Date: 2023/1/30 9:11 + */ +@Data +public class PersonListResponse { + //人员类型,黑名单/访客/员工所属组织 + private String personType; + //姓名 + private String personName; + //员工类型:工号,黑名单类型:黑名单编号,访客类型:无 + private String personNo; + //人员图片 + private String personPicture; + //性别 + private String gender; + + @JsonIgnore + private String staffCode; + @JsonIgnore + private String picUri; + @JsonIgnore + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java new file mode 100644 index 0000000..afd8673 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/9 16:59 + */ +@Data +public class SearchPicturesResponse { + private String devName; + private String drawNo; + private String position; + private String positionName; + private String area; + private String areaName; + private String facePicUrl; + private String bkgPicUrl; + private String similarity; + private String time; + private String sex; + private String rect; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java new file mode 100644 index 0000000..ce703af --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/29 16:24 + */ +@Data +public class RepairTodayDTO { + private Integer number; + private String position; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index bb00c7c..8de64ef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -14,6 +14,7 @@ import com.casic.missiles.modular.model.StatisticNumber; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.service.StaffInoutLogService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -46,6 +47,8 @@ private AbstractDictService dictService; @Autowired private StaffInfoService staffInfoService; + @Autowired + private StaffInoutLogService inoutLogService; /** * 统计一期二期楼栋,每小时存储各楼栋人数 @@ -130,6 +133,15 @@ } + /** + * 每天0点删除一周外的人员进出记录 + */ + @Scheduled(cron = "0 0 0 * * ?") + @Transactional + public void deleteStaffInOutLog() { + inoutLogService.deleteMoreThanWeekLog(); + } + private List getSyncPersonList(PersonListRequest request, JSONObject resultJson, List personList) { if (!"0".equals(resultJson.get("code"))) { log.error("请求海康,获取人员列表v2失败,海康response:{}", resultJson.toJSONString()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java index 7a7fe8a..fbfda1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java @@ -45,4 +45,8 @@ Object areaScore(SecurityScoreDTO securityScoreDTO); Object heatMap(HeatMapDTO heatMapDTO); + + Object eventNumber(); + + Object offlineRate(); } 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 7e29e1f..09efe70 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 @@ -66,4 +66,6 @@ DeviceInfo deviceInfoByDrawNo(String drawNo); List getDeviceStatusGroupByArea(DeviceAreaRequest deviceAreaRequest); + + DeviceInfo selectByIndexCode(String cameraIndexCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java index 5b8189f..09fce1a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java @@ -1,8 +1,12 @@ package com.casic.missiles.modular.service; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; +import java.util.List; + /** * @Description: * @Author: wangpeng @@ -42,4 +46,8 @@ Object other(); Object highFrequency(); + + Object securityScore(); + + List personList(PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java index 5a92eba..ed5b3a4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java @@ -15,4 +15,6 @@ public interface StaffInoutLogService extends IService { List staffInoutLogListPage(Page page, StaffInoutLogRequest inoutLogRequest); + + void deleteMoreThanWeekLog(); } 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 1c34f68..972d3ab 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 @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.config.DeviceLinkageConfig; import com.casic.missiles.modular.dao.CaseInfoMapper; import com.casic.missiles.modular.dao.CategoryLevelMapper; import com.casic.missiles.modular.dao.DeviceInfoMapper; @@ -59,6 +60,9 @@ @Resource private DeviceInfoMapper deviceInfoMapper; + @Autowired + private DeviceLinkageConfig deviceLinkageConfig; + @Override public List caseInfoListPage(Page page, CaseInfoRequest caseInfoRequest) { try { @@ -78,6 +82,29 @@ @Override public int updateStatus(CaseInfoRequest caseInfoRequest) { +// //若事件为黑名单事件且事件为未解决,将闸机设置为门闭(即非常闭,可正常开关门) +// CaseInfo caseInfo = caseInfoMapper.selectById(caseInfoRequest.getId()); +// if(!Objects.isNull(caseInfo) && 1644175361 == caseInfo.getHikEventType() +// && caseInfo.getDescription().contains("黑名单") && "3" != caseInfo.getStatus() +// && "3" == caseInfoRequest.getStatus()){ +// HashMap> configMap = deviceLinkageConfig.getConfigMap(); +// List list = configMap.get(caseInfo.getIndexCode()); +// //海康门禁点反控 +// DoorControlRequest doorControlRequest = new DoorControlRequest(); +// //需根据设备编号获取到对应的门禁点唯一标识 +// doorControlRequest.setDoorIndexCodes(list); +// //门闭 +// doorControlRequest.setControlType(1); +// String body = JSONObject.toJSONString(doorControlRequest); +// String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); +// JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); +// if (!"0".equals(resultJson.get("code"))) { +// log.error("解决黑名单事件,请求海康,门禁点反控失败,海康response:{}", resultStr); +// }else{ +// log.info("解决黑名单事件,请求海康,门禁点反控成功"); +// } +// } + return caseInfoMapper.updateStatusById(caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index f452b5f..6f4956b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -105,7 +105,7 @@ doorEventsRequest.setPageNo(i); String body1 = JSONObject.toJSONString(doorEventsRequest); String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); - JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); if (!"0".equals(resultJson1.get("code"))) { log.error("请求海康,循环查询海康门禁点事件v2失败,海康response:{}", resultStr1); return; @@ -147,7 +147,7 @@ //进门 if (1 == inAndOutType) { ++num; - } else if (0 == inAndOutType) { + } else { --num; } } @@ -655,6 +655,33 @@ return ResponseData.success(resultMap); } + @Override + public Object eventNumber() { + List caseInfos = caseInfoMapper.selectListByToday4(); + List resolvedCaseInfos = caseInfos.stream().filter(caseInfo -> "3".equals(caseInfo.getStatus())).collect(Collectors.toList()); + HashMap resultMap = new HashMap<>(); + resultMap.put("今日事件数", caseInfos.size()); + resultMap.put("今日事件处置数", resolvedCaseInfos.size()); + return ResponseData.success(resultMap); + } + + @Override + public Object offlineRate() { + QueryWrapper wrapper = new QueryWrapper<>(); + Integer total = deviceInfoMapper.selectCount(wrapper); + QueryWrapper wrapper1 = new QueryWrapper<>(); + wrapper1.eq("status", 2); //字典值:在线1、离线2、故障3 + Integer offline = deviceInfoMapper.selectCount(wrapper1); + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format((float) offline / (float) total * 100); + HashMap resultMap = new HashMap<>(); +// resultMap.put("设备总数", total); + resultMap.put("设备离线率", result + "%"); + return ResponseData.success(resultMap); + } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { resultMap.keySet().forEach(key -> { List monthAndLevelGroupDTOS = resultMap.get(key); 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 2dd34b6..76d8ff6 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 @@ -469,4 +469,12 @@ return deviceStatusDTOS; } + @Override + public DeviceInfo selectByIndexCode(String cameraIndexCode) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("index_code", cameraIndexCode); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } + } 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 0f02ccb..c676f2a 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,6 +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.config.DeviceLinkageConfig; import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; @@ -31,27 +32,22 @@ @Slf4j @Service public class HikServiceImpl implements HikService { - @Resource private AbstractDictService dictService; - @Autowired private StaffInfoMapper staffInfoMapper; - @Autowired private AttendanceInfoMapper attendanceInfoMapper; - @Autowired private VisitInfoMapper visitInfoMapper; - @Autowired private DeviceInfoMapper deviceInfoMapper; - @Autowired private CaseInfoMapper caseInfoMapper; - @Autowired private StaffInoutLogMapper inoutLogMapper; + @Autowired + private DeviceLinkageConfig deviceLinkageConfig; @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { @@ -71,6 +67,26 @@ log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } +// //发生黑名单事件,若匹配联动配置,常闭指定闸机 +// HashMap> configMap = deviceLinkageConfig.getConfigMap(); +// if(!CollectionUtils.isEmpty(configMap.get(srcIndex))){ +// List list = configMap.get(srcIndex); +// //海康门禁点反控 +// DoorControlRequest doorControlRequest = new DoorControlRequest(); +// //需根据设备编号获取到对应的门禁点唯一标识 +// doorControlRequest.setDoorIndexCodes(list); +// //常闭 +// doorControlRequest.setControlType(3); +// String body = JSONObject.toJSONString(doorControlRequest); +// String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); +// JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); +// if (!"0".equals(resultJson.get("code"))) { +// log.error("发生黑名单事件,请求海康,门禁点反控失败,海康response:{}", resultStr); +// }else{ +// log.info("发生黑名单事件,请求海康,门禁点反控成功"); +// } +// } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java index b2e826f..cf61c40 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java @@ -12,13 +12,18 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.config.CockpitConfig; import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.*; import com.casic.missiles.modular.service.PropertyManageService; import com.casic.missiles.modular.system.model.Dict; import com.casic.missiles.modular.util.DateUtils; +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; @@ -43,6 +48,8 @@ @Autowired private StaffInfoMapper staffInfoMapper; @Autowired + private BlackInfoMapper blackInfoMapper; + @Autowired private CaseInfoMapper caseInfoMapper; @Autowired private HazardLevelMapper hazardLevelMapper; @@ -53,6 +60,8 @@ @Autowired private DeviceRepairLogMapper repairLogMapper; @Autowired + private FireEquipInfoMapper fireEquipInfoMapper; + @Autowired private CockpitConfig cockpitConfig; @Autowired private AbstractDictService dictService; @@ -167,20 +176,38 @@ for (String date : dateList) { Integer flag = 0; for (PreMonthOrWeekCaseDTO dto : resultList) { - if(dto.getDimension().equals(date)){ + if (dto.getDimension().equals(date)) { finalList.add(dto); flag = 1; } } - if(flag == 0){ + if (flag == 0) { PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); preMonthOrWeekCaseDTO.setDimension(date); preMonthOrWeekCaseDTO.setQuantity(0); finalList.add(preMonthOrWeekCaseDTO); } } + if ("month".equals(dimension)) { + finalList.stream().forEach(f -> { + String dimension1 = f.getDimension(); + StringBuilder stringBuilder = new StringBuilder(dimension1); + stringBuilder.insert(5, "第"); + stringBuilder.append("周"); + f.setDimension(String.valueOf(stringBuilder)); + }); + } return ResponseData.success(finalList); } + if ("month".equals(dimension)) { + resultList.stream().forEach(f -> { + String dimension1 = f.getDimension(); + StringBuilder stringBuilder = new StringBuilder(dimension1); + stringBuilder.insert(5, "第"); + stringBuilder.append("周"); + f.setDimension(String.valueOf(stringBuilder)); + }); + } return ResponseData.success(resultList); } @@ -200,7 +227,7 @@ String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); if (year.equals(String.valueOf(DateUtil.thisYear()))) { - monthAndWeekDTO.setMonthQuantity(sum / (DateUtil.thisMonth()+1)); + monthAndWeekDTO.setMonthQuantity(sum / (DateUtil.thisMonth() + 1)); strAvgMap.put(key, monthAndWeekDTO); } else { monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -247,7 +274,7 @@ resultList.add(strAvgMap.get(key)); }); //输出顺序 - if(!CollectionUtils.isEmpty(resultList) && resultList.size() > 1){ + if (!CollectionUtils.isEmpty(resultList) && resultList.size() > 1) { Collections.swap(resultList, 1, 2); } return ResponseData.success(resultList); @@ -734,15 +761,18 @@ return assessResultJson; } JSONArray assessData = JSONArray.parseArray(JSON.toJSONString(assessResultJson.getData())); - //所有类型的员工出勤 - List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + //物业和安保类型的员工出勤 + List collect = staffInfoMapper.selectCountByType(); + List staffTypeAndSumDTOS = collect.stream().filter(staffTypeAndSumDTO -> + !"3".equals(staffTypeAndSumDTO.getStaffType()) + ).collect(Collectors.toList()); long sum = staffTypeAndSumDTOS.stream().collect(Collectors.summarizingInt(StaffTypeAndSumDTO::getSum)).getSum(); List countByTypeAndDateForWeek = attendanceInfoMapper.getCountByTypeAndDateForWeek(); Map> dateMap = countByTypeAndDateForWeek.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); HashMap attendanceMap = new HashMap<>(); dateMap.keySet().forEach(key -> { List attendanceRatioDTOS = dateMap.get(key); - //当天所有类型的员工的出勤人数 + //当天物业和安保类型的员工的出勤人数 long sum1 = attendanceRatioDTOS.stream().collect(Collectors.summarizingInt(AttendanceRatioDTO::getQuantity)).getSum(); //出勤占比评分 Double attendanceRatio = ((float) sum1 / (float) sum) * 100 * cockpitConfig.getCommuteWeight(); @@ -1138,7 +1168,7 @@ securityScoreMap.put(date, BigDecimal.valueOf(100)); } } - if(CollectionUtils.isEmpty(repairMap)){ + if (CollectionUtils.isEmpty(repairMap)) { for (String date : dateList) { repairMap.put(date, BigDecimal.valueOf(100)); } @@ -1177,10 +1207,172 @@ return ResponseData.success(list); } + @Override + public Object securityScore() { + //按发生事件的设备所在的position划分计算评分,当天发生的事件 + String position = null; + List caseInfos = caseInfoMapper.selectByPosition(position); + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + + List securityScoreDTOs = new ArrayList<>(); + caseInfos.forEach(caseInfo -> { + SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); + securityScoreDTO1.setArea(caseInfo.getArea()); + 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); + }); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + 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); + } + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); + }); + //返回数据补全处理 + 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); + } + } + } + + //各楼栋设备维修次数(发生一次维修减5分) + //当天在设备维修期间的设备个数及所在楼栋 + List todayDTOList = repairLogMapper.selectTodayList(); + if(!CollectionUtils.isEmpty(todayDTOList)){ + for (RepairTodayDTO today : todayDTOList) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, today.getPosition()); + Double d = resultMap.get(dictValue) - today.getNumber()*5; + resultMap.put(dictValue, d); + } + } + + //各楼栋消防设备有效期(距有效期不到三个月减5分) + //当天在设备维修期间的设备个数及所在楼栋 + List repairTodayDTOList = fireEquipInfoMapper.selectNearExpireList(); + if(!CollectionUtils.isEmpty(repairTodayDTOList)){ + for (RepairTodayDTO today : repairTodayDTOList) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, today.getPosition()); + Double d = resultMap.get(dictValue) - today.getNumber()*5; + resultMap.put(dictValue, d); + } + } + + //各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + List list = visitInfoMapper.selectListForToDay(); + //未在申请时间段内离开减分(包括无离开时间和有离开时间两种情况)、未在申请区域内离开减分 + if(!CollectionUtils.isEmpty(list)){ + for (MultiScoreVisitorDTO visitorDTO : list) { + //无离开时间 + if (StringUtils.isEmpty(visitorDTO.getOutTime()) && StringUtils.isNotEmpty(visitorDTO.getVisitPosition())) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - cockpitConfig.getVisitorWeight().get("NoRecordPointDeduct"); + resultMap.put(dictValue, d); + } else if(StringUtils.isNotEmpty(visitorDTO.getVisitPosition()) && StringUtils.isNotEmpty(visitorDTO.getOutTime())){ + DateTime applyOutDateTime = DateUtil.parseDateTime(visitorDTO.getApplyOutTime()); + DateTime outDateTime = DateUtil.parseDateTime(visitorDTO.getOutTime()); + //未在申请时间段离开(在申请离开时间后离开) + if (DateUtil.compare(outDateTime, applyOutDateTime) > 0) { + long betweenHour = DateUtil.between(outDateTime, applyOutDateTime, DateUnit.HOUR); + Double score = betweenHour * cockpitConfig.getVisitorWeight().get("singlePointDeduct"); + //该访客扣分到达最多分 + if (score >= cockpitConfig.getVisitorWeight().get("mostPointDeduct")) { + score = cockpitConfig.getVisitorWeight().get("mostPointDeduct"); + } + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - score; + resultMap.put(dictValue, d); + } + //未在申请区域离开 + if (StringUtils.isNotEmpty(visitorDTO.getApplyVisitPosition()) && !visitorDTO.getApplyVisitPosition().equals(visitorDTO.getVisitPosition())) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - cockpitConfig.getVisitorWeight().get("singlePointDeduct"); + resultMap.put(dictValue, d); + } + } + } + } + return ResponseData.success(resultMap); + } + + @Override + public List personList(PersonListRequest personListRequest) { + //查询员工列表 + List staffList = staffInfoMapper.selectForPersonList(personListRequest); + staffList.stream().parallel().forEach(staff -> { + getFiledFromHik(staff); + }); + + //查询黑名单列表 + List blackList = blackInfoMapper.selectForPersonList(personListRequest); + blackList.stream().forEach(black -> { + black.setPersonType("黑名单"); + }); + + //查询访客列表 + List visitList = visitInfoMapper.selectForPersonList(personListRequest); + visitList.stream().forEach(visit -> { + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(visit.getPicUri()); + picRequest.setServerIndexCode(visit.getServerIndexCode()); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + visit.setPersonPicture(HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody)); + visit.setPersonType("访客"); + }); + + //列表结合,顺序:员工、黑名单、访客 + List resultList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(staffList)){ + staffList.addAll(blackList); + staffList.addAll(visitList); + resultList = staffList; + }else if(!CollectionUtils.isEmpty(blackList)){ + blackList.addAll(visitList); + resultList = blackList; + }else { + resultList = visitList; + } + return resultList; + } + private List> getForResult(List weekCaseDTOS, List weekCaseKeyAreaDTOS, - List caseInfos, HashMap weekCaseMap, HashMap caseScoreMap, - HashMap keyAreaScoreMap, HashMap assessScoreMap, - List dateList){ + List caseInfos, HashMap weekCaseMap, HashMap caseScoreMap, + HashMap keyAreaScoreMap, HashMap assessScoreMap, + List dateList) { Map keyAreaWeight = cockpitConfig.getKeyAreaWeight(); weekCaseKeyAreaDTOS.forEach(dto -> { weekCaseMap.put(dto.getDimension(), BigDecimal.valueOf(dto.getQuantity())); @@ -1270,4 +1462,53 @@ }); return resultList; } + + private void getFiledFromHik(PersonListResponse staffInfo) { + String staffCode = staffInfo.getStaffCode(); + 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; + } + log.info("请求海康,根据人员唯一字段获取人员详细信息response:{}", resultStr); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + if(0 == personPhoto.size()){ + return; + } + //海康组织名 + String orgPathName = jsonObject.getString("orgPathName"); + String replace = orgPathName.replace("🆗", ""); + staffInfo.setPersonType(replace); + 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")){ + staffInfo.setPersonPicture("https://192.168.10.2:443" + pictureFromHik); + }else{ + staffInfo.setPersonPicture(pictureFromHik); + } + } } 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 c39a5fa..c3d889c 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 @@ -62,6 +62,7 @@ List pageList = staffInfoMapper.getStaffInfoListPage(page, staffInfoRequest); pageList.stream().forEach(staffInfo -> { staffInfo.setStaffTypeName(dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, staffInfo.getStaffType())); + staffInfo.setStaffGenderName(dictService.getDictNameByCode(SecurityEventDict.SYS_SEX, staffInfo.getStaffGender())); // staffInfo.setPicture(getPictureFromHik(staffInfo.getStaffCode())); getFiledFromHik(staffInfo); }); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java new file mode 100644 index 0000000..445467d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询响应 + * @Author: wangpeng + * @Date: 2023/1/30 9:11 + */ +@Data +public class PersonListResponse { + //人员类型,黑名单/访客/员工所属组织 + private String personType; + //姓名 + private String personName; + //员工类型:工号,黑名单类型:黑名单编号,访客类型:无 + private String personNo; + //人员图片 + private String personPicture; + //性别 + private String gender; + + @JsonIgnore + private String staffCode; + @JsonIgnore + private String picUri; + @JsonIgnore + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java new file mode 100644 index 0000000..afd8673 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/9 16:59 + */ +@Data +public class SearchPicturesResponse { + private String devName; + private String drawNo; + private String position; + private String positionName; + private String area; + private String areaName; + private String facePicUrl; + private String bkgPicUrl; + private String similarity; + private String time; + private String sex; + private String rect; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java new file mode 100644 index 0000000..ce703af --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/29 16:24 + */ +@Data +public class RepairTodayDTO { + private Integer number; + private String position; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index bb00c7c..8de64ef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -14,6 +14,7 @@ import com.casic.missiles.modular.model.StatisticNumber; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.service.StaffInoutLogService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -46,6 +47,8 @@ private AbstractDictService dictService; @Autowired private StaffInfoService staffInfoService; + @Autowired + private StaffInoutLogService inoutLogService; /** * 统计一期二期楼栋,每小时存储各楼栋人数 @@ -130,6 +133,15 @@ } + /** + * 每天0点删除一周外的人员进出记录 + */ + @Scheduled(cron = "0 0 0 * * ?") + @Transactional + public void deleteStaffInOutLog() { + inoutLogService.deleteMoreThanWeekLog(); + } + private List getSyncPersonList(PersonListRequest request, JSONObject resultJson, List personList) { if (!"0".equals(resultJson.get("code"))) { log.error("请求海康,获取人员列表v2失败,海康response:{}", resultJson.toJSONString()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java index 7a7fe8a..fbfda1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java @@ -45,4 +45,8 @@ Object areaScore(SecurityScoreDTO securityScoreDTO); Object heatMap(HeatMapDTO heatMapDTO); + + Object eventNumber(); + + Object offlineRate(); } 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 7e29e1f..09efe70 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 @@ -66,4 +66,6 @@ DeviceInfo deviceInfoByDrawNo(String drawNo); List getDeviceStatusGroupByArea(DeviceAreaRequest deviceAreaRequest); + + DeviceInfo selectByIndexCode(String cameraIndexCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java index 5b8189f..09fce1a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java @@ -1,8 +1,12 @@ package com.casic.missiles.modular.service; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; +import java.util.List; + /** * @Description: * @Author: wangpeng @@ -42,4 +46,8 @@ Object other(); Object highFrequency(); + + Object securityScore(); + + List personList(PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java index 5a92eba..ed5b3a4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java @@ -15,4 +15,6 @@ public interface StaffInoutLogService extends IService { List staffInoutLogListPage(Page page, StaffInoutLogRequest inoutLogRequest); + + void deleteMoreThanWeekLog(); } 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 1c34f68..972d3ab 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 @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.config.DeviceLinkageConfig; import com.casic.missiles.modular.dao.CaseInfoMapper; import com.casic.missiles.modular.dao.CategoryLevelMapper; import com.casic.missiles.modular.dao.DeviceInfoMapper; @@ -59,6 +60,9 @@ @Resource private DeviceInfoMapper deviceInfoMapper; + @Autowired + private DeviceLinkageConfig deviceLinkageConfig; + @Override public List caseInfoListPage(Page page, CaseInfoRequest caseInfoRequest) { try { @@ -78,6 +82,29 @@ @Override public int updateStatus(CaseInfoRequest caseInfoRequest) { +// //若事件为黑名单事件且事件为未解决,将闸机设置为门闭(即非常闭,可正常开关门) +// CaseInfo caseInfo = caseInfoMapper.selectById(caseInfoRequest.getId()); +// if(!Objects.isNull(caseInfo) && 1644175361 == caseInfo.getHikEventType() +// && caseInfo.getDescription().contains("黑名单") && "3" != caseInfo.getStatus() +// && "3" == caseInfoRequest.getStatus()){ +// HashMap> configMap = deviceLinkageConfig.getConfigMap(); +// List list = configMap.get(caseInfo.getIndexCode()); +// //海康门禁点反控 +// DoorControlRequest doorControlRequest = new DoorControlRequest(); +// //需根据设备编号获取到对应的门禁点唯一标识 +// doorControlRequest.setDoorIndexCodes(list); +// //门闭 +// doorControlRequest.setControlType(1); +// String body = JSONObject.toJSONString(doorControlRequest); +// String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); +// JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); +// if (!"0".equals(resultJson.get("code"))) { +// log.error("解决黑名单事件,请求海康,门禁点反控失败,海康response:{}", resultStr); +// }else{ +// log.info("解决黑名单事件,请求海康,门禁点反控成功"); +// } +// } + return caseInfoMapper.updateStatusById(caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index f452b5f..6f4956b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -105,7 +105,7 @@ doorEventsRequest.setPageNo(i); String body1 = JSONObject.toJSONString(doorEventsRequest); String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); - JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); if (!"0".equals(resultJson1.get("code"))) { log.error("请求海康,循环查询海康门禁点事件v2失败,海康response:{}", resultStr1); return; @@ -147,7 +147,7 @@ //进门 if (1 == inAndOutType) { ++num; - } else if (0 == inAndOutType) { + } else { --num; } } @@ -655,6 +655,33 @@ return ResponseData.success(resultMap); } + @Override + public Object eventNumber() { + List caseInfos = caseInfoMapper.selectListByToday4(); + List resolvedCaseInfos = caseInfos.stream().filter(caseInfo -> "3".equals(caseInfo.getStatus())).collect(Collectors.toList()); + HashMap resultMap = new HashMap<>(); + resultMap.put("今日事件数", caseInfos.size()); + resultMap.put("今日事件处置数", resolvedCaseInfos.size()); + return ResponseData.success(resultMap); + } + + @Override + public Object offlineRate() { + QueryWrapper wrapper = new QueryWrapper<>(); + Integer total = deviceInfoMapper.selectCount(wrapper); + QueryWrapper wrapper1 = new QueryWrapper<>(); + wrapper1.eq("status", 2); //字典值:在线1、离线2、故障3 + Integer offline = deviceInfoMapper.selectCount(wrapper1); + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format((float) offline / (float) total * 100); + HashMap resultMap = new HashMap<>(); +// resultMap.put("设备总数", total); + resultMap.put("设备离线率", result + "%"); + return ResponseData.success(resultMap); + } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { resultMap.keySet().forEach(key -> { List monthAndLevelGroupDTOS = resultMap.get(key); 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 2dd34b6..76d8ff6 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 @@ -469,4 +469,12 @@ return deviceStatusDTOS; } + @Override + public DeviceInfo selectByIndexCode(String cameraIndexCode) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("index_code", cameraIndexCode); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } + } 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 0f02ccb..c676f2a 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,6 +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.config.DeviceLinkageConfig; import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; @@ -31,27 +32,22 @@ @Slf4j @Service public class HikServiceImpl implements HikService { - @Resource private AbstractDictService dictService; - @Autowired private StaffInfoMapper staffInfoMapper; - @Autowired private AttendanceInfoMapper attendanceInfoMapper; - @Autowired private VisitInfoMapper visitInfoMapper; - @Autowired private DeviceInfoMapper deviceInfoMapper; - @Autowired private CaseInfoMapper caseInfoMapper; - @Autowired private StaffInoutLogMapper inoutLogMapper; + @Autowired + private DeviceLinkageConfig deviceLinkageConfig; @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { @@ -71,6 +67,26 @@ log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } +// //发生黑名单事件,若匹配联动配置,常闭指定闸机 +// HashMap> configMap = deviceLinkageConfig.getConfigMap(); +// if(!CollectionUtils.isEmpty(configMap.get(srcIndex))){ +// List list = configMap.get(srcIndex); +// //海康门禁点反控 +// DoorControlRequest doorControlRequest = new DoorControlRequest(); +// //需根据设备编号获取到对应的门禁点唯一标识 +// doorControlRequest.setDoorIndexCodes(list); +// //常闭 +// doorControlRequest.setControlType(3); +// String body = JSONObject.toJSONString(doorControlRequest); +// String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); +// JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); +// if (!"0".equals(resultJson.get("code"))) { +// log.error("发生黑名单事件,请求海康,门禁点反控失败,海康response:{}", resultStr); +// }else{ +// log.info("发生黑名单事件,请求海康,门禁点反控成功"); +// } +// } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java index b2e826f..cf61c40 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java @@ -12,13 +12,18 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.config.CockpitConfig; import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.*; import com.casic.missiles.modular.service.PropertyManageService; import com.casic.missiles.modular.system.model.Dict; import com.casic.missiles.modular.util.DateUtils; +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; @@ -43,6 +48,8 @@ @Autowired private StaffInfoMapper staffInfoMapper; @Autowired + private BlackInfoMapper blackInfoMapper; + @Autowired private CaseInfoMapper caseInfoMapper; @Autowired private HazardLevelMapper hazardLevelMapper; @@ -53,6 +60,8 @@ @Autowired private DeviceRepairLogMapper repairLogMapper; @Autowired + private FireEquipInfoMapper fireEquipInfoMapper; + @Autowired private CockpitConfig cockpitConfig; @Autowired private AbstractDictService dictService; @@ -167,20 +176,38 @@ for (String date : dateList) { Integer flag = 0; for (PreMonthOrWeekCaseDTO dto : resultList) { - if(dto.getDimension().equals(date)){ + if (dto.getDimension().equals(date)) { finalList.add(dto); flag = 1; } } - if(flag == 0){ + if (flag == 0) { PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); preMonthOrWeekCaseDTO.setDimension(date); preMonthOrWeekCaseDTO.setQuantity(0); finalList.add(preMonthOrWeekCaseDTO); } } + if ("month".equals(dimension)) { + finalList.stream().forEach(f -> { + String dimension1 = f.getDimension(); + StringBuilder stringBuilder = new StringBuilder(dimension1); + stringBuilder.insert(5, "第"); + stringBuilder.append("周"); + f.setDimension(String.valueOf(stringBuilder)); + }); + } return ResponseData.success(finalList); } + if ("month".equals(dimension)) { + resultList.stream().forEach(f -> { + String dimension1 = f.getDimension(); + StringBuilder stringBuilder = new StringBuilder(dimension1); + stringBuilder.insert(5, "第"); + stringBuilder.append("周"); + f.setDimension(String.valueOf(stringBuilder)); + }); + } return ResponseData.success(resultList); } @@ -200,7 +227,7 @@ String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); if (year.equals(String.valueOf(DateUtil.thisYear()))) { - monthAndWeekDTO.setMonthQuantity(sum / (DateUtil.thisMonth()+1)); + monthAndWeekDTO.setMonthQuantity(sum / (DateUtil.thisMonth() + 1)); strAvgMap.put(key, monthAndWeekDTO); } else { monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -247,7 +274,7 @@ resultList.add(strAvgMap.get(key)); }); //输出顺序 - if(!CollectionUtils.isEmpty(resultList) && resultList.size() > 1){ + if (!CollectionUtils.isEmpty(resultList) && resultList.size() > 1) { Collections.swap(resultList, 1, 2); } return ResponseData.success(resultList); @@ -734,15 +761,18 @@ return assessResultJson; } JSONArray assessData = JSONArray.parseArray(JSON.toJSONString(assessResultJson.getData())); - //所有类型的员工出勤 - List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + //物业和安保类型的员工出勤 + List collect = staffInfoMapper.selectCountByType(); + List staffTypeAndSumDTOS = collect.stream().filter(staffTypeAndSumDTO -> + !"3".equals(staffTypeAndSumDTO.getStaffType()) + ).collect(Collectors.toList()); long sum = staffTypeAndSumDTOS.stream().collect(Collectors.summarizingInt(StaffTypeAndSumDTO::getSum)).getSum(); List countByTypeAndDateForWeek = attendanceInfoMapper.getCountByTypeAndDateForWeek(); Map> dateMap = countByTypeAndDateForWeek.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); HashMap attendanceMap = new HashMap<>(); dateMap.keySet().forEach(key -> { List attendanceRatioDTOS = dateMap.get(key); - //当天所有类型的员工的出勤人数 + //当天物业和安保类型的员工的出勤人数 long sum1 = attendanceRatioDTOS.stream().collect(Collectors.summarizingInt(AttendanceRatioDTO::getQuantity)).getSum(); //出勤占比评分 Double attendanceRatio = ((float) sum1 / (float) sum) * 100 * cockpitConfig.getCommuteWeight(); @@ -1138,7 +1168,7 @@ securityScoreMap.put(date, BigDecimal.valueOf(100)); } } - if(CollectionUtils.isEmpty(repairMap)){ + if (CollectionUtils.isEmpty(repairMap)) { for (String date : dateList) { repairMap.put(date, BigDecimal.valueOf(100)); } @@ -1177,10 +1207,172 @@ return ResponseData.success(list); } + @Override + public Object securityScore() { + //按发生事件的设备所在的position划分计算评分,当天发生的事件 + String position = null; + List caseInfos = caseInfoMapper.selectByPosition(position); + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + + List securityScoreDTOs = new ArrayList<>(); + caseInfos.forEach(caseInfo -> { + SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); + securityScoreDTO1.setArea(caseInfo.getArea()); + 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); + }); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + 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); + } + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); + }); + //返回数据补全处理 + 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); + } + } + } + + //各楼栋设备维修次数(发生一次维修减5分) + //当天在设备维修期间的设备个数及所在楼栋 + List todayDTOList = repairLogMapper.selectTodayList(); + if(!CollectionUtils.isEmpty(todayDTOList)){ + for (RepairTodayDTO today : todayDTOList) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, today.getPosition()); + Double d = resultMap.get(dictValue) - today.getNumber()*5; + resultMap.put(dictValue, d); + } + } + + //各楼栋消防设备有效期(距有效期不到三个月减5分) + //当天在设备维修期间的设备个数及所在楼栋 + List repairTodayDTOList = fireEquipInfoMapper.selectNearExpireList(); + if(!CollectionUtils.isEmpty(repairTodayDTOList)){ + for (RepairTodayDTO today : repairTodayDTOList) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, today.getPosition()); + Double d = resultMap.get(dictValue) - today.getNumber()*5; + resultMap.put(dictValue, d); + } + } + + //各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + List list = visitInfoMapper.selectListForToDay(); + //未在申请时间段内离开减分(包括无离开时间和有离开时间两种情况)、未在申请区域内离开减分 + if(!CollectionUtils.isEmpty(list)){ + for (MultiScoreVisitorDTO visitorDTO : list) { + //无离开时间 + if (StringUtils.isEmpty(visitorDTO.getOutTime()) && StringUtils.isNotEmpty(visitorDTO.getVisitPosition())) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - cockpitConfig.getVisitorWeight().get("NoRecordPointDeduct"); + resultMap.put(dictValue, d); + } else if(StringUtils.isNotEmpty(visitorDTO.getVisitPosition()) && StringUtils.isNotEmpty(visitorDTO.getOutTime())){ + DateTime applyOutDateTime = DateUtil.parseDateTime(visitorDTO.getApplyOutTime()); + DateTime outDateTime = DateUtil.parseDateTime(visitorDTO.getOutTime()); + //未在申请时间段离开(在申请离开时间后离开) + if (DateUtil.compare(outDateTime, applyOutDateTime) > 0) { + long betweenHour = DateUtil.between(outDateTime, applyOutDateTime, DateUnit.HOUR); + Double score = betweenHour * cockpitConfig.getVisitorWeight().get("singlePointDeduct"); + //该访客扣分到达最多分 + if (score >= cockpitConfig.getVisitorWeight().get("mostPointDeduct")) { + score = cockpitConfig.getVisitorWeight().get("mostPointDeduct"); + } + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - score; + resultMap.put(dictValue, d); + } + //未在申请区域离开 + if (StringUtils.isNotEmpty(visitorDTO.getApplyVisitPosition()) && !visitorDTO.getApplyVisitPosition().equals(visitorDTO.getVisitPosition())) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - cockpitConfig.getVisitorWeight().get("singlePointDeduct"); + resultMap.put(dictValue, d); + } + } + } + } + return ResponseData.success(resultMap); + } + + @Override + public List personList(PersonListRequest personListRequest) { + //查询员工列表 + List staffList = staffInfoMapper.selectForPersonList(personListRequest); + staffList.stream().parallel().forEach(staff -> { + getFiledFromHik(staff); + }); + + //查询黑名单列表 + List blackList = blackInfoMapper.selectForPersonList(personListRequest); + blackList.stream().forEach(black -> { + black.setPersonType("黑名单"); + }); + + //查询访客列表 + List visitList = visitInfoMapper.selectForPersonList(personListRequest); + visitList.stream().forEach(visit -> { + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(visit.getPicUri()); + picRequest.setServerIndexCode(visit.getServerIndexCode()); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + visit.setPersonPicture(HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody)); + visit.setPersonType("访客"); + }); + + //列表结合,顺序:员工、黑名单、访客 + List resultList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(staffList)){ + staffList.addAll(blackList); + staffList.addAll(visitList); + resultList = staffList; + }else if(!CollectionUtils.isEmpty(blackList)){ + blackList.addAll(visitList); + resultList = blackList; + }else { + resultList = visitList; + } + return resultList; + } + private List> getForResult(List weekCaseDTOS, List weekCaseKeyAreaDTOS, - List caseInfos, HashMap weekCaseMap, HashMap caseScoreMap, - HashMap keyAreaScoreMap, HashMap assessScoreMap, - List dateList){ + List caseInfos, HashMap weekCaseMap, HashMap caseScoreMap, + HashMap keyAreaScoreMap, HashMap assessScoreMap, + List dateList) { Map keyAreaWeight = cockpitConfig.getKeyAreaWeight(); weekCaseKeyAreaDTOS.forEach(dto -> { weekCaseMap.put(dto.getDimension(), BigDecimal.valueOf(dto.getQuantity())); @@ -1270,4 +1462,53 @@ }); return resultList; } + + private void getFiledFromHik(PersonListResponse staffInfo) { + String staffCode = staffInfo.getStaffCode(); + 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; + } + log.info("请求海康,根据人员唯一字段获取人员详细信息response:{}", resultStr); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + if(0 == personPhoto.size()){ + return; + } + //海康组织名 + String orgPathName = jsonObject.getString("orgPathName"); + String replace = orgPathName.replace("🆗", ""); + staffInfo.setPersonType(replace); + 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")){ + staffInfo.setPersonPicture("https://192.168.10.2:443" + pictureFromHik); + }else{ + staffInfo.setPersonPicture(pictureFromHik); + } + } } 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 c39a5fa..c3d889c 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 @@ -62,6 +62,7 @@ List pageList = staffInfoMapper.getStaffInfoListPage(page, staffInfoRequest); pageList.stream().forEach(staffInfo -> { staffInfo.setStaffTypeName(dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, staffInfo.getStaffType())); + staffInfo.setStaffGenderName(dictService.getDictNameByCode(SecurityEventDict.SYS_SEX, staffInfo.getStaffGender())); // staffInfo.setPicture(getPictureFromHik(staffInfo.getStaffCode())); getFiledFromHik(staffInfo); }); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java index f3687cd..5ef33c7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; @@ -20,6 +21,8 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -40,7 +43,6 @@ @Override public List staffInoutLogListPage(Page page, StaffInoutLogRequest inoutLogRequest) { try { -// todo员工编号和员工列表一致,进出记录中空数据问题,进出方式问题 List pageList = inoutLogMapper.selectStaffInoutLogList(page, inoutLogRequest); pageList.stream().forEach(inoutLog -> { inoutLog.setPassWayName(dictService.getDictNameByCode(SecurityEventDict.PASS_WAY, inoutLog.getPassWay())); @@ -49,8 +51,8 @@ //doorArea为前端文档参数,先取position inoutLog.setDoorArea(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, inoutLog.getDoorArea())); inoutLog.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, inoutLog.getArea())); - //获取海康组织名,根据组织编号获取 - getFiledFromHik(inoutLog); + //获取海康组织名和照片,根据组织编号获取,不使用,影响查询效率 +// getFiledFromHik(inoutLog); }); return pageList; } catch (DataAccessException ex) { @@ -60,6 +62,19 @@ } + @Override + public void deleteMoreThanWeekLog() { + QueryWrapper wrapper = new QueryWrapper<>(); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate ago = LocalDate.now().minusDays(7); + String dateStr = ago.format(df); + wrapper.apply("{0} > DATE_FORMAT(create_time,'%Y-%m-%d')", dateStr); + int delete = inoutLogMapper.delete(wrapper); + if(delete < 0){ + log.error("删除一周前人员进出记录数据失败"); + } + } + private void getFiledFromHik(StaffInoutLog staffInoutLog) { String staffCode = staffInoutLog.getStaffCode(); PersonInfoRequest request = new PersonInfoRequest(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java new file mode 100644 index 0000000..445467d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询响应 + * @Author: wangpeng + * @Date: 2023/1/30 9:11 + */ +@Data +public class PersonListResponse { + //人员类型,黑名单/访客/员工所属组织 + private String personType; + //姓名 + private String personName; + //员工类型:工号,黑名单类型:黑名单编号,访客类型:无 + private String personNo; + //人员图片 + private String personPicture; + //性别 + private String gender; + + @JsonIgnore + private String staffCode; + @JsonIgnore + private String picUri; + @JsonIgnore + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java new file mode 100644 index 0000000..afd8673 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/9 16:59 + */ +@Data +public class SearchPicturesResponse { + private String devName; + private String drawNo; + private String position; + private String positionName; + private String area; + private String areaName; + private String facePicUrl; + private String bkgPicUrl; + private String similarity; + private String time; + private String sex; + private String rect; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java new file mode 100644 index 0000000..ce703af --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/29 16:24 + */ +@Data +public class RepairTodayDTO { + private Integer number; + private String position; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index bb00c7c..8de64ef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -14,6 +14,7 @@ import com.casic.missiles.modular.model.StatisticNumber; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.service.StaffInoutLogService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -46,6 +47,8 @@ private AbstractDictService dictService; @Autowired private StaffInfoService staffInfoService; + @Autowired + private StaffInoutLogService inoutLogService; /** * 统计一期二期楼栋,每小时存储各楼栋人数 @@ -130,6 +133,15 @@ } + /** + * 每天0点删除一周外的人员进出记录 + */ + @Scheduled(cron = "0 0 0 * * ?") + @Transactional + public void deleteStaffInOutLog() { + inoutLogService.deleteMoreThanWeekLog(); + } + private List getSyncPersonList(PersonListRequest request, JSONObject resultJson, List personList) { if (!"0".equals(resultJson.get("code"))) { log.error("请求海康,获取人员列表v2失败,海康response:{}", resultJson.toJSONString()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java index 7a7fe8a..fbfda1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java @@ -45,4 +45,8 @@ Object areaScore(SecurityScoreDTO securityScoreDTO); Object heatMap(HeatMapDTO heatMapDTO); + + Object eventNumber(); + + Object offlineRate(); } 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 7e29e1f..09efe70 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 @@ -66,4 +66,6 @@ DeviceInfo deviceInfoByDrawNo(String drawNo); List getDeviceStatusGroupByArea(DeviceAreaRequest deviceAreaRequest); + + DeviceInfo selectByIndexCode(String cameraIndexCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java index 5b8189f..09fce1a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java @@ -1,8 +1,12 @@ package com.casic.missiles.modular.service; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; +import java.util.List; + /** * @Description: * @Author: wangpeng @@ -42,4 +46,8 @@ Object other(); Object highFrequency(); + + Object securityScore(); + + List personList(PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java index 5a92eba..ed5b3a4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java @@ -15,4 +15,6 @@ public interface StaffInoutLogService extends IService { List staffInoutLogListPage(Page page, StaffInoutLogRequest inoutLogRequest); + + void deleteMoreThanWeekLog(); } 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 1c34f68..972d3ab 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 @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.config.DeviceLinkageConfig; import com.casic.missiles.modular.dao.CaseInfoMapper; import com.casic.missiles.modular.dao.CategoryLevelMapper; import com.casic.missiles.modular.dao.DeviceInfoMapper; @@ -59,6 +60,9 @@ @Resource private DeviceInfoMapper deviceInfoMapper; + @Autowired + private DeviceLinkageConfig deviceLinkageConfig; + @Override public List caseInfoListPage(Page page, CaseInfoRequest caseInfoRequest) { try { @@ -78,6 +82,29 @@ @Override public int updateStatus(CaseInfoRequest caseInfoRequest) { +// //若事件为黑名单事件且事件为未解决,将闸机设置为门闭(即非常闭,可正常开关门) +// CaseInfo caseInfo = caseInfoMapper.selectById(caseInfoRequest.getId()); +// if(!Objects.isNull(caseInfo) && 1644175361 == caseInfo.getHikEventType() +// && caseInfo.getDescription().contains("黑名单") && "3" != caseInfo.getStatus() +// && "3" == caseInfoRequest.getStatus()){ +// HashMap> configMap = deviceLinkageConfig.getConfigMap(); +// List list = configMap.get(caseInfo.getIndexCode()); +// //海康门禁点反控 +// DoorControlRequest doorControlRequest = new DoorControlRequest(); +// //需根据设备编号获取到对应的门禁点唯一标识 +// doorControlRequest.setDoorIndexCodes(list); +// //门闭 +// doorControlRequest.setControlType(1); +// String body = JSONObject.toJSONString(doorControlRequest); +// String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); +// JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); +// if (!"0".equals(resultJson.get("code"))) { +// log.error("解决黑名单事件,请求海康,门禁点反控失败,海康response:{}", resultStr); +// }else{ +// log.info("解决黑名单事件,请求海康,门禁点反控成功"); +// } +// } + return caseInfoMapper.updateStatusById(caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index f452b5f..6f4956b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -105,7 +105,7 @@ doorEventsRequest.setPageNo(i); String body1 = JSONObject.toJSONString(doorEventsRequest); String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); - JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); if (!"0".equals(resultJson1.get("code"))) { log.error("请求海康,循环查询海康门禁点事件v2失败,海康response:{}", resultStr1); return; @@ -147,7 +147,7 @@ //进门 if (1 == inAndOutType) { ++num; - } else if (0 == inAndOutType) { + } else { --num; } } @@ -655,6 +655,33 @@ return ResponseData.success(resultMap); } + @Override + public Object eventNumber() { + List caseInfos = caseInfoMapper.selectListByToday4(); + List resolvedCaseInfos = caseInfos.stream().filter(caseInfo -> "3".equals(caseInfo.getStatus())).collect(Collectors.toList()); + HashMap resultMap = new HashMap<>(); + resultMap.put("今日事件数", caseInfos.size()); + resultMap.put("今日事件处置数", resolvedCaseInfos.size()); + return ResponseData.success(resultMap); + } + + @Override + public Object offlineRate() { + QueryWrapper wrapper = new QueryWrapper<>(); + Integer total = deviceInfoMapper.selectCount(wrapper); + QueryWrapper wrapper1 = new QueryWrapper<>(); + wrapper1.eq("status", 2); //字典值:在线1、离线2、故障3 + Integer offline = deviceInfoMapper.selectCount(wrapper1); + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format((float) offline / (float) total * 100); + HashMap resultMap = new HashMap<>(); +// resultMap.put("设备总数", total); + resultMap.put("设备离线率", result + "%"); + return ResponseData.success(resultMap); + } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { resultMap.keySet().forEach(key -> { List monthAndLevelGroupDTOS = resultMap.get(key); 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 2dd34b6..76d8ff6 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 @@ -469,4 +469,12 @@ return deviceStatusDTOS; } + @Override + public DeviceInfo selectByIndexCode(String cameraIndexCode) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("index_code", cameraIndexCode); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } + } 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 0f02ccb..c676f2a 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,6 +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.config.DeviceLinkageConfig; import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; @@ -31,27 +32,22 @@ @Slf4j @Service public class HikServiceImpl implements HikService { - @Resource private AbstractDictService dictService; - @Autowired private StaffInfoMapper staffInfoMapper; - @Autowired private AttendanceInfoMapper attendanceInfoMapper; - @Autowired private VisitInfoMapper visitInfoMapper; - @Autowired private DeviceInfoMapper deviceInfoMapper; - @Autowired private CaseInfoMapper caseInfoMapper; - @Autowired private StaffInoutLogMapper inoutLogMapper; + @Autowired + private DeviceLinkageConfig deviceLinkageConfig; @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { @@ -71,6 +67,26 @@ log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } +// //发生黑名单事件,若匹配联动配置,常闭指定闸机 +// HashMap> configMap = deviceLinkageConfig.getConfigMap(); +// if(!CollectionUtils.isEmpty(configMap.get(srcIndex))){ +// List list = configMap.get(srcIndex); +// //海康门禁点反控 +// DoorControlRequest doorControlRequest = new DoorControlRequest(); +// //需根据设备编号获取到对应的门禁点唯一标识 +// doorControlRequest.setDoorIndexCodes(list); +// //常闭 +// doorControlRequest.setControlType(3); +// String body = JSONObject.toJSONString(doorControlRequest); +// String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); +// JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); +// if (!"0".equals(resultJson.get("code"))) { +// log.error("发生黑名单事件,请求海康,门禁点反控失败,海康response:{}", resultStr); +// }else{ +// log.info("发生黑名单事件,请求海康,门禁点反控成功"); +// } +// } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java index b2e826f..cf61c40 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java @@ -12,13 +12,18 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.config.CockpitConfig; import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.*; import com.casic.missiles.modular.service.PropertyManageService; import com.casic.missiles.modular.system.model.Dict; import com.casic.missiles.modular.util.DateUtils; +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; @@ -43,6 +48,8 @@ @Autowired private StaffInfoMapper staffInfoMapper; @Autowired + private BlackInfoMapper blackInfoMapper; + @Autowired private CaseInfoMapper caseInfoMapper; @Autowired private HazardLevelMapper hazardLevelMapper; @@ -53,6 +60,8 @@ @Autowired private DeviceRepairLogMapper repairLogMapper; @Autowired + private FireEquipInfoMapper fireEquipInfoMapper; + @Autowired private CockpitConfig cockpitConfig; @Autowired private AbstractDictService dictService; @@ -167,20 +176,38 @@ for (String date : dateList) { Integer flag = 0; for (PreMonthOrWeekCaseDTO dto : resultList) { - if(dto.getDimension().equals(date)){ + if (dto.getDimension().equals(date)) { finalList.add(dto); flag = 1; } } - if(flag == 0){ + if (flag == 0) { PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); preMonthOrWeekCaseDTO.setDimension(date); preMonthOrWeekCaseDTO.setQuantity(0); finalList.add(preMonthOrWeekCaseDTO); } } + if ("month".equals(dimension)) { + finalList.stream().forEach(f -> { + String dimension1 = f.getDimension(); + StringBuilder stringBuilder = new StringBuilder(dimension1); + stringBuilder.insert(5, "第"); + stringBuilder.append("周"); + f.setDimension(String.valueOf(stringBuilder)); + }); + } return ResponseData.success(finalList); } + if ("month".equals(dimension)) { + resultList.stream().forEach(f -> { + String dimension1 = f.getDimension(); + StringBuilder stringBuilder = new StringBuilder(dimension1); + stringBuilder.insert(5, "第"); + stringBuilder.append("周"); + f.setDimension(String.valueOf(stringBuilder)); + }); + } return ResponseData.success(resultList); } @@ -200,7 +227,7 @@ String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); if (year.equals(String.valueOf(DateUtil.thisYear()))) { - monthAndWeekDTO.setMonthQuantity(sum / (DateUtil.thisMonth()+1)); + monthAndWeekDTO.setMonthQuantity(sum / (DateUtil.thisMonth() + 1)); strAvgMap.put(key, monthAndWeekDTO); } else { monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -247,7 +274,7 @@ resultList.add(strAvgMap.get(key)); }); //输出顺序 - if(!CollectionUtils.isEmpty(resultList) && resultList.size() > 1){ + if (!CollectionUtils.isEmpty(resultList) && resultList.size() > 1) { Collections.swap(resultList, 1, 2); } return ResponseData.success(resultList); @@ -734,15 +761,18 @@ return assessResultJson; } JSONArray assessData = JSONArray.parseArray(JSON.toJSONString(assessResultJson.getData())); - //所有类型的员工出勤 - List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + //物业和安保类型的员工出勤 + List collect = staffInfoMapper.selectCountByType(); + List staffTypeAndSumDTOS = collect.stream().filter(staffTypeAndSumDTO -> + !"3".equals(staffTypeAndSumDTO.getStaffType()) + ).collect(Collectors.toList()); long sum = staffTypeAndSumDTOS.stream().collect(Collectors.summarizingInt(StaffTypeAndSumDTO::getSum)).getSum(); List countByTypeAndDateForWeek = attendanceInfoMapper.getCountByTypeAndDateForWeek(); Map> dateMap = countByTypeAndDateForWeek.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); HashMap attendanceMap = new HashMap<>(); dateMap.keySet().forEach(key -> { List attendanceRatioDTOS = dateMap.get(key); - //当天所有类型的员工的出勤人数 + //当天物业和安保类型的员工的出勤人数 long sum1 = attendanceRatioDTOS.stream().collect(Collectors.summarizingInt(AttendanceRatioDTO::getQuantity)).getSum(); //出勤占比评分 Double attendanceRatio = ((float) sum1 / (float) sum) * 100 * cockpitConfig.getCommuteWeight(); @@ -1138,7 +1168,7 @@ securityScoreMap.put(date, BigDecimal.valueOf(100)); } } - if(CollectionUtils.isEmpty(repairMap)){ + if (CollectionUtils.isEmpty(repairMap)) { for (String date : dateList) { repairMap.put(date, BigDecimal.valueOf(100)); } @@ -1177,10 +1207,172 @@ return ResponseData.success(list); } + @Override + public Object securityScore() { + //按发生事件的设备所在的position划分计算评分,当天发生的事件 + String position = null; + List caseInfos = caseInfoMapper.selectByPosition(position); + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + + List securityScoreDTOs = new ArrayList<>(); + caseInfos.forEach(caseInfo -> { + SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); + securityScoreDTO1.setArea(caseInfo.getArea()); + 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); + }); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + 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); + } + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); + }); + //返回数据补全处理 + 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); + } + } + } + + //各楼栋设备维修次数(发生一次维修减5分) + //当天在设备维修期间的设备个数及所在楼栋 + List todayDTOList = repairLogMapper.selectTodayList(); + if(!CollectionUtils.isEmpty(todayDTOList)){ + for (RepairTodayDTO today : todayDTOList) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, today.getPosition()); + Double d = resultMap.get(dictValue) - today.getNumber()*5; + resultMap.put(dictValue, d); + } + } + + //各楼栋消防设备有效期(距有效期不到三个月减5分) + //当天在设备维修期间的设备个数及所在楼栋 + List repairTodayDTOList = fireEquipInfoMapper.selectNearExpireList(); + if(!CollectionUtils.isEmpty(repairTodayDTOList)){ + for (RepairTodayDTO today : repairTodayDTOList) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, today.getPosition()); + Double d = resultMap.get(dictValue) - today.getNumber()*5; + resultMap.put(dictValue, d); + } + } + + //各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + List list = visitInfoMapper.selectListForToDay(); + //未在申请时间段内离开减分(包括无离开时间和有离开时间两种情况)、未在申请区域内离开减分 + if(!CollectionUtils.isEmpty(list)){ + for (MultiScoreVisitorDTO visitorDTO : list) { + //无离开时间 + if (StringUtils.isEmpty(visitorDTO.getOutTime()) && StringUtils.isNotEmpty(visitorDTO.getVisitPosition())) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - cockpitConfig.getVisitorWeight().get("NoRecordPointDeduct"); + resultMap.put(dictValue, d); + } else if(StringUtils.isNotEmpty(visitorDTO.getVisitPosition()) && StringUtils.isNotEmpty(visitorDTO.getOutTime())){ + DateTime applyOutDateTime = DateUtil.parseDateTime(visitorDTO.getApplyOutTime()); + DateTime outDateTime = DateUtil.parseDateTime(visitorDTO.getOutTime()); + //未在申请时间段离开(在申请离开时间后离开) + if (DateUtil.compare(outDateTime, applyOutDateTime) > 0) { + long betweenHour = DateUtil.between(outDateTime, applyOutDateTime, DateUnit.HOUR); + Double score = betweenHour * cockpitConfig.getVisitorWeight().get("singlePointDeduct"); + //该访客扣分到达最多分 + if (score >= cockpitConfig.getVisitorWeight().get("mostPointDeduct")) { + score = cockpitConfig.getVisitorWeight().get("mostPointDeduct"); + } + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - score; + resultMap.put(dictValue, d); + } + //未在申请区域离开 + if (StringUtils.isNotEmpty(visitorDTO.getApplyVisitPosition()) && !visitorDTO.getApplyVisitPosition().equals(visitorDTO.getVisitPosition())) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - cockpitConfig.getVisitorWeight().get("singlePointDeduct"); + resultMap.put(dictValue, d); + } + } + } + } + return ResponseData.success(resultMap); + } + + @Override + public List personList(PersonListRequest personListRequest) { + //查询员工列表 + List staffList = staffInfoMapper.selectForPersonList(personListRequest); + staffList.stream().parallel().forEach(staff -> { + getFiledFromHik(staff); + }); + + //查询黑名单列表 + List blackList = blackInfoMapper.selectForPersonList(personListRequest); + blackList.stream().forEach(black -> { + black.setPersonType("黑名单"); + }); + + //查询访客列表 + List visitList = visitInfoMapper.selectForPersonList(personListRequest); + visitList.stream().forEach(visit -> { + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(visit.getPicUri()); + picRequest.setServerIndexCode(visit.getServerIndexCode()); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + visit.setPersonPicture(HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody)); + visit.setPersonType("访客"); + }); + + //列表结合,顺序:员工、黑名单、访客 + List resultList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(staffList)){ + staffList.addAll(blackList); + staffList.addAll(visitList); + resultList = staffList; + }else if(!CollectionUtils.isEmpty(blackList)){ + blackList.addAll(visitList); + resultList = blackList; + }else { + resultList = visitList; + } + return resultList; + } + private List> getForResult(List weekCaseDTOS, List weekCaseKeyAreaDTOS, - List caseInfos, HashMap weekCaseMap, HashMap caseScoreMap, - HashMap keyAreaScoreMap, HashMap assessScoreMap, - List dateList){ + List caseInfos, HashMap weekCaseMap, HashMap caseScoreMap, + HashMap keyAreaScoreMap, HashMap assessScoreMap, + List dateList) { Map keyAreaWeight = cockpitConfig.getKeyAreaWeight(); weekCaseKeyAreaDTOS.forEach(dto -> { weekCaseMap.put(dto.getDimension(), BigDecimal.valueOf(dto.getQuantity())); @@ -1270,4 +1462,53 @@ }); return resultList; } + + private void getFiledFromHik(PersonListResponse staffInfo) { + String staffCode = staffInfo.getStaffCode(); + 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; + } + log.info("请求海康,根据人员唯一字段获取人员详细信息response:{}", resultStr); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + if(0 == personPhoto.size()){ + return; + } + //海康组织名 + String orgPathName = jsonObject.getString("orgPathName"); + String replace = orgPathName.replace("🆗", ""); + staffInfo.setPersonType(replace); + 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")){ + staffInfo.setPersonPicture("https://192.168.10.2:443" + pictureFromHik); + }else{ + staffInfo.setPersonPicture(pictureFromHik); + } + } } 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 c39a5fa..c3d889c 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 @@ -62,6 +62,7 @@ List pageList = staffInfoMapper.getStaffInfoListPage(page, staffInfoRequest); pageList.stream().forEach(staffInfo -> { staffInfo.setStaffTypeName(dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, staffInfo.getStaffType())); + staffInfo.setStaffGenderName(dictService.getDictNameByCode(SecurityEventDict.SYS_SEX, staffInfo.getStaffGender())); // staffInfo.setPicture(getPictureFromHik(staffInfo.getStaffCode())); getFiledFromHik(staffInfo); }); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java index f3687cd..5ef33c7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; @@ -20,6 +21,8 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -40,7 +43,6 @@ @Override public List staffInoutLogListPage(Page page, StaffInoutLogRequest inoutLogRequest) { try { -// todo员工编号和员工列表一致,进出记录中空数据问题,进出方式问题 List pageList = inoutLogMapper.selectStaffInoutLogList(page, inoutLogRequest); pageList.stream().forEach(inoutLog -> { inoutLog.setPassWayName(dictService.getDictNameByCode(SecurityEventDict.PASS_WAY, inoutLog.getPassWay())); @@ -49,8 +51,8 @@ //doorArea为前端文档参数,先取position inoutLog.setDoorArea(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, inoutLog.getDoorArea())); inoutLog.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, inoutLog.getArea())); - //获取海康组织名,根据组织编号获取 - getFiledFromHik(inoutLog); + //获取海康组织名和照片,根据组织编号获取,不使用,影响查询效率 +// getFiledFromHik(inoutLog); }); return pageList; } catch (DataAccessException ex) { @@ -60,6 +62,19 @@ } + @Override + public void deleteMoreThanWeekLog() { + QueryWrapper wrapper = new QueryWrapper<>(); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate ago = LocalDate.now().minusDays(7); + String dateStr = ago.format(df); + wrapper.apply("{0} > DATE_FORMAT(create_time,'%Y-%m-%d')", dateStr); + int delete = inoutLogMapper.delete(wrapper); + if(delete < 0){ + log.error("删除一周前人员进出记录数据失败"); + } + } + private void getFiledFromHik(StaffInoutLog staffInoutLog) { String staffCode = staffInoutLog.getStaffCode(); PersonInfoRequest request = new PersonInfoRequest(); 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 937a9de..9764e9c 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 @@ -159,9 +159,17 @@ //获取30天前对应的当前年的第几周 int startWeek = cn.hutool.core.date.DateUtil.weekOfYear(startDate); int endWeek = cn.hutool.core.date.DateUtil.weekOfYear(now); + if (startWeek > endWeek) { + startWeek = 1; + } int year = cn.hutool.core.date.DateUtil.thisYear(); for (int i = startWeek; i < endWeek + 1; i++) { - list.add("" + year + "-" + i); + if (i < 10) { + list.add("" + year + "-0" + i); + } else { + list.add("" + year + "-" + i); + } + } return list; } @@ -208,7 +216,7 @@ } /** - * 30天前的7天日期 + * 30天前的7天日期 */ public static List getCurrentDateDayBeforeMonthList() { List list = new ArrayList<>(); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java new file mode 100644 index 0000000..445467d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询响应 + * @Author: wangpeng + * @Date: 2023/1/30 9:11 + */ +@Data +public class PersonListResponse { + //人员类型,黑名单/访客/员工所属组织 + private String personType; + //姓名 + private String personName; + //员工类型:工号,黑名单类型:黑名单编号,访客类型:无 + private String personNo; + //人员图片 + private String personPicture; + //性别 + private String gender; + + @JsonIgnore + private String staffCode; + @JsonIgnore + private String picUri; + @JsonIgnore + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java new file mode 100644 index 0000000..afd8673 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/9 16:59 + */ +@Data +public class SearchPicturesResponse { + private String devName; + private String drawNo; + private String position; + private String positionName; + private String area; + private String areaName; + private String facePicUrl; + private String bkgPicUrl; + private String similarity; + private String time; + private String sex; + private String rect; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java new file mode 100644 index 0000000..ce703af --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/29 16:24 + */ +@Data +public class RepairTodayDTO { + private Integer number; + private String position; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index bb00c7c..8de64ef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -14,6 +14,7 @@ import com.casic.missiles.modular.model.StatisticNumber; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.service.StaffInoutLogService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -46,6 +47,8 @@ private AbstractDictService dictService; @Autowired private StaffInfoService staffInfoService; + @Autowired + private StaffInoutLogService inoutLogService; /** * 统计一期二期楼栋,每小时存储各楼栋人数 @@ -130,6 +133,15 @@ } + /** + * 每天0点删除一周外的人员进出记录 + */ + @Scheduled(cron = "0 0 0 * * ?") + @Transactional + public void deleteStaffInOutLog() { + inoutLogService.deleteMoreThanWeekLog(); + } + private List getSyncPersonList(PersonListRequest request, JSONObject resultJson, List personList) { if (!"0".equals(resultJson.get("code"))) { log.error("请求海康,获取人员列表v2失败,海康response:{}", resultJson.toJSONString()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java index 7a7fe8a..fbfda1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java @@ -45,4 +45,8 @@ Object areaScore(SecurityScoreDTO securityScoreDTO); Object heatMap(HeatMapDTO heatMapDTO); + + Object eventNumber(); + + Object offlineRate(); } 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 7e29e1f..09efe70 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 @@ -66,4 +66,6 @@ DeviceInfo deviceInfoByDrawNo(String drawNo); List getDeviceStatusGroupByArea(DeviceAreaRequest deviceAreaRequest); + + DeviceInfo selectByIndexCode(String cameraIndexCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java index 5b8189f..09fce1a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java @@ -1,8 +1,12 @@ package com.casic.missiles.modular.service; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; +import java.util.List; + /** * @Description: * @Author: wangpeng @@ -42,4 +46,8 @@ Object other(); Object highFrequency(); + + Object securityScore(); + + List personList(PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java index 5a92eba..ed5b3a4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java @@ -15,4 +15,6 @@ public interface StaffInoutLogService extends IService { List staffInoutLogListPage(Page page, StaffInoutLogRequest inoutLogRequest); + + void deleteMoreThanWeekLog(); } 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 1c34f68..972d3ab 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 @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.config.DeviceLinkageConfig; import com.casic.missiles.modular.dao.CaseInfoMapper; import com.casic.missiles.modular.dao.CategoryLevelMapper; import com.casic.missiles.modular.dao.DeviceInfoMapper; @@ -59,6 +60,9 @@ @Resource private DeviceInfoMapper deviceInfoMapper; + @Autowired + private DeviceLinkageConfig deviceLinkageConfig; + @Override public List caseInfoListPage(Page page, CaseInfoRequest caseInfoRequest) { try { @@ -78,6 +82,29 @@ @Override public int updateStatus(CaseInfoRequest caseInfoRequest) { +// //若事件为黑名单事件且事件为未解决,将闸机设置为门闭(即非常闭,可正常开关门) +// CaseInfo caseInfo = caseInfoMapper.selectById(caseInfoRequest.getId()); +// if(!Objects.isNull(caseInfo) && 1644175361 == caseInfo.getHikEventType() +// && caseInfo.getDescription().contains("黑名单") && "3" != caseInfo.getStatus() +// && "3" == caseInfoRequest.getStatus()){ +// HashMap> configMap = deviceLinkageConfig.getConfigMap(); +// List list = configMap.get(caseInfo.getIndexCode()); +// //海康门禁点反控 +// DoorControlRequest doorControlRequest = new DoorControlRequest(); +// //需根据设备编号获取到对应的门禁点唯一标识 +// doorControlRequest.setDoorIndexCodes(list); +// //门闭 +// doorControlRequest.setControlType(1); +// String body = JSONObject.toJSONString(doorControlRequest); +// String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); +// JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); +// if (!"0".equals(resultJson.get("code"))) { +// log.error("解决黑名单事件,请求海康,门禁点反控失败,海康response:{}", resultStr); +// }else{ +// log.info("解决黑名单事件,请求海康,门禁点反控成功"); +// } +// } + return caseInfoMapper.updateStatusById(caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index f452b5f..6f4956b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -105,7 +105,7 @@ doorEventsRequest.setPageNo(i); String body1 = JSONObject.toJSONString(doorEventsRequest); String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); - JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); if (!"0".equals(resultJson1.get("code"))) { log.error("请求海康,循环查询海康门禁点事件v2失败,海康response:{}", resultStr1); return; @@ -147,7 +147,7 @@ //进门 if (1 == inAndOutType) { ++num; - } else if (0 == inAndOutType) { + } else { --num; } } @@ -655,6 +655,33 @@ return ResponseData.success(resultMap); } + @Override + public Object eventNumber() { + List caseInfos = caseInfoMapper.selectListByToday4(); + List resolvedCaseInfos = caseInfos.stream().filter(caseInfo -> "3".equals(caseInfo.getStatus())).collect(Collectors.toList()); + HashMap resultMap = new HashMap<>(); + resultMap.put("今日事件数", caseInfos.size()); + resultMap.put("今日事件处置数", resolvedCaseInfos.size()); + return ResponseData.success(resultMap); + } + + @Override + public Object offlineRate() { + QueryWrapper wrapper = new QueryWrapper<>(); + Integer total = deviceInfoMapper.selectCount(wrapper); + QueryWrapper wrapper1 = new QueryWrapper<>(); + wrapper1.eq("status", 2); //字典值:在线1、离线2、故障3 + Integer offline = deviceInfoMapper.selectCount(wrapper1); + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format((float) offline / (float) total * 100); + HashMap resultMap = new HashMap<>(); +// resultMap.put("设备总数", total); + resultMap.put("设备离线率", result + "%"); + return ResponseData.success(resultMap); + } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { resultMap.keySet().forEach(key -> { List monthAndLevelGroupDTOS = resultMap.get(key); 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 2dd34b6..76d8ff6 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 @@ -469,4 +469,12 @@ return deviceStatusDTOS; } + @Override + public DeviceInfo selectByIndexCode(String cameraIndexCode) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("index_code", cameraIndexCode); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } + } 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 0f02ccb..c676f2a 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,6 +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.config.DeviceLinkageConfig; import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; @@ -31,27 +32,22 @@ @Slf4j @Service public class HikServiceImpl implements HikService { - @Resource private AbstractDictService dictService; - @Autowired private StaffInfoMapper staffInfoMapper; - @Autowired private AttendanceInfoMapper attendanceInfoMapper; - @Autowired private VisitInfoMapper visitInfoMapper; - @Autowired private DeviceInfoMapper deviceInfoMapper; - @Autowired private CaseInfoMapper caseInfoMapper; - @Autowired private StaffInoutLogMapper inoutLogMapper; + @Autowired + private DeviceLinkageConfig deviceLinkageConfig; @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { @@ -71,6 +67,26 @@ log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } +// //发生黑名单事件,若匹配联动配置,常闭指定闸机 +// HashMap> configMap = deviceLinkageConfig.getConfigMap(); +// if(!CollectionUtils.isEmpty(configMap.get(srcIndex))){ +// List list = configMap.get(srcIndex); +// //海康门禁点反控 +// DoorControlRequest doorControlRequest = new DoorControlRequest(); +// //需根据设备编号获取到对应的门禁点唯一标识 +// doorControlRequest.setDoorIndexCodes(list); +// //常闭 +// doorControlRequest.setControlType(3); +// String body = JSONObject.toJSONString(doorControlRequest); +// String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); +// JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); +// if (!"0".equals(resultJson.get("code"))) { +// log.error("发生黑名单事件,请求海康,门禁点反控失败,海康response:{}", resultStr); +// }else{ +// log.info("发生黑名单事件,请求海康,门禁点反控成功"); +// } +// } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java index b2e826f..cf61c40 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java @@ -12,13 +12,18 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.config.CockpitConfig; import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.*; import com.casic.missiles.modular.service.PropertyManageService; import com.casic.missiles.modular.system.model.Dict; import com.casic.missiles.modular.util.DateUtils; +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; @@ -43,6 +48,8 @@ @Autowired private StaffInfoMapper staffInfoMapper; @Autowired + private BlackInfoMapper blackInfoMapper; + @Autowired private CaseInfoMapper caseInfoMapper; @Autowired private HazardLevelMapper hazardLevelMapper; @@ -53,6 +60,8 @@ @Autowired private DeviceRepairLogMapper repairLogMapper; @Autowired + private FireEquipInfoMapper fireEquipInfoMapper; + @Autowired private CockpitConfig cockpitConfig; @Autowired private AbstractDictService dictService; @@ -167,20 +176,38 @@ for (String date : dateList) { Integer flag = 0; for (PreMonthOrWeekCaseDTO dto : resultList) { - if(dto.getDimension().equals(date)){ + if (dto.getDimension().equals(date)) { finalList.add(dto); flag = 1; } } - if(flag == 0){ + if (flag == 0) { PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); preMonthOrWeekCaseDTO.setDimension(date); preMonthOrWeekCaseDTO.setQuantity(0); finalList.add(preMonthOrWeekCaseDTO); } } + if ("month".equals(dimension)) { + finalList.stream().forEach(f -> { + String dimension1 = f.getDimension(); + StringBuilder stringBuilder = new StringBuilder(dimension1); + stringBuilder.insert(5, "第"); + stringBuilder.append("周"); + f.setDimension(String.valueOf(stringBuilder)); + }); + } return ResponseData.success(finalList); } + if ("month".equals(dimension)) { + resultList.stream().forEach(f -> { + String dimension1 = f.getDimension(); + StringBuilder stringBuilder = new StringBuilder(dimension1); + stringBuilder.insert(5, "第"); + stringBuilder.append("周"); + f.setDimension(String.valueOf(stringBuilder)); + }); + } return ResponseData.success(resultList); } @@ -200,7 +227,7 @@ String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); if (year.equals(String.valueOf(DateUtil.thisYear()))) { - monthAndWeekDTO.setMonthQuantity(sum / (DateUtil.thisMonth()+1)); + monthAndWeekDTO.setMonthQuantity(sum / (DateUtil.thisMonth() + 1)); strAvgMap.put(key, monthAndWeekDTO); } else { monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -247,7 +274,7 @@ resultList.add(strAvgMap.get(key)); }); //输出顺序 - if(!CollectionUtils.isEmpty(resultList) && resultList.size() > 1){ + if (!CollectionUtils.isEmpty(resultList) && resultList.size() > 1) { Collections.swap(resultList, 1, 2); } return ResponseData.success(resultList); @@ -734,15 +761,18 @@ return assessResultJson; } JSONArray assessData = JSONArray.parseArray(JSON.toJSONString(assessResultJson.getData())); - //所有类型的员工出勤 - List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + //物业和安保类型的员工出勤 + List collect = staffInfoMapper.selectCountByType(); + List staffTypeAndSumDTOS = collect.stream().filter(staffTypeAndSumDTO -> + !"3".equals(staffTypeAndSumDTO.getStaffType()) + ).collect(Collectors.toList()); long sum = staffTypeAndSumDTOS.stream().collect(Collectors.summarizingInt(StaffTypeAndSumDTO::getSum)).getSum(); List countByTypeAndDateForWeek = attendanceInfoMapper.getCountByTypeAndDateForWeek(); Map> dateMap = countByTypeAndDateForWeek.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); HashMap attendanceMap = new HashMap<>(); dateMap.keySet().forEach(key -> { List attendanceRatioDTOS = dateMap.get(key); - //当天所有类型的员工的出勤人数 + //当天物业和安保类型的员工的出勤人数 long sum1 = attendanceRatioDTOS.stream().collect(Collectors.summarizingInt(AttendanceRatioDTO::getQuantity)).getSum(); //出勤占比评分 Double attendanceRatio = ((float) sum1 / (float) sum) * 100 * cockpitConfig.getCommuteWeight(); @@ -1138,7 +1168,7 @@ securityScoreMap.put(date, BigDecimal.valueOf(100)); } } - if(CollectionUtils.isEmpty(repairMap)){ + if (CollectionUtils.isEmpty(repairMap)) { for (String date : dateList) { repairMap.put(date, BigDecimal.valueOf(100)); } @@ -1177,10 +1207,172 @@ return ResponseData.success(list); } + @Override + public Object securityScore() { + //按发生事件的设备所在的position划分计算评分,当天发生的事件 + String position = null; + List caseInfos = caseInfoMapper.selectByPosition(position); + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + + List securityScoreDTOs = new ArrayList<>(); + caseInfos.forEach(caseInfo -> { + SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); + securityScoreDTO1.setArea(caseInfo.getArea()); + 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); + }); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + 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); + } + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); + }); + //返回数据补全处理 + 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); + } + } + } + + //各楼栋设备维修次数(发生一次维修减5分) + //当天在设备维修期间的设备个数及所在楼栋 + List todayDTOList = repairLogMapper.selectTodayList(); + if(!CollectionUtils.isEmpty(todayDTOList)){ + for (RepairTodayDTO today : todayDTOList) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, today.getPosition()); + Double d = resultMap.get(dictValue) - today.getNumber()*5; + resultMap.put(dictValue, d); + } + } + + //各楼栋消防设备有效期(距有效期不到三个月减5分) + //当天在设备维修期间的设备个数及所在楼栋 + List repairTodayDTOList = fireEquipInfoMapper.selectNearExpireList(); + if(!CollectionUtils.isEmpty(repairTodayDTOList)){ + for (RepairTodayDTO today : repairTodayDTOList) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, today.getPosition()); + Double d = resultMap.get(dictValue) - today.getNumber()*5; + resultMap.put(dictValue, d); + } + } + + //各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + List list = visitInfoMapper.selectListForToDay(); + //未在申请时间段内离开减分(包括无离开时间和有离开时间两种情况)、未在申请区域内离开减分 + if(!CollectionUtils.isEmpty(list)){ + for (MultiScoreVisitorDTO visitorDTO : list) { + //无离开时间 + if (StringUtils.isEmpty(visitorDTO.getOutTime()) && StringUtils.isNotEmpty(visitorDTO.getVisitPosition())) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - cockpitConfig.getVisitorWeight().get("NoRecordPointDeduct"); + resultMap.put(dictValue, d); + } else if(StringUtils.isNotEmpty(visitorDTO.getVisitPosition()) && StringUtils.isNotEmpty(visitorDTO.getOutTime())){ + DateTime applyOutDateTime = DateUtil.parseDateTime(visitorDTO.getApplyOutTime()); + DateTime outDateTime = DateUtil.parseDateTime(visitorDTO.getOutTime()); + //未在申请时间段离开(在申请离开时间后离开) + if (DateUtil.compare(outDateTime, applyOutDateTime) > 0) { + long betweenHour = DateUtil.between(outDateTime, applyOutDateTime, DateUnit.HOUR); + Double score = betweenHour * cockpitConfig.getVisitorWeight().get("singlePointDeduct"); + //该访客扣分到达最多分 + if (score >= cockpitConfig.getVisitorWeight().get("mostPointDeduct")) { + score = cockpitConfig.getVisitorWeight().get("mostPointDeduct"); + } + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - score; + resultMap.put(dictValue, d); + } + //未在申请区域离开 + if (StringUtils.isNotEmpty(visitorDTO.getApplyVisitPosition()) && !visitorDTO.getApplyVisitPosition().equals(visitorDTO.getVisitPosition())) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - cockpitConfig.getVisitorWeight().get("singlePointDeduct"); + resultMap.put(dictValue, d); + } + } + } + } + return ResponseData.success(resultMap); + } + + @Override + public List personList(PersonListRequest personListRequest) { + //查询员工列表 + List staffList = staffInfoMapper.selectForPersonList(personListRequest); + staffList.stream().parallel().forEach(staff -> { + getFiledFromHik(staff); + }); + + //查询黑名单列表 + List blackList = blackInfoMapper.selectForPersonList(personListRequest); + blackList.stream().forEach(black -> { + black.setPersonType("黑名单"); + }); + + //查询访客列表 + List visitList = visitInfoMapper.selectForPersonList(personListRequest); + visitList.stream().forEach(visit -> { + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(visit.getPicUri()); + picRequest.setServerIndexCode(visit.getServerIndexCode()); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + visit.setPersonPicture(HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody)); + visit.setPersonType("访客"); + }); + + //列表结合,顺序:员工、黑名单、访客 + List resultList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(staffList)){ + staffList.addAll(blackList); + staffList.addAll(visitList); + resultList = staffList; + }else if(!CollectionUtils.isEmpty(blackList)){ + blackList.addAll(visitList); + resultList = blackList; + }else { + resultList = visitList; + } + return resultList; + } + private List> getForResult(List weekCaseDTOS, List weekCaseKeyAreaDTOS, - List caseInfos, HashMap weekCaseMap, HashMap caseScoreMap, - HashMap keyAreaScoreMap, HashMap assessScoreMap, - List dateList){ + List caseInfos, HashMap weekCaseMap, HashMap caseScoreMap, + HashMap keyAreaScoreMap, HashMap assessScoreMap, + List dateList) { Map keyAreaWeight = cockpitConfig.getKeyAreaWeight(); weekCaseKeyAreaDTOS.forEach(dto -> { weekCaseMap.put(dto.getDimension(), BigDecimal.valueOf(dto.getQuantity())); @@ -1270,4 +1462,53 @@ }); return resultList; } + + private void getFiledFromHik(PersonListResponse staffInfo) { + String staffCode = staffInfo.getStaffCode(); + 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; + } + log.info("请求海康,根据人员唯一字段获取人员详细信息response:{}", resultStr); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + if(0 == personPhoto.size()){ + return; + } + //海康组织名 + String orgPathName = jsonObject.getString("orgPathName"); + String replace = orgPathName.replace("🆗", ""); + staffInfo.setPersonType(replace); + 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")){ + staffInfo.setPersonPicture("https://192.168.10.2:443" + pictureFromHik); + }else{ + staffInfo.setPersonPicture(pictureFromHik); + } + } } 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 c39a5fa..c3d889c 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 @@ -62,6 +62,7 @@ List pageList = staffInfoMapper.getStaffInfoListPage(page, staffInfoRequest); pageList.stream().forEach(staffInfo -> { staffInfo.setStaffTypeName(dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, staffInfo.getStaffType())); + staffInfo.setStaffGenderName(dictService.getDictNameByCode(SecurityEventDict.SYS_SEX, staffInfo.getStaffGender())); // staffInfo.setPicture(getPictureFromHik(staffInfo.getStaffCode())); getFiledFromHik(staffInfo); }); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java index f3687cd..5ef33c7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; @@ -20,6 +21,8 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -40,7 +43,6 @@ @Override public List staffInoutLogListPage(Page page, StaffInoutLogRequest inoutLogRequest) { try { -// todo员工编号和员工列表一致,进出记录中空数据问题,进出方式问题 List pageList = inoutLogMapper.selectStaffInoutLogList(page, inoutLogRequest); pageList.stream().forEach(inoutLog -> { inoutLog.setPassWayName(dictService.getDictNameByCode(SecurityEventDict.PASS_WAY, inoutLog.getPassWay())); @@ -49,8 +51,8 @@ //doorArea为前端文档参数,先取position inoutLog.setDoorArea(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, inoutLog.getDoorArea())); inoutLog.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, inoutLog.getArea())); - //获取海康组织名,根据组织编号获取 - getFiledFromHik(inoutLog); + //获取海康组织名和照片,根据组织编号获取,不使用,影响查询效率 +// getFiledFromHik(inoutLog); }); return pageList; } catch (DataAccessException ex) { @@ -60,6 +62,19 @@ } + @Override + public void deleteMoreThanWeekLog() { + QueryWrapper wrapper = new QueryWrapper<>(); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate ago = LocalDate.now().minusDays(7); + String dateStr = ago.format(df); + wrapper.apply("{0} > DATE_FORMAT(create_time,'%Y-%m-%d')", dateStr); + int delete = inoutLogMapper.delete(wrapper); + if(delete < 0){ + log.error("删除一周前人员进出记录数据失败"); + } + } + private void getFiledFromHik(StaffInoutLog staffInoutLog) { String staffCode = staffInoutLog.getStaffCode(); PersonInfoRequest request = new PersonInfoRequest(); 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 937a9de..9764e9c 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 @@ -159,9 +159,17 @@ //获取30天前对应的当前年的第几周 int startWeek = cn.hutool.core.date.DateUtil.weekOfYear(startDate); int endWeek = cn.hutool.core.date.DateUtil.weekOfYear(now); + if (startWeek > endWeek) { + startWeek = 1; + } int year = cn.hutool.core.date.DateUtil.thisYear(); for (int i = startWeek; i < endWeek + 1; i++) { - list.add("" + year + "-" + i); + if (i < 10) { + list.add("" + year + "-0" + i); + } else { + list.add("" + year + "-" + i); + } + } return list; } @@ -208,7 +216,7 @@ } /** - * 30天前的7天日期 + * 30天前的7天日期 */ public static List getCurrentDateDayBeforeMonthList() { List list = new ArrayList<>(); diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index d3a3e77..896583c 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: /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,/caseInfo/update,/**/list/unResolved,/last/drawNo,/multiScore/** + 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,/caseInfo/update,/**/list/unResolved,/last/drawNo,/multiScore/**,/deviceInfo/cameraList #flowable数据源和多数据源配置 db: init: @@ -82,4 +82,20 @@ 2e22b7c9206c4184a756c7c091422a8d,bbb12547f1d1453c8be02d6e8c413338,d4612a78089a4dcab0df417591c346e8,d277ae7102774ba6bd568cff9bbdfc08, 57c2a7b7c19d48c9b04ac5f2e1c4b3ed,69dee9f5bb51435bb9045cc5d59fa194,e5c6c81beee24131b18e12862123a68b,950b1a1708534bbbbb40dcb36d21eb70, 9b8450815d47401482dd7d4b075e4229,d69c2a94fb0a49ca86b0d9faa920068a,588593de9e7f42f9819f08f7cfc6ae86,ed7de18f260441f3aef025696e3bdb09, - dd6dd56306c746fabdd637a3489cef00,6b660fcc97e34c7c82c1ef517a88bb52,b62e4f68120249babd6203c90b53cb7a,0513c3e1926f450fb403f441dd644fcd] \ No newline at end of file + dd6dd56306c746fabdd637a3489cef00,6b660fcc97e34c7c82c1ef517a88bb52,b62e4f68120249babd6203c90b53cb7a,0513c3e1926f450fb403f441dd644fcd] + +#闸机与监控点联动 +#指定监控点识别黑名单事件后关闭对应闸机 +devicelinkage: + configMap: + #一期主楼 + 1d07f327d63f4fabac94d6e0fc92496c: [534542c51e9c4499becf464ec80895f5,9efea996b23840b691ddb80e823f3d8d,7e6b4f58908040bd871279a0701b2b62, + 889916c8a9b749febb56c569fab4a2b2,1eacbe03363c4b2980a59999188fc116] + #录制楼 + ad83b94f17e24814abc84e2c576265ec: [2014a1d8fead4b76a5cb836ecf1c4db6,4b56821684224b8ea0467acae2fa4f6f,7840b20c767b47b68f1cfd5050be0333] + #二期主楼西门 + bc4fdb9593b448d5b6f001bded208188: [a02e957b3e8d446fb41c1adb729524fe,8f659690e27244bdba65dd2d0fa313ba,03bfd8c696fa46018f10b17faa7c5e41, + 2e22b7c9206c4184a756c7c091422a8d,57c2a7b7c19d48c9b04ac5f2e1c4b3ed,9b8450815d47401482dd7d4b075e4229, + dd6dd56306c746fabdd637a3489cef00] + #二期主楼东门 + 80560cd4292d468aa30809518f047e41: [d0a261d6a8bd4af09302970e392dd771,734530c21fb84bdbabc2ad50d6272ba4,bd86703f5ffe4f4d8ce437416d32fe8b] \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java new file mode 100644 index 0000000..445467d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询响应 + * @Author: wangpeng + * @Date: 2023/1/30 9:11 + */ +@Data +public class PersonListResponse { + //人员类型,黑名单/访客/员工所属组织 + private String personType; + //姓名 + private String personName; + //员工类型:工号,黑名单类型:黑名单编号,访客类型:无 + private String personNo; + //人员图片 + private String personPicture; + //性别 + private String gender; + + @JsonIgnore + private String staffCode; + @JsonIgnore + private String picUri; + @JsonIgnore + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java new file mode 100644 index 0000000..afd8673 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/9 16:59 + */ +@Data +public class SearchPicturesResponse { + private String devName; + private String drawNo; + private String position; + private String positionName; + private String area; + private String areaName; + private String facePicUrl; + private String bkgPicUrl; + private String similarity; + private String time; + private String sex; + private String rect; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java new file mode 100644 index 0000000..ce703af --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/29 16:24 + */ +@Data +public class RepairTodayDTO { + private Integer number; + private String position; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index bb00c7c..8de64ef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -14,6 +14,7 @@ import com.casic.missiles.modular.model.StatisticNumber; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.service.StaffInoutLogService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -46,6 +47,8 @@ private AbstractDictService dictService; @Autowired private StaffInfoService staffInfoService; + @Autowired + private StaffInoutLogService inoutLogService; /** * 统计一期二期楼栋,每小时存储各楼栋人数 @@ -130,6 +133,15 @@ } + /** + * 每天0点删除一周外的人员进出记录 + */ + @Scheduled(cron = "0 0 0 * * ?") + @Transactional + public void deleteStaffInOutLog() { + inoutLogService.deleteMoreThanWeekLog(); + } + private List getSyncPersonList(PersonListRequest request, JSONObject resultJson, List personList) { if (!"0".equals(resultJson.get("code"))) { log.error("请求海康,获取人员列表v2失败,海康response:{}", resultJson.toJSONString()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java index 7a7fe8a..fbfda1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java @@ -45,4 +45,8 @@ Object areaScore(SecurityScoreDTO securityScoreDTO); Object heatMap(HeatMapDTO heatMapDTO); + + Object eventNumber(); + + Object offlineRate(); } 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 7e29e1f..09efe70 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 @@ -66,4 +66,6 @@ DeviceInfo deviceInfoByDrawNo(String drawNo); List getDeviceStatusGroupByArea(DeviceAreaRequest deviceAreaRequest); + + DeviceInfo selectByIndexCode(String cameraIndexCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java index 5b8189f..09fce1a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java @@ -1,8 +1,12 @@ package com.casic.missiles.modular.service; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; +import java.util.List; + /** * @Description: * @Author: wangpeng @@ -42,4 +46,8 @@ Object other(); Object highFrequency(); + + Object securityScore(); + + List personList(PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java index 5a92eba..ed5b3a4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java @@ -15,4 +15,6 @@ public interface StaffInoutLogService extends IService { List staffInoutLogListPage(Page page, StaffInoutLogRequest inoutLogRequest); + + void deleteMoreThanWeekLog(); } 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 1c34f68..972d3ab 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 @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.config.DeviceLinkageConfig; import com.casic.missiles.modular.dao.CaseInfoMapper; import com.casic.missiles.modular.dao.CategoryLevelMapper; import com.casic.missiles.modular.dao.DeviceInfoMapper; @@ -59,6 +60,9 @@ @Resource private DeviceInfoMapper deviceInfoMapper; + @Autowired + private DeviceLinkageConfig deviceLinkageConfig; + @Override public List caseInfoListPage(Page page, CaseInfoRequest caseInfoRequest) { try { @@ -78,6 +82,29 @@ @Override public int updateStatus(CaseInfoRequest caseInfoRequest) { +// //若事件为黑名单事件且事件为未解决,将闸机设置为门闭(即非常闭,可正常开关门) +// CaseInfo caseInfo = caseInfoMapper.selectById(caseInfoRequest.getId()); +// if(!Objects.isNull(caseInfo) && 1644175361 == caseInfo.getHikEventType() +// && caseInfo.getDescription().contains("黑名单") && "3" != caseInfo.getStatus() +// && "3" == caseInfoRequest.getStatus()){ +// HashMap> configMap = deviceLinkageConfig.getConfigMap(); +// List list = configMap.get(caseInfo.getIndexCode()); +// //海康门禁点反控 +// DoorControlRequest doorControlRequest = new DoorControlRequest(); +// //需根据设备编号获取到对应的门禁点唯一标识 +// doorControlRequest.setDoorIndexCodes(list); +// //门闭 +// doorControlRequest.setControlType(1); +// String body = JSONObject.toJSONString(doorControlRequest); +// String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); +// JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); +// if (!"0".equals(resultJson.get("code"))) { +// log.error("解决黑名单事件,请求海康,门禁点反控失败,海康response:{}", resultStr); +// }else{ +// log.info("解决黑名单事件,请求海康,门禁点反控成功"); +// } +// } + return caseInfoMapper.updateStatusById(caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index f452b5f..6f4956b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -105,7 +105,7 @@ doorEventsRequest.setPageNo(i); String body1 = JSONObject.toJSONString(doorEventsRequest); String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); - JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); if (!"0".equals(resultJson1.get("code"))) { log.error("请求海康,循环查询海康门禁点事件v2失败,海康response:{}", resultStr1); return; @@ -147,7 +147,7 @@ //进门 if (1 == inAndOutType) { ++num; - } else if (0 == inAndOutType) { + } else { --num; } } @@ -655,6 +655,33 @@ return ResponseData.success(resultMap); } + @Override + public Object eventNumber() { + List caseInfos = caseInfoMapper.selectListByToday4(); + List resolvedCaseInfos = caseInfos.stream().filter(caseInfo -> "3".equals(caseInfo.getStatus())).collect(Collectors.toList()); + HashMap resultMap = new HashMap<>(); + resultMap.put("今日事件数", caseInfos.size()); + resultMap.put("今日事件处置数", resolvedCaseInfos.size()); + return ResponseData.success(resultMap); + } + + @Override + public Object offlineRate() { + QueryWrapper wrapper = new QueryWrapper<>(); + Integer total = deviceInfoMapper.selectCount(wrapper); + QueryWrapper wrapper1 = new QueryWrapper<>(); + wrapper1.eq("status", 2); //字典值:在线1、离线2、故障3 + Integer offline = deviceInfoMapper.selectCount(wrapper1); + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format((float) offline / (float) total * 100); + HashMap resultMap = new HashMap<>(); +// resultMap.put("设备总数", total); + resultMap.put("设备离线率", result + "%"); + return ResponseData.success(resultMap); + } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { resultMap.keySet().forEach(key -> { List monthAndLevelGroupDTOS = resultMap.get(key); 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 2dd34b6..76d8ff6 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 @@ -469,4 +469,12 @@ return deviceStatusDTOS; } + @Override + public DeviceInfo selectByIndexCode(String cameraIndexCode) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("index_code", cameraIndexCode); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } + } 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 0f02ccb..c676f2a 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,6 +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.config.DeviceLinkageConfig; import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; @@ -31,27 +32,22 @@ @Slf4j @Service public class HikServiceImpl implements HikService { - @Resource private AbstractDictService dictService; - @Autowired private StaffInfoMapper staffInfoMapper; - @Autowired private AttendanceInfoMapper attendanceInfoMapper; - @Autowired private VisitInfoMapper visitInfoMapper; - @Autowired private DeviceInfoMapper deviceInfoMapper; - @Autowired private CaseInfoMapper caseInfoMapper; - @Autowired private StaffInoutLogMapper inoutLogMapper; + @Autowired + private DeviceLinkageConfig deviceLinkageConfig; @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { @@ -71,6 +67,26 @@ log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } +// //发生黑名单事件,若匹配联动配置,常闭指定闸机 +// HashMap> configMap = deviceLinkageConfig.getConfigMap(); +// if(!CollectionUtils.isEmpty(configMap.get(srcIndex))){ +// List list = configMap.get(srcIndex); +// //海康门禁点反控 +// DoorControlRequest doorControlRequest = new DoorControlRequest(); +// //需根据设备编号获取到对应的门禁点唯一标识 +// doorControlRequest.setDoorIndexCodes(list); +// //常闭 +// doorControlRequest.setControlType(3); +// String body = JSONObject.toJSONString(doorControlRequest); +// String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); +// JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); +// if (!"0".equals(resultJson.get("code"))) { +// log.error("发生黑名单事件,请求海康,门禁点反控失败,海康response:{}", resultStr); +// }else{ +// log.info("发生黑名单事件,请求海康,门禁点反控成功"); +// } +// } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java index b2e826f..cf61c40 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java @@ -12,13 +12,18 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.config.CockpitConfig; import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.*; import com.casic.missiles.modular.service.PropertyManageService; import com.casic.missiles.modular.system.model.Dict; import com.casic.missiles.modular.util.DateUtils; +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; @@ -43,6 +48,8 @@ @Autowired private StaffInfoMapper staffInfoMapper; @Autowired + private BlackInfoMapper blackInfoMapper; + @Autowired private CaseInfoMapper caseInfoMapper; @Autowired private HazardLevelMapper hazardLevelMapper; @@ -53,6 +60,8 @@ @Autowired private DeviceRepairLogMapper repairLogMapper; @Autowired + private FireEquipInfoMapper fireEquipInfoMapper; + @Autowired private CockpitConfig cockpitConfig; @Autowired private AbstractDictService dictService; @@ -167,20 +176,38 @@ for (String date : dateList) { Integer flag = 0; for (PreMonthOrWeekCaseDTO dto : resultList) { - if(dto.getDimension().equals(date)){ + if (dto.getDimension().equals(date)) { finalList.add(dto); flag = 1; } } - if(flag == 0){ + if (flag == 0) { PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); preMonthOrWeekCaseDTO.setDimension(date); preMonthOrWeekCaseDTO.setQuantity(0); finalList.add(preMonthOrWeekCaseDTO); } } + if ("month".equals(dimension)) { + finalList.stream().forEach(f -> { + String dimension1 = f.getDimension(); + StringBuilder stringBuilder = new StringBuilder(dimension1); + stringBuilder.insert(5, "第"); + stringBuilder.append("周"); + f.setDimension(String.valueOf(stringBuilder)); + }); + } return ResponseData.success(finalList); } + if ("month".equals(dimension)) { + resultList.stream().forEach(f -> { + String dimension1 = f.getDimension(); + StringBuilder stringBuilder = new StringBuilder(dimension1); + stringBuilder.insert(5, "第"); + stringBuilder.append("周"); + f.setDimension(String.valueOf(stringBuilder)); + }); + } return ResponseData.success(resultList); } @@ -200,7 +227,7 @@ String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); if (year.equals(String.valueOf(DateUtil.thisYear()))) { - monthAndWeekDTO.setMonthQuantity(sum / (DateUtil.thisMonth()+1)); + monthAndWeekDTO.setMonthQuantity(sum / (DateUtil.thisMonth() + 1)); strAvgMap.put(key, monthAndWeekDTO); } else { monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -247,7 +274,7 @@ resultList.add(strAvgMap.get(key)); }); //输出顺序 - if(!CollectionUtils.isEmpty(resultList) && resultList.size() > 1){ + if (!CollectionUtils.isEmpty(resultList) && resultList.size() > 1) { Collections.swap(resultList, 1, 2); } return ResponseData.success(resultList); @@ -734,15 +761,18 @@ return assessResultJson; } JSONArray assessData = JSONArray.parseArray(JSON.toJSONString(assessResultJson.getData())); - //所有类型的员工出勤 - List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + //物业和安保类型的员工出勤 + List collect = staffInfoMapper.selectCountByType(); + List staffTypeAndSumDTOS = collect.stream().filter(staffTypeAndSumDTO -> + !"3".equals(staffTypeAndSumDTO.getStaffType()) + ).collect(Collectors.toList()); long sum = staffTypeAndSumDTOS.stream().collect(Collectors.summarizingInt(StaffTypeAndSumDTO::getSum)).getSum(); List countByTypeAndDateForWeek = attendanceInfoMapper.getCountByTypeAndDateForWeek(); Map> dateMap = countByTypeAndDateForWeek.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); HashMap attendanceMap = new HashMap<>(); dateMap.keySet().forEach(key -> { List attendanceRatioDTOS = dateMap.get(key); - //当天所有类型的员工的出勤人数 + //当天物业和安保类型的员工的出勤人数 long sum1 = attendanceRatioDTOS.stream().collect(Collectors.summarizingInt(AttendanceRatioDTO::getQuantity)).getSum(); //出勤占比评分 Double attendanceRatio = ((float) sum1 / (float) sum) * 100 * cockpitConfig.getCommuteWeight(); @@ -1138,7 +1168,7 @@ securityScoreMap.put(date, BigDecimal.valueOf(100)); } } - if(CollectionUtils.isEmpty(repairMap)){ + if (CollectionUtils.isEmpty(repairMap)) { for (String date : dateList) { repairMap.put(date, BigDecimal.valueOf(100)); } @@ -1177,10 +1207,172 @@ return ResponseData.success(list); } + @Override + public Object securityScore() { + //按发生事件的设备所在的position划分计算评分,当天发生的事件 + String position = null; + List caseInfos = caseInfoMapper.selectByPosition(position); + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + + List securityScoreDTOs = new ArrayList<>(); + caseInfos.forEach(caseInfo -> { + SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); + securityScoreDTO1.setArea(caseInfo.getArea()); + 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); + }); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + 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); + } + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); + }); + //返回数据补全处理 + 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); + } + } + } + + //各楼栋设备维修次数(发生一次维修减5分) + //当天在设备维修期间的设备个数及所在楼栋 + List todayDTOList = repairLogMapper.selectTodayList(); + if(!CollectionUtils.isEmpty(todayDTOList)){ + for (RepairTodayDTO today : todayDTOList) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, today.getPosition()); + Double d = resultMap.get(dictValue) - today.getNumber()*5; + resultMap.put(dictValue, d); + } + } + + //各楼栋消防设备有效期(距有效期不到三个月减5分) + //当天在设备维修期间的设备个数及所在楼栋 + List repairTodayDTOList = fireEquipInfoMapper.selectNearExpireList(); + if(!CollectionUtils.isEmpty(repairTodayDTOList)){ + for (RepairTodayDTO today : repairTodayDTOList) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, today.getPosition()); + Double d = resultMap.get(dictValue) - today.getNumber()*5; + resultMap.put(dictValue, d); + } + } + + //各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + List list = visitInfoMapper.selectListForToDay(); + //未在申请时间段内离开减分(包括无离开时间和有离开时间两种情况)、未在申请区域内离开减分 + if(!CollectionUtils.isEmpty(list)){ + for (MultiScoreVisitorDTO visitorDTO : list) { + //无离开时间 + if (StringUtils.isEmpty(visitorDTO.getOutTime()) && StringUtils.isNotEmpty(visitorDTO.getVisitPosition())) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - cockpitConfig.getVisitorWeight().get("NoRecordPointDeduct"); + resultMap.put(dictValue, d); + } else if(StringUtils.isNotEmpty(visitorDTO.getVisitPosition()) && StringUtils.isNotEmpty(visitorDTO.getOutTime())){ + DateTime applyOutDateTime = DateUtil.parseDateTime(visitorDTO.getApplyOutTime()); + DateTime outDateTime = DateUtil.parseDateTime(visitorDTO.getOutTime()); + //未在申请时间段离开(在申请离开时间后离开) + if (DateUtil.compare(outDateTime, applyOutDateTime) > 0) { + long betweenHour = DateUtil.between(outDateTime, applyOutDateTime, DateUnit.HOUR); + Double score = betweenHour * cockpitConfig.getVisitorWeight().get("singlePointDeduct"); + //该访客扣分到达最多分 + if (score >= cockpitConfig.getVisitorWeight().get("mostPointDeduct")) { + score = cockpitConfig.getVisitorWeight().get("mostPointDeduct"); + } + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - score; + resultMap.put(dictValue, d); + } + //未在申请区域离开 + if (StringUtils.isNotEmpty(visitorDTO.getApplyVisitPosition()) && !visitorDTO.getApplyVisitPosition().equals(visitorDTO.getVisitPosition())) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - cockpitConfig.getVisitorWeight().get("singlePointDeduct"); + resultMap.put(dictValue, d); + } + } + } + } + return ResponseData.success(resultMap); + } + + @Override + public List personList(PersonListRequest personListRequest) { + //查询员工列表 + List staffList = staffInfoMapper.selectForPersonList(personListRequest); + staffList.stream().parallel().forEach(staff -> { + getFiledFromHik(staff); + }); + + //查询黑名单列表 + List blackList = blackInfoMapper.selectForPersonList(personListRequest); + blackList.stream().forEach(black -> { + black.setPersonType("黑名单"); + }); + + //查询访客列表 + List visitList = visitInfoMapper.selectForPersonList(personListRequest); + visitList.stream().forEach(visit -> { + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(visit.getPicUri()); + picRequest.setServerIndexCode(visit.getServerIndexCode()); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + visit.setPersonPicture(HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody)); + visit.setPersonType("访客"); + }); + + //列表结合,顺序:员工、黑名单、访客 + List resultList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(staffList)){ + staffList.addAll(blackList); + staffList.addAll(visitList); + resultList = staffList; + }else if(!CollectionUtils.isEmpty(blackList)){ + blackList.addAll(visitList); + resultList = blackList; + }else { + resultList = visitList; + } + return resultList; + } + private List> getForResult(List weekCaseDTOS, List weekCaseKeyAreaDTOS, - List caseInfos, HashMap weekCaseMap, HashMap caseScoreMap, - HashMap keyAreaScoreMap, HashMap assessScoreMap, - List dateList){ + List caseInfos, HashMap weekCaseMap, HashMap caseScoreMap, + HashMap keyAreaScoreMap, HashMap assessScoreMap, + List dateList) { Map keyAreaWeight = cockpitConfig.getKeyAreaWeight(); weekCaseKeyAreaDTOS.forEach(dto -> { weekCaseMap.put(dto.getDimension(), BigDecimal.valueOf(dto.getQuantity())); @@ -1270,4 +1462,53 @@ }); return resultList; } + + private void getFiledFromHik(PersonListResponse staffInfo) { + String staffCode = staffInfo.getStaffCode(); + 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; + } + log.info("请求海康,根据人员唯一字段获取人员详细信息response:{}", resultStr); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + if(0 == personPhoto.size()){ + return; + } + //海康组织名 + String orgPathName = jsonObject.getString("orgPathName"); + String replace = orgPathName.replace("🆗", ""); + staffInfo.setPersonType(replace); + 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")){ + staffInfo.setPersonPicture("https://192.168.10.2:443" + pictureFromHik); + }else{ + staffInfo.setPersonPicture(pictureFromHik); + } + } } 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 c39a5fa..c3d889c 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 @@ -62,6 +62,7 @@ List pageList = staffInfoMapper.getStaffInfoListPage(page, staffInfoRequest); pageList.stream().forEach(staffInfo -> { staffInfo.setStaffTypeName(dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, staffInfo.getStaffType())); + staffInfo.setStaffGenderName(dictService.getDictNameByCode(SecurityEventDict.SYS_SEX, staffInfo.getStaffGender())); // staffInfo.setPicture(getPictureFromHik(staffInfo.getStaffCode())); getFiledFromHik(staffInfo); }); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java index f3687cd..5ef33c7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; @@ -20,6 +21,8 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -40,7 +43,6 @@ @Override public List staffInoutLogListPage(Page page, StaffInoutLogRequest inoutLogRequest) { try { -// todo员工编号和员工列表一致,进出记录中空数据问题,进出方式问题 List pageList = inoutLogMapper.selectStaffInoutLogList(page, inoutLogRequest); pageList.stream().forEach(inoutLog -> { inoutLog.setPassWayName(dictService.getDictNameByCode(SecurityEventDict.PASS_WAY, inoutLog.getPassWay())); @@ -49,8 +51,8 @@ //doorArea为前端文档参数,先取position inoutLog.setDoorArea(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, inoutLog.getDoorArea())); inoutLog.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, inoutLog.getArea())); - //获取海康组织名,根据组织编号获取 - getFiledFromHik(inoutLog); + //获取海康组织名和照片,根据组织编号获取,不使用,影响查询效率 +// getFiledFromHik(inoutLog); }); return pageList; } catch (DataAccessException ex) { @@ -60,6 +62,19 @@ } + @Override + public void deleteMoreThanWeekLog() { + QueryWrapper wrapper = new QueryWrapper<>(); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate ago = LocalDate.now().minusDays(7); + String dateStr = ago.format(df); + wrapper.apply("{0} > DATE_FORMAT(create_time,'%Y-%m-%d')", dateStr); + int delete = inoutLogMapper.delete(wrapper); + if(delete < 0){ + log.error("删除一周前人员进出记录数据失败"); + } + } + private void getFiledFromHik(StaffInoutLog staffInoutLog) { String staffCode = staffInoutLog.getStaffCode(); PersonInfoRequest request = new PersonInfoRequest(); 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 937a9de..9764e9c 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 @@ -159,9 +159,17 @@ //获取30天前对应的当前年的第几周 int startWeek = cn.hutool.core.date.DateUtil.weekOfYear(startDate); int endWeek = cn.hutool.core.date.DateUtil.weekOfYear(now); + if (startWeek > endWeek) { + startWeek = 1; + } int year = cn.hutool.core.date.DateUtil.thisYear(); for (int i = startWeek; i < endWeek + 1; i++) { - list.add("" + year + "-" + i); + if (i < 10) { + list.add("" + year + "-0" + i); + } else { + list.add("" + year + "-" + i); + } + } return list; } @@ -208,7 +216,7 @@ } /** - * 30天前的7天日期 + * 30天前的7天日期 */ public static List getCurrentDateDayBeforeMonthList() { List list = new ArrayList<>(); diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index d3a3e77..896583c 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: /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,/caseInfo/update,/**/list/unResolved,/last/drawNo,/multiScore/** + 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,/caseInfo/update,/**/list/unResolved,/last/drawNo,/multiScore/**,/deviceInfo/cameraList #flowable数据源和多数据源配置 db: init: @@ -82,4 +82,20 @@ 2e22b7c9206c4184a756c7c091422a8d,bbb12547f1d1453c8be02d6e8c413338,d4612a78089a4dcab0df417591c346e8,d277ae7102774ba6bd568cff9bbdfc08, 57c2a7b7c19d48c9b04ac5f2e1c4b3ed,69dee9f5bb51435bb9045cc5d59fa194,e5c6c81beee24131b18e12862123a68b,950b1a1708534bbbbb40dcb36d21eb70, 9b8450815d47401482dd7d4b075e4229,d69c2a94fb0a49ca86b0d9faa920068a,588593de9e7f42f9819f08f7cfc6ae86,ed7de18f260441f3aef025696e3bdb09, - dd6dd56306c746fabdd637a3489cef00,6b660fcc97e34c7c82c1ef517a88bb52,b62e4f68120249babd6203c90b53cb7a,0513c3e1926f450fb403f441dd644fcd] \ No newline at end of file + dd6dd56306c746fabdd637a3489cef00,6b660fcc97e34c7c82c1ef517a88bb52,b62e4f68120249babd6203c90b53cb7a,0513c3e1926f450fb403f441dd644fcd] + +#闸机与监控点联动 +#指定监控点识别黑名单事件后关闭对应闸机 +devicelinkage: + configMap: + #一期主楼 + 1d07f327d63f4fabac94d6e0fc92496c: [534542c51e9c4499becf464ec80895f5,9efea996b23840b691ddb80e823f3d8d,7e6b4f58908040bd871279a0701b2b62, + 889916c8a9b749febb56c569fab4a2b2,1eacbe03363c4b2980a59999188fc116] + #录制楼 + ad83b94f17e24814abc84e2c576265ec: [2014a1d8fead4b76a5cb836ecf1c4db6,4b56821684224b8ea0467acae2fa4f6f,7840b20c767b47b68f1cfd5050be0333] + #二期主楼西门 + bc4fdb9593b448d5b6f001bded208188: [a02e957b3e8d446fb41c1adb729524fe,8f659690e27244bdba65dd2d0fa313ba,03bfd8c696fa46018f10b17faa7c5e41, + 2e22b7c9206c4184a756c7c091422a8d,57c2a7b7c19d48c9b04ac5f2e1c4b3ed,9b8450815d47401482dd7d4b075e4229, + dd6dd56306c746fabdd637a3489cef00] + #二期主楼东门 + 80560cd4292d468aa30809518f047e41: [d0a261d6a8bd4af09302970e392dd771,734530c21fb84bdbabc2ad50d6272ba4,bd86703f5ffe4f4d8ce437416d32fe8b] \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-prod.yml b/casic-web/src/main/resources/config/application-prod.yml index d1c6782..b7d99ea 100644 --- a/casic-web/src/main/resources/config/application-prod.yml +++ b/casic-web/src/main/resources/config/application-prod.yml @@ -22,7 +22,7 @@ casic: kaptcha-open: false #是否开启登录时验证码 (true/false) - 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,/caseInfo/update,/**/list/unResolved,/last/drawNo,/multiScore/**,/caseInfo/oneClickSolved + 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,/caseInfo/update,/**/list/unResolved,/last/drawNo,/multiScore/**,/caseInfo/oneClickSolved,/deviceInfo/cameraList #flowable数据源和多数据源配置 db: init: @@ -84,4 +84,19 @@ 2e22b7c9206c4184a756c7c091422a8d,bbb12547f1d1453c8be02d6e8c413338,d4612a78089a4dcab0df417591c346e8,d277ae7102774ba6bd568cff9bbdfc08, 57c2a7b7c19d48c9b04ac5f2e1c4b3ed,69dee9f5bb51435bb9045cc5d59fa194,e5c6c81beee24131b18e12862123a68b,950b1a1708534bbbbb40dcb36d21eb70, 9b8450815d47401482dd7d4b075e4229,d69c2a94fb0a49ca86b0d9faa920068a,588593de9e7f42f9819f08f7cfc6ae86,ed7de18f260441f3aef025696e3bdb09, - dd6dd56306c746fabdd637a3489cef00,6b660fcc97e34c7c82c1ef517a88bb52,b62e4f68120249babd6203c90b53cb7a,0513c3e1926f450fb403f441dd644fcd] \ No newline at end of file + dd6dd56306c746fabdd637a3489cef00,6b660fcc97e34c7c82c1ef517a88bb52,b62e4f68120249babd6203c90b53cb7a,0513c3e1926f450fb403f441dd644fcd] +#闸机与监控点联动 +#指定监控点识别黑名单事件后关闭对应闸机 +devicelinkage: + configMap: + #一期主楼 + 1d07f327d63f4fabac94d6e0fc92496c: [534542c51e9c4499becf464ec80895f5,9efea996b23840b691ddb80e823f3d8d,7e6b4f58908040bd871279a0701b2b62, + 889916c8a9b749febb56c569fab4a2b2,1eacbe03363c4b2980a59999188fc116] + #录制楼 + ad83b94f17e24814abc84e2c576265ec: [2014a1d8fead4b76a5cb836ecf1c4db6,4b56821684224b8ea0467acae2fa4f6f,7840b20c767b47b68f1cfd5050be0333] + #二期主楼西门 + bc4fdb9593b448d5b6f001bded208188: [a02e957b3e8d446fb41c1adb729524fe,8f659690e27244bdba65dd2d0fa313ba,03bfd8c696fa46018f10b17faa7c5e41, + 2e22b7c9206c4184a756c7c091422a8d,57c2a7b7c19d48c9b04ac5f2e1c4b3ed,9b8450815d47401482dd7d4b075e4229, + dd6dd56306c746fabdd637a3489cef00] + #二期主楼东门 + 80560cd4292d468aa30809518f047e41: [d0a261d6a8bd4af09302970e392dd771,734530c21fb84bdbabc2ad50d6272ba4,bd86703f5ffe4f4d8ce437416d32fe8b] \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java new file mode 100644 index 0000000..43b630b --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/config/DeviceLinkageConfig.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/10 9:29 + */ +@Data +@Component +@ConfigurationProperties("devicelinkage") +public class DeviceLinkageConfig { + private HashMap> configMap; +} 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 071424c..907624c 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 @@ -187,4 +187,21 @@ return cockpitService.heatMap(heatMapDTO); } + /** + * 今日事件数、今日事件处置数 + */ + @GetMapping("/event/number") + @ResponseBody + public Object eventNumber() { + return cockpitService.eventNumber(); + } + + /** + * 设备离线率 + */ + @GetMapping("/device/offlineRate") + @ResponseBody + public Object offlineRate() { + return cockpitService.offlineRate(); + } } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java index 5647f31..1dc2df9 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/MultiScoreController.java @@ -105,4 +105,16 @@ public Object other() { return propertyManageService.other(); } + + /** + * 安全防护梯度指标组件 + * 当天 + * 各楼栋评分-各楼栋设备维修次数(发生一次维修减5分)-各楼栋消防设备有效期(距有效期不到三个月减5分)-各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + */ + @GetMapping("/securityScore") + @ResponseBody + public Object securityScore() { + return propertyManageService.securityScore(); + } + } 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 f59ae03..376dfc7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/controller/cockpit/PropertyManageController.java @@ -1,9 +1,7 @@ package com.casic.missiles.modular.controller.cockpit; import com.casic.missiles.model.response.ResponseData; -import com.casic.missiles.modular.dto.DeviceAreaRequest; -import com.casic.missiles.modular.dto.DeviceRepairLogDTO; -import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.*; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; import com.casic.missiles.modular.dto.statistics.DeviceStatusDTO; @@ -184,4 +182,15 @@ return propertyManageService.highFrequency(); } + /** + * 黑名单、访客、人员结合列表 + * 用于人员轨迹追踪按钮 + */ + @PostMapping("/person/list") + @ResponseBody + public Object list(@RequestBody PersonListRequest personListRequest) { + List personListResponse = propertyManageService.personList(personListRequest); + return ResponseData.success(personListResponse); + } + } 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 3cf8b77..711b9d9 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 @@ -4,15 +4,22 @@ import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.dao.HikFaceGroupInfoMapper; +import com.casic.missiles.modular.dto.DoorInoutRequest; +import com.casic.missiles.modular.dto.DoorInoutResponse; +import com.casic.missiles.modular.dto.SearchPicturesResponse; 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.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.CaseInfo; +import com.casic.missiles.modular.model.DeviceInfo; import com.casic.missiles.modular.model.HikFaceGroupInfo; import com.casic.missiles.modular.service.CaseInfoService; +import com.casic.missiles.modular.service.DeviceInfoService; import com.casic.missiles.modular.service.HikFaceGroupInfoService; import com.casic.missiles.modular.service.HikService; import com.casic.missiles.modular.util.CaseInfoFactoryUtil; @@ -27,7 +34,9 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 海康事件Controller @@ -54,6 +63,12 @@ private HikFaceGroupInfoMapper hikFaceGroupInfoMapper; @Autowired + private DeviceInfoService deviceInfoService; + + @Resource + private AbstractDictService dictService; + + @Autowired private WebSocket webSocket; @Value("${server.port}") @@ -238,6 +253,12 @@ @PostMapping("/hik/search/picture") @ResponseBody public Object searchPictures(@RequestBody SearchPicturesRequest searchPicturesRequest) { + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "1".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("male"); + } + if(!StringUtils.isEmpty(searchPicturesRequest.getSex()) && "2".equals(searchPicturesRequest.getSex())){ + searchPicturesRequest.setSex("female"); + } DateTime startDateTime = DateUtil.parse(searchPicturesRequest.getStartTime()); DateTime endDateTime = DateUtil.parse(searchPicturesRequest.getEndTime()); String startTime = DateUtil.format(startDateTime, "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); @@ -251,7 +272,43 @@ log.error("请求海康,以图搜图失败,海康response:{}", resultStr); return ResponseData.error("以图搜图失败"); } - return ResponseData.success(resultJson); + //结构处理 + List responseList = new ArrayList(); + JSONObject data = resultJson.getJSONObject("data"); + JSONArray list = data.getJSONArray("list"); + list.stream().forEach(json -> { + JSONObject json1 = (JSONObject) json; + String cameraIndexCode = json1.getString("cameraIndexCode"); + if(StringUtils.isNotEmpty(cameraIndexCode)){ + DeviceInfo deviceInfo = deviceInfoService.selectByIndexCode(cameraIndexCode); + SearchPicturesResponse searchPicturesResponse = new SearchPicturesResponse(); + searchPicturesResponse.setDevName(deviceInfo.getDevName()); + searchPicturesResponse.setDrawNo(deviceInfo.getDrawNo()); + searchPicturesResponse.setPosition(deviceInfo.getPosition()); + searchPicturesResponse.setPositionName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, deviceInfo.getPosition())); + searchPicturesResponse.setArea(deviceInfo.getArea()); + searchPicturesResponse.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, deviceInfo.getArea())); + String facePicUrlAfter = StringUtils.substringAfter(json1.getString("facePicUrl"), "?imgSrc="); + String s = StringUtils.substringBefore(facePicUrlAfter, "&"); + byte[] facePicUrl = Base64.getDecoder().decode(s); + searchPicturesResponse.setFacePicUrl(new String(facePicUrl)); + String bkgPicUrlAfter = StringUtils.substringAfter(json1.getString("bkgPicUrl"), "?imgSrc="); + String s1 = StringUtils.substringBefore(bkgPicUrlAfter, "&"); + byte[] bkgPicUrl = Base64.getDecoder().decode(s1); + searchPicturesResponse.setBkgPicUrl(new String(bkgPicUrl)); + searchPicturesResponse.setSimilarity(json1.getString("similarity")); + DateTime parse = DateUtil.parse(json1.getString("captureTime")); + String time = DateUtil.formatDateTime(parse); + searchPicturesResponse.setTime(time); + searchPicturesResponse.setSex(json1.getString("sex")); + searchPicturesResponse.setRect(json1.getString("rect")); + responseList.add(searchPicturesResponse); + } + }); + //按时间正序排序 + List resultList = responseList.stream().sorted(Comparator.comparing(SearchPicturesResponse::getTime)).collect(Collectors.toList()); + + return ResponseData.success(resultList); } @@ -389,4 +446,98 @@ return resultStr; } + /** + * 门禁今日进出人数统计 + */ + @PostMapping("/hik/search/doorInout") + @ResponseBody + public Object doorInout(@RequestBody DoorInoutRequest doorInoutRequest) { + //通过分组id获取闸机编号列表 + List deviceCodes = deviceInfoService.selectDeviceCodesById(doorInoutRequest.getId()); + if(CollectionUtils.isEmpty(deviceCodes)){ + log.info("门禁今日进出人数统计:不存在分组的闸机编号,分组id:{}", doorInoutRequest.getId()); + return ResponseData.error("不存在分组下的闸机编号"); + } + //根据闸机编号列表获取门禁点唯一标识列表 + List indexCodes = deviceInfoService.selectIndexCodesByCodes(deviceCodes); + + List eventTypes = new ArrayList<>(); + eventTypes.add(SecurityEventType.CARD_COMPARE_PASS); + eventTypes.add(SecurityEventType.FACE_COMPARE_PASS); + String startTime = DateUtil.format(DateUtil.beginOfDay(new Date()), "yyyy-MM-dd'T'HH:mm:ssXXX"); + String endTime = DateUtil.format(DateUtil.date(), "yyyy-MM-dd'T'HH:mm:ssXXX"); + DoorEventsRequest doorEventsRequest = new DoorEventsRequest(); + doorEventsRequest.setPageNo(1); + doorEventsRequest.setPageSize(1000); + //海康该接口仅支持查10个门禁点,更改为查全量后筛选 +// doorEventsRequest.setDoorIndexCodes(doorIndexCodes); //门禁点列表 + doorEventsRequest.setEventTypes(eventTypes); //事件类型列表 + doorEventsRequest.setStartTime(startTime); //开始时间,当日0点 + doorEventsRequest.setEndTime(endTime); //结束时间,当前 + String body = JSONObject.toJSONString(doorEventsRequest); + String resultStr = HikUtil.hikApi(HikUri.DOOR_EVENTS, body); + JSONObject resultJson = (JSONObject) JSONObject.parse(resultStr); + if (Objects.isNull(resultJson) || !"0".equals(resultJson.get("code"))) { + log.error("请求海康,查询海康门禁点事件v2失败,海康response:{}", resultStr); + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson = (JSONObject) resultJson.get("data"); + if (Objects.isNull(dataJson)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray = (JSONArray) dataJson.get("list"); + if (Objects.isNull(dataArray)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + + //海康分页限制,需循环请求数据 + if ((Integer) dataJson.get("totalPage") > 1) { + for (int i = 2; i <= (Integer) dataJson.get("totalPage"); i++) { + doorEventsRequest.setPageNo(i); + String body1 = JSONObject.toJSONString(doorEventsRequest); + String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); + if (!"0".equals(resultJson1.get("code"))) { + return ResponseData.error("门禁今日进出人数统计失败"); + } + JSONObject dataJson1 = (JSONObject) resultJson1.get("data"); + if (Objects.isNull(dataJson1)) { + return ResponseData.error("门禁今日进出人数统计失败."); + } + JSONArray dataArray1 = (JSONArray) dataJson1.get("list"); + if (Objects.isNull(dataArray1)) { + return ResponseData.error("门禁今日进出人数统计失败!"); + } + dataArray.addAll(dataArray1); + } + } + JSONArray arrays = new JSONArray(); + dataArray.stream().forEach(o -> { + JSONObject jsonObject = (JSONObject) o; + if (indexCodes.contains(jsonObject.getString("doorIndexCode"))) { + arrays.add(jsonObject); + } + }); + if (Objects.isNull(arrays)) { + log.error("请求海康,查询海康门禁点事件v2,结果list为null,分组id:{}", doorInoutRequest.getId()); + } + Integer inDoor = 0; + Integer outDoor = 0; + Iterator iterator = arrays.stream().iterator(); + while (iterator.hasNext()) { + JSONObject next = (JSONObject) iterator.next(); + Integer inAndOutType = next.getInteger("inAndOutType"); + //进门 + if (1 == inAndOutType) { + ++inDoor; + } else { + ++outDoor; + } + } + DoorInoutResponse response = new DoorInoutResponse(); + response.setIn(inDoor); + response.setOut(outDoor); + return response; + } + } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java index 6137a7d..14faa8c 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/BlackInfoMapper.java @@ -3,6 +3,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.BlackInfoRequest; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.model.BlackInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -18,4 +20,6 @@ public interface BlackInfoMapper extends BaseMapper { List getBlackInfoListPage(@Param("page") Page page, @Param("blackInfoRequest") BlackInfoRequest blackInfoRequest); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } 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 09e2a84..61472a5 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 @@ -93,4 +93,6 @@ List selectListByBeforeMonthKeyArea(); List getCountForRank(); + + List selectListByToday4(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java index bd9dc12..f56cf0b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/DeviceRepairLogMapper.java @@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.DeviceRepairRequest; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.DeviceRepairLog; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -22,4 +23,6 @@ List getDeviceRepairList(@Param("deviceRepairRequest") DeviceRepairRequest deviceRepairRequest); List selectListBySevenDay(); + + List selectTodayList(); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java index 4823ac1..7294d78 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/FireEquipInfoMapper.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.casic.missiles.modular.dto.FireEquipRequest; import com.casic.missiles.modular.dto.statistics.EquipTypeGroupDTO; +import com.casic.missiles.modular.dto.statistics.RepairTodayDTO; import com.casic.missiles.modular.model.FireEquipInfo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @@ -23,4 +24,6 @@ FireEquipInfo getFireEquipInfo(@Param("equipCode") String equipCode); List selectByEquipType(); + + List selectNearExpireList(); } 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 f4a47fa..7274405 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 @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.StaffInfoRequest; import com.casic.missiles.modular.dto.hik.PersonListDTO; import com.casic.missiles.modular.dto.hik.PersonSyncListDTO; @@ -37,4 +39,6 @@ List selectListLimitTen(); int saveOrUpdateStaffInfoBatch(@Param("personList") List personList); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java index 2476000..6864921 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/VisitInfoMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.VisitorRequest; import com.casic.missiles.modular.dto.statistics.MultiScoreVisitorDTO; import com.casic.missiles.modular.model.VisitInfo; @@ -22,4 +24,8 @@ VisitInfo selectByOrderId(@Param("orderId") String orderId); List selectListBySevenDay(); + + List selectListForToDay(); + + List selectForPersonList(@Param("personListRequest") PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml index 2b3dfd5..142ae38 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/BlackInfoMapper.xml @@ -15,4 +15,14 @@ order by create_time DESC + + \ 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 6625f86..6285e98 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 @@ -382,4 +382,11 @@ ORDER BY quantity DESC LIMIT 10 + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml index 214be25..49635d3 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/DeviceRepairLogMapper.xml @@ -40,4 +40,13 @@ WHERE DATE_SUB(CURDATE(), INTERVAL 7 DAY) <= date(repair_end_time) AND device_code is not null + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml index 0e7b93d..90f41c5 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/FireEquipInfoMapper.xml @@ -42,4 +42,11 @@ WHERE equip_type is not null GROUP BY equip_type + + \ 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 ad6a8a9..162dfea 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 @@ -103,4 +103,17 @@ staff_id_card = values(staff_id_card), card_num = values(card_num) + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml index d8d0725..92c8753 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/StaffInoutLogMapper.xml @@ -5,12 +5,13 @@ bsil.id, asset_id, file_name, minio_file_name, remark, create_user, is_del, create_time, update_time - SELECT bsil.channel_num, bsil.way_name, bsil.inout_type, bsil.pass_way, bsil.description, bsil.pass_time, bsil.create_time, bsil.update_time, bsi.card_num as cardNum, bsi.staff_code as staffCode, bsi.job_no as jobNo, bsi.staff_name AS staffName, bsi.org_index_code AS orgIndexCode, bdi.dev_name AS doorName, bdi.dev_code AS doorCode, bdi.position AS position, bdi.position AS doorArea, bdi.area AS area, bdi.detail_location AS detailLocation FROM bus_staff_inout_log bsil - LEFT JOIN bus_staff_info bsi ON (bsil.staff_code = bsi.staff_code OR bsil.card_num = bsi.card_num) + LEFT JOIN bus_staff_info bsi ON bsil.card_num = bsi.card_num LEFT JOIN bus_device_info bdi ON bsil.src_index = bdi.index_code WHERE 1=1 @@ -34,6 +35,6 @@ and bsil.pass_time <= #{inoutLogRequest.endTime} - ORDER by bsil.pass_time DESC, bsil.create_time DESC + ORDER by bsil.create_time DESC \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml index 9e8d5f7..a1b2db8 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml +++ b/casic-server/src/main/java/com/casic/missiles/modular/dao/mapping/VisitInfoMapper.xml @@ -39,4 +39,27 @@ AND CURDATE() > date(bva.out_time) AND bvi.in_time is not null + + + + \ No newline at end of file diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java new file mode 100644 index 0000000..e231086 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutRequest { + //门禁分组名称 + private Long id; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java new file mode 100644 index 0000000..c4eb2cc --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/DoorInoutResponse.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/2/20 14:37 + */ +@Data +public class DoorInoutResponse { + private Integer in; + private Integer out; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java new file mode 100644 index 0000000..cb23fee --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListRequest.java @@ -0,0 +1,13 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询条件 + * @Author: wangpeng + * @Date: 2023/1/30 17:26 + */ +@Data +public class PersonListRequest { + private String keywords; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java new file mode 100644 index 0000000..445467d --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/PersonListResponse.java @@ -0,0 +1,30 @@ +package com.casic.missiles.modular.dto; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.Data; + +/** + * @Description: 黑名单、访客、人员结合列表查询响应 + * @Author: wangpeng + * @Date: 2023/1/30 9:11 + */ +@Data +public class PersonListResponse { + //人员类型,黑名单/访客/员工所属组织 + private String personType; + //姓名 + private String personName; + //员工类型:工号,黑名单类型:黑名单编号,访客类型:无 + private String personNo; + //人员图片 + private String personPicture; + //性别 + private String gender; + + @JsonIgnore + private String staffCode; + @JsonIgnore + private String picUri; + @JsonIgnore + private String serverIndexCode; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java new file mode 100644 index 0000000..afd8673 --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/SearchPicturesResponse.java @@ -0,0 +1,24 @@ +package com.casic.missiles.modular.dto; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/9 16:59 + */ +@Data +public class SearchPicturesResponse { + private String devName; + private String drawNo; + private String position; + private String positionName; + private String area; + private String areaName; + private String facePicUrl; + private String bkgPicUrl; + private String similarity; + private String time; + private String sex; + private String rect; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java new file mode 100644 index 0000000..ce703af --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/dto/statistics/RepairTodayDTO.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.dto.statistics; + +import lombok.Data; + +/** + * @Description: + * @Author: wangpeng + * @Date: 2023/1/29 16:24 + */ +@Data +public class RepairTodayDTO { + private Integer number; + private String position; +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java index bb00c7c..8de64ef 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/job/CockpitJob.java @@ -14,6 +14,7 @@ import com.casic.missiles.modular.model.StatisticNumber; import com.casic.missiles.modular.service.CockpitService; import com.casic.missiles.modular.service.StaffInfoService; +import com.casic.missiles.modular.service.StaffInoutLogService; import com.casic.missiles.modular.util.HikUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -46,6 +47,8 @@ private AbstractDictService dictService; @Autowired private StaffInfoService staffInfoService; + @Autowired + private StaffInoutLogService inoutLogService; /** * 统计一期二期楼栋,每小时存储各楼栋人数 @@ -130,6 +133,15 @@ } + /** + * 每天0点删除一周外的人员进出记录 + */ + @Scheduled(cron = "0 0 0 * * ?") + @Transactional + public void deleteStaffInOutLog() { + inoutLogService.deleteMoreThanWeekLog(); + } + private List getSyncPersonList(PersonListRequest request, JSONObject resultJson, List personList) { if (!"0".equals(resultJson.get("code"))) { log.error("请求海康,获取人员列表v2失败,海康response:{}", resultJson.toJSONString()); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java index 7a7fe8a..fbfda1f 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/CockpitService.java @@ -45,4 +45,8 @@ Object areaScore(SecurityScoreDTO securityScoreDTO); Object heatMap(HeatMapDTO heatMapDTO); + + Object eventNumber(); + + Object offlineRate(); } 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 7e29e1f..09efe70 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 @@ -66,4 +66,6 @@ DeviceInfo deviceInfoByDrawNo(String drawNo); List getDeviceStatusGroupByArea(DeviceAreaRequest deviceAreaRequest); + + DeviceInfo selectByIndexCode(String cameraIndexCode); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java index 5b8189f..09fce1a 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/PropertyManageService.java @@ -1,8 +1,12 @@ package com.casic.missiles.modular.service; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; import com.casic.missiles.modular.dto.statistics.AttendanceRatioDTO; import com.casic.missiles.modular.dto.statistics.AvgMonthAndWeekGroupDTO; +import java.util.List; + /** * @Description: * @Author: wangpeng @@ -42,4 +46,8 @@ Object other(); Object highFrequency(); + + Object securityScore(); + + List personList(PersonListRequest personListRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java index 5a92eba..ed5b3a4 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/StaffInoutLogService.java @@ -15,4 +15,6 @@ public interface StaffInoutLogService extends IService { List staffInoutLogListPage(Page page, StaffInoutLogRequest inoutLogRequest); + + void deleteMoreThanWeekLog(); } 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 1c34f68..972d3ab 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 @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; import com.casic.missiles.model.response.ResponseData; +import com.casic.missiles.modular.config.DeviceLinkageConfig; import com.casic.missiles.modular.dao.CaseInfoMapper; import com.casic.missiles.modular.dao.CategoryLevelMapper; import com.casic.missiles.modular.dao.DeviceInfoMapper; @@ -59,6 +60,9 @@ @Resource private DeviceInfoMapper deviceInfoMapper; + @Autowired + private DeviceLinkageConfig deviceLinkageConfig; + @Override public List caseInfoListPage(Page page, CaseInfoRequest caseInfoRequest) { try { @@ -78,6 +82,29 @@ @Override public int updateStatus(CaseInfoRequest caseInfoRequest) { +// //若事件为黑名单事件且事件为未解决,将闸机设置为门闭(即非常闭,可正常开关门) +// CaseInfo caseInfo = caseInfoMapper.selectById(caseInfoRequest.getId()); +// if(!Objects.isNull(caseInfo) && 1644175361 == caseInfo.getHikEventType() +// && caseInfo.getDescription().contains("黑名单") && "3" != caseInfo.getStatus() +// && "3" == caseInfoRequest.getStatus()){ +// HashMap> configMap = deviceLinkageConfig.getConfigMap(); +// List list = configMap.get(caseInfo.getIndexCode()); +// //海康门禁点反控 +// DoorControlRequest doorControlRequest = new DoorControlRequest(); +// //需根据设备编号获取到对应的门禁点唯一标识 +// doorControlRequest.setDoorIndexCodes(list); +// //门闭 +// doorControlRequest.setControlType(1); +// String body = JSONObject.toJSONString(doorControlRequest); +// String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); +// JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); +// if (!"0".equals(resultJson.get("code"))) { +// log.error("解决黑名单事件,请求海康,门禁点反控失败,海康response:{}", resultStr); +// }else{ +// log.info("解决黑名单事件,请求海康,门禁点反控成功"); +// } +// } + return caseInfoMapper.updateStatusById(caseInfoRequest); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java index f452b5f..6f4956b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/CockpitServiceImpl.java @@ -105,7 +105,7 @@ doorEventsRequest.setPageNo(i); String body1 = JSONObject.toJSONString(doorEventsRequest); String resultStr1 = HikUtil.hikApi(HikUri.DOOR_EVENTS, body1); - JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr); + JSONObject resultJson1 = (JSONObject) JSONObject.parse(resultStr1); if (!"0".equals(resultJson1.get("code"))) { log.error("请求海康,循环查询海康门禁点事件v2失败,海康response:{}", resultStr1); return; @@ -147,7 +147,7 @@ //进门 if (1 == inAndOutType) { ++num; - } else if (0 == inAndOutType) { + } else { --num; } } @@ -655,6 +655,33 @@ return ResponseData.success(resultMap); } + @Override + public Object eventNumber() { + List caseInfos = caseInfoMapper.selectListByToday4(); + List resolvedCaseInfos = caseInfos.stream().filter(caseInfo -> "3".equals(caseInfo.getStatus())).collect(Collectors.toList()); + HashMap resultMap = new HashMap<>(); + resultMap.put("今日事件数", caseInfos.size()); + resultMap.put("今日事件处置数", resolvedCaseInfos.size()); + return ResponseData.success(resultMap); + } + + @Override + public Object offlineRate() { + QueryWrapper wrapper = new QueryWrapper<>(); + Integer total = deviceInfoMapper.selectCount(wrapper); + QueryWrapper wrapper1 = new QueryWrapper<>(); + wrapper1.eq("status", 2); //字典值:在线1、离线2、故障3 + Integer offline = deviceInfoMapper.selectCount(wrapper1); + NumberFormat numberFormat = NumberFormat.getInstance(); + // 设置精确到小数点后2位 + numberFormat.setMaximumFractionDigits(2); + String result = numberFormat.format((float) offline / (float) total * 100); + HashMap resultMap = new HashMap<>(); +// resultMap.put("设备总数", total); + resultMap.put("设备离线率", result + "%"); + return ResponseData.success(resultMap); + } + private List> getResultMap(List nameList, List> resultList, Map> resultMap) { resultMap.keySet().forEach(key -> { List monthAndLevelGroupDTOS = resultMap.get(key); 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 2dd34b6..76d8ff6 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 @@ -469,4 +469,12 @@ return deviceStatusDTOS; } + @Override + public DeviceInfo selectByIndexCode(String cameraIndexCode) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("index_code", cameraIndexCode); + DeviceInfo deviceInfo = deviceInfoMapper.selectOne(wrapper); + return deviceInfo; + } + } 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 0f02ccb..c676f2a 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,6 +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.config.DeviceLinkageConfig; import com.casic.missiles.modular.dao.*; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; @@ -31,27 +32,22 @@ @Slf4j @Service public class HikServiceImpl implements HikService { - @Resource private AbstractDictService dictService; - @Autowired private StaffInfoMapper staffInfoMapper; - @Autowired private AttendanceInfoMapper attendanceInfoMapper; - @Autowired private VisitInfoMapper visitInfoMapper; - @Autowired private DeviceInfoMapper deviceInfoMapper; - @Autowired private CaseInfoMapper caseInfoMapper; - @Autowired private StaffInoutLogMapper inoutLogMapper; + @Autowired + private DeviceLinkageConfig deviceLinkageConfig; @Override public CaseInfo blackListHandle(JSONObject event, CaseInfo caseInfo) { @@ -71,6 +67,26 @@ log.info("接收到黑名单事件,但数据库中无该事件发生的设备信息, srcIndex:{}", srcIndex); return caseInfo; } +// //发生黑名单事件,若匹配联动配置,常闭指定闸机 +// HashMap> configMap = deviceLinkageConfig.getConfigMap(); +// if(!CollectionUtils.isEmpty(configMap.get(srcIndex))){ +// List list = configMap.get(srcIndex); +// //海康门禁点反控 +// DoorControlRequest doorControlRequest = new DoorControlRequest(); +// //需根据设备编号获取到对应的门禁点唯一标识 +// doorControlRequest.setDoorIndexCodes(list); +// //常闭 +// doorControlRequest.setControlType(3); +// String body = JSONObject.toJSONString(doorControlRequest); +// String resultStr = HikUtil.hikApi(HikUri.DOOR_CONTROL, body); +// JSONObject resultJson = (JSONObject)JSONObject.parse(resultStr); +// if (!"0".equals(resultJson.get("code"))) { +// log.error("发生黑名单事件,请求海康,门禁点反控失败,海康response:{}", resultStr); +// }else{ +// log.info("发生黑名单事件,请求海康,门禁点反控成功"); +// } +// } + caseInfo.setIndexCode(srcIndex); caseInfo.setDeviceCode(deviceInfo.getDevCode()); //设备code caseInfo.setDevName(deviceInfo.getDevName()); //设备名 diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java index b2e826f..cf61c40 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/PropertyManageServiceImpl.java @@ -12,13 +12,18 @@ import com.casic.missiles.model.response.ResponseData; import com.casic.missiles.modular.config.CockpitConfig; import com.casic.missiles.modular.dao.*; +import com.casic.missiles.modular.dto.PersonListRequest; +import com.casic.missiles.modular.dto.PersonListResponse; +import com.casic.missiles.modular.dto.hik.PersonInfoRequest; import com.casic.missiles.modular.dto.statistics.*; +import com.casic.missiles.modular.enums.HikUri; import com.casic.missiles.modular.enums.SecurityEventDict; import com.casic.missiles.modular.enums.SecurityEventType; import com.casic.missiles.modular.model.*; import com.casic.missiles.modular.service.PropertyManageService; import com.casic.missiles.modular.system.model.Dict; import com.casic.missiles.modular.util.DateUtils; +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; @@ -43,6 +48,8 @@ @Autowired private StaffInfoMapper staffInfoMapper; @Autowired + private BlackInfoMapper blackInfoMapper; + @Autowired private CaseInfoMapper caseInfoMapper; @Autowired private HazardLevelMapper hazardLevelMapper; @@ -53,6 +60,8 @@ @Autowired private DeviceRepairLogMapper repairLogMapper; @Autowired + private FireEquipInfoMapper fireEquipInfoMapper; + @Autowired private CockpitConfig cockpitConfig; @Autowired private AbstractDictService dictService; @@ -167,20 +176,38 @@ for (String date : dateList) { Integer flag = 0; for (PreMonthOrWeekCaseDTO dto : resultList) { - if(dto.getDimension().equals(date)){ + if (dto.getDimension().equals(date)) { finalList.add(dto); flag = 1; } } - if(flag == 0){ + if (flag == 0) { PreMonthOrWeekCaseDTO preMonthOrWeekCaseDTO = new PreMonthOrWeekCaseDTO(); preMonthOrWeekCaseDTO.setDimension(date); preMonthOrWeekCaseDTO.setQuantity(0); finalList.add(preMonthOrWeekCaseDTO); } } + if ("month".equals(dimension)) { + finalList.stream().forEach(f -> { + String dimension1 = f.getDimension(); + StringBuilder stringBuilder = new StringBuilder(dimension1); + stringBuilder.insert(5, "第"); + stringBuilder.append("周"); + f.setDimension(String.valueOf(stringBuilder)); + }); + } return ResponseData.success(finalList); } + if ("month".equals(dimension)) { + resultList.stream().forEach(f -> { + String dimension1 = f.getDimension(); + StringBuilder stringBuilder = new StringBuilder(dimension1); + stringBuilder.insert(5, "第"); + stringBuilder.append("周"); + f.setDimension(String.valueOf(stringBuilder)); + }); + } return ResponseData.success(resultList); } @@ -200,7 +227,7 @@ String hazardName = hazardLevelMapper.selectHazardNameByCode(key); monthAndWeekDTO.setLevelName(hazardName); if (year.equals(String.valueOf(DateUtil.thisYear()))) { - monthAndWeekDTO.setMonthQuantity(sum / (DateUtil.thisMonth()+1)); + monthAndWeekDTO.setMonthQuantity(sum / (DateUtil.thisMonth() + 1)); strAvgMap.put(key, monthAndWeekDTO); } else { monthAndWeekDTO.setMonthQuantity(sum / 12); @@ -247,7 +274,7 @@ resultList.add(strAvgMap.get(key)); }); //输出顺序 - if(!CollectionUtils.isEmpty(resultList) && resultList.size() > 1){ + if (!CollectionUtils.isEmpty(resultList) && resultList.size() > 1) { Collections.swap(resultList, 1, 2); } return ResponseData.success(resultList); @@ -734,15 +761,18 @@ return assessResultJson; } JSONArray assessData = JSONArray.parseArray(JSON.toJSONString(assessResultJson.getData())); - //所有类型的员工出勤 - List staffTypeAndSumDTOS = staffInfoMapper.selectCountByType(); + //物业和安保类型的员工出勤 + List collect = staffInfoMapper.selectCountByType(); + List staffTypeAndSumDTOS = collect.stream().filter(staffTypeAndSumDTO -> + !"3".equals(staffTypeAndSumDTO.getStaffType()) + ).collect(Collectors.toList()); long sum = staffTypeAndSumDTOS.stream().collect(Collectors.summarizingInt(StaffTypeAndSumDTO::getSum)).getSum(); List countByTypeAndDateForWeek = attendanceInfoMapper.getCountByTypeAndDateForWeek(); Map> dateMap = countByTypeAndDateForWeek.stream().collect(Collectors.groupingBy(AttendanceRatioDTO::getDate)); HashMap attendanceMap = new HashMap<>(); dateMap.keySet().forEach(key -> { List attendanceRatioDTOS = dateMap.get(key); - //当天所有类型的员工的出勤人数 + //当天物业和安保类型的员工的出勤人数 long sum1 = attendanceRatioDTOS.stream().collect(Collectors.summarizingInt(AttendanceRatioDTO::getQuantity)).getSum(); //出勤占比评分 Double attendanceRatio = ((float) sum1 / (float) sum) * 100 * cockpitConfig.getCommuteWeight(); @@ -1138,7 +1168,7 @@ securityScoreMap.put(date, BigDecimal.valueOf(100)); } } - if(CollectionUtils.isEmpty(repairMap)){ + if (CollectionUtils.isEmpty(repairMap)) { for (String date : dateList) { repairMap.put(date, BigDecimal.valueOf(100)); } @@ -1177,10 +1207,172 @@ return ResponseData.success(list); } + @Override + public Object securityScore() { + //按发生事件的设备所在的position划分计算评分,当天发生的事件 + String position = null; + List caseInfos = caseInfoMapper.selectByPosition(position); + //查询各危险级别权重、各类别权重,放入map,避免循环中多次查数据库 + HashMap hazardScoreMap = new HashMap<>(); + List caseHazardLevelList = hazardLevelMapper.getCaseHazardLevelList(null); + caseHazardLevelList.forEach(hazardLevel -> { + hazardScoreMap.put(hazardLevel.getCode(), hazardLevel.getWeight()); + }); + HashMap categoryScoreMap = new HashMap<>(); + List categoryLevelList = categoryLevelMapper.getCaseCategoryLevelList(null); + categoryLevelList.forEach(categoryLevel -> { + categoryScoreMap.put(categoryLevel.getCode(), categoryLevel.getWeight()); + }); + + List securityScoreDTOs = new ArrayList<>(); + caseInfos.forEach(caseInfo -> { + SecurityScoreDTO securityScoreDTO1 = new SecurityScoreDTO(); + securityScoreDTO1.setPosition(caseInfo.getPosition()); + securityScoreDTO1.setArea(caseInfo.getArea()); + 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); + }); + //楼栋-评分实体map + //过滤空position + List collect2 = securityScoreDTOs.stream().filter(securityScoreDTO1 -> + StringUtils.isNotEmpty(securityScoreDTO1.getPosition()) + ).collect(Collectors.toList()); + 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); + } + } + + Map> collect = collect2.stream().collect(Collectors.groupingBy(SecurityScoreDTO::getPosition)); + + collect.keySet().forEach(key -> { + List list = collect.get(key); + DoubleSummaryStatistics collect1 = list.stream().collect(Collectors.summarizingDouble(SecurityScoreDTO::getScore)); + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, key); + resultMap.put(dictValue, 100 - collect1.getSum()); + }); + //返回数据补全处理 + 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); + } + } + } + + //各楼栋设备维修次数(发生一次维修减5分) + //当天在设备维修期间的设备个数及所在楼栋 + List todayDTOList = repairLogMapper.selectTodayList(); + if(!CollectionUtils.isEmpty(todayDTOList)){ + for (RepairTodayDTO today : todayDTOList) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, today.getPosition()); + Double d = resultMap.get(dictValue) - today.getNumber()*5; + resultMap.put(dictValue, d); + } + } + + //各楼栋消防设备有效期(距有效期不到三个月减5分) + //当天在设备维修期间的设备个数及所在楼栋 + List repairTodayDTOList = fireEquipInfoMapper.selectNearExpireList(); + if(!CollectionUtils.isEmpty(repairTodayDTOList)){ + for (RepairTodayDTO today : repairTodayDTOList) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, today.getPosition()); + Double d = resultMap.get(dictValue) - today.getNumber()*5; + resultMap.put(dictValue, d); + } + } + + //各楼栋访客控制安全系数组件(当日所有访客出现一次逾期未离开记录,减分) + List list = visitInfoMapper.selectListForToDay(); + //未在申请时间段内离开减分(包括无离开时间和有离开时间两种情况)、未在申请区域内离开减分 + if(!CollectionUtils.isEmpty(list)){ + for (MultiScoreVisitorDTO visitorDTO : list) { + //无离开时间 + if (StringUtils.isEmpty(visitorDTO.getOutTime()) && StringUtils.isNotEmpty(visitorDTO.getVisitPosition())) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - cockpitConfig.getVisitorWeight().get("NoRecordPointDeduct"); + resultMap.put(dictValue, d); + } else if(StringUtils.isNotEmpty(visitorDTO.getVisitPosition()) && StringUtils.isNotEmpty(visitorDTO.getOutTime())){ + DateTime applyOutDateTime = DateUtil.parseDateTime(visitorDTO.getApplyOutTime()); + DateTime outDateTime = DateUtil.parseDateTime(visitorDTO.getOutTime()); + //未在申请时间段离开(在申请离开时间后离开) + if (DateUtil.compare(outDateTime, applyOutDateTime) > 0) { + long betweenHour = DateUtil.between(outDateTime, applyOutDateTime, DateUnit.HOUR); + Double score = betweenHour * cockpitConfig.getVisitorWeight().get("singlePointDeduct"); + //该访客扣分到达最多分 + if (score >= cockpitConfig.getVisitorWeight().get("mostPointDeduct")) { + score = cockpitConfig.getVisitorWeight().get("mostPointDeduct"); + } + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - score; + resultMap.put(dictValue, d); + } + //未在申请区域离开 + if (StringUtils.isNotEmpty(visitorDTO.getApplyVisitPosition()) && !visitorDTO.getApplyVisitPosition().equals(visitorDTO.getVisitPosition())) { + String dictValue = dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, visitorDTO.getVisitPosition()); + Double d = resultMap.get(dictValue) - cockpitConfig.getVisitorWeight().get("singlePointDeduct"); + resultMap.put(dictValue, d); + } + } + } + } + return ResponseData.success(resultMap); + } + + @Override + public List personList(PersonListRequest personListRequest) { + //查询员工列表 + List staffList = staffInfoMapper.selectForPersonList(personListRequest); + staffList.stream().parallel().forEach(staff -> { + getFiledFromHik(staff); + }); + + //查询黑名单列表 + List blackList = blackInfoMapper.selectForPersonList(personListRequest); + blackList.stream().forEach(black -> { + black.setPersonType("黑名单"); + }); + + //查询访客列表 + List visitList = visitInfoMapper.selectForPersonList(personListRequest); + visitList.stream().forEach(visit -> { + PersonInfoRequest picRequest = new PersonInfoRequest(); + picRequest.setPicUri(visit.getPicUri()); + picRequest.setServerIndexCode(visit.getServerIndexCode()); + String reBody = JSONObject.toJSONString(picRequest); + //重定向地址获取 + visit.setPersonPicture(HikUtil.hikApiFor302(HikUri.PERSON_PICTURE, reBody)); + visit.setPersonType("访客"); + }); + + //列表结合,顺序:员工、黑名单、访客 + List resultList = new ArrayList<>(); + if(!CollectionUtils.isEmpty(staffList)){ + staffList.addAll(blackList); + staffList.addAll(visitList); + resultList = staffList; + }else if(!CollectionUtils.isEmpty(blackList)){ + blackList.addAll(visitList); + resultList = blackList; + }else { + resultList = visitList; + } + return resultList; + } + private List> getForResult(List weekCaseDTOS, List weekCaseKeyAreaDTOS, - List caseInfos, HashMap weekCaseMap, HashMap caseScoreMap, - HashMap keyAreaScoreMap, HashMap assessScoreMap, - List dateList){ + List caseInfos, HashMap weekCaseMap, HashMap caseScoreMap, + HashMap keyAreaScoreMap, HashMap assessScoreMap, + List dateList) { Map keyAreaWeight = cockpitConfig.getKeyAreaWeight(); weekCaseKeyAreaDTOS.forEach(dto -> { weekCaseMap.put(dto.getDimension(), BigDecimal.valueOf(dto.getQuantity())); @@ -1270,4 +1462,53 @@ }); return resultList; } + + private void getFiledFromHik(PersonListResponse staffInfo) { + String staffCode = staffInfo.getStaffCode(); + 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; + } + log.info("请求海康,根据人员唯一字段获取人员详细信息response:{}", resultStr); + JSONObject jsonObject = (JSONObject) dataArray.get(0); + JSONArray personPhoto = (JSONArray) jsonObject.get("personPhoto"); + if(0 == personPhoto.size()){ + return; + } + //海康组织名 + String orgPathName = jsonObject.getString("orgPathName"); + String replace = orgPathName.replace("🆗", ""); + staffInfo.setPersonType(replace); + 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")){ + staffInfo.setPersonPicture("https://192.168.10.2:443" + pictureFromHik); + }else{ + staffInfo.setPersonPicture(pictureFromHik); + } + } } 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 c39a5fa..c3d889c 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 @@ -62,6 +62,7 @@ List pageList = staffInfoMapper.getStaffInfoListPage(page, staffInfoRequest); pageList.stream().forEach(staffInfo -> { staffInfo.setStaffTypeName(dictService.getDictNameByCode(SecurityEventDict.STAFF_TYPE, staffInfo.getStaffType())); + staffInfo.setStaffGenderName(dictService.getDictNameByCode(SecurityEventDict.SYS_SEX, staffInfo.getStaffGender())); // staffInfo.setPicture(getPictureFromHik(staffInfo.getStaffCode())); getFiledFromHik(staffInfo); }); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java index f3687cd..5ef33c7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/service/impl/StaffInoutLogServiceImpl.java @@ -2,6 +2,7 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.casic.missiles.core.application.service.AbstractDictService; @@ -20,6 +21,8 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -40,7 +43,6 @@ @Override public List staffInoutLogListPage(Page page, StaffInoutLogRequest inoutLogRequest) { try { -// todo员工编号和员工列表一致,进出记录中空数据问题,进出方式问题 List pageList = inoutLogMapper.selectStaffInoutLogList(page, inoutLogRequest); pageList.stream().forEach(inoutLog -> { inoutLog.setPassWayName(dictService.getDictNameByCode(SecurityEventDict.PASS_WAY, inoutLog.getPassWay())); @@ -49,8 +51,8 @@ //doorArea为前端文档参数,先取position inoutLog.setDoorArea(dictService.getDictNameByCode(SecurityEventDict.DEVICE_POSITION, inoutLog.getDoorArea())); inoutLog.setAreaName(dictService.getDictNameByCode(SecurityEventDict.DEVICE_AREA, inoutLog.getArea())); - //获取海康组织名,根据组织编号获取 - getFiledFromHik(inoutLog); + //获取海康组织名和照片,根据组织编号获取,不使用,影响查询效率 +// getFiledFromHik(inoutLog); }); return pageList; } catch (DataAccessException ex) { @@ -60,6 +62,19 @@ } + @Override + public void deleteMoreThanWeekLog() { + QueryWrapper wrapper = new QueryWrapper<>(); + DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate ago = LocalDate.now().minusDays(7); + String dateStr = ago.format(df); + wrapper.apply("{0} > DATE_FORMAT(create_time,'%Y-%m-%d')", dateStr); + int delete = inoutLogMapper.delete(wrapper); + if(delete < 0){ + log.error("删除一周前人员进出记录数据失败"); + } + } + private void getFiledFromHik(StaffInoutLog staffInoutLog) { String staffCode = staffInoutLog.getStaffCode(); PersonInfoRequest request = new PersonInfoRequest(); 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 937a9de..9764e9c 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 @@ -159,9 +159,17 @@ //获取30天前对应的当前年的第几周 int startWeek = cn.hutool.core.date.DateUtil.weekOfYear(startDate); int endWeek = cn.hutool.core.date.DateUtil.weekOfYear(now); + if (startWeek > endWeek) { + startWeek = 1; + } int year = cn.hutool.core.date.DateUtil.thisYear(); for (int i = startWeek; i < endWeek + 1; i++) { - list.add("" + year + "-" + i); + if (i < 10) { + list.add("" + year + "-0" + i); + } else { + list.add("" + year + "-" + i); + } + } return list; } @@ -208,7 +216,7 @@ } /** - * 30天前的7天日期 + * 30天前的7天日期 */ public static List getCurrentDateDayBeforeMonthList() { List list = new ArrayList<>(); diff --git a/casic-web/src/main/resources/config/application-dev.yml b/casic-web/src/main/resources/config/application-dev.yml index d3a3e77..896583c 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: /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,/caseInfo/update,/**/list/unResolved,/last/drawNo,/multiScore/** + 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,/caseInfo/update,/**/list/unResolved,/last/drawNo,/multiScore/**,/deviceInfo/cameraList #flowable数据源和多数据源配置 db: init: @@ -82,4 +82,20 @@ 2e22b7c9206c4184a756c7c091422a8d,bbb12547f1d1453c8be02d6e8c413338,d4612a78089a4dcab0df417591c346e8,d277ae7102774ba6bd568cff9bbdfc08, 57c2a7b7c19d48c9b04ac5f2e1c4b3ed,69dee9f5bb51435bb9045cc5d59fa194,e5c6c81beee24131b18e12862123a68b,950b1a1708534bbbbb40dcb36d21eb70, 9b8450815d47401482dd7d4b075e4229,d69c2a94fb0a49ca86b0d9faa920068a,588593de9e7f42f9819f08f7cfc6ae86,ed7de18f260441f3aef025696e3bdb09, - dd6dd56306c746fabdd637a3489cef00,6b660fcc97e34c7c82c1ef517a88bb52,b62e4f68120249babd6203c90b53cb7a,0513c3e1926f450fb403f441dd644fcd] \ No newline at end of file + dd6dd56306c746fabdd637a3489cef00,6b660fcc97e34c7c82c1ef517a88bb52,b62e4f68120249babd6203c90b53cb7a,0513c3e1926f450fb403f441dd644fcd] + +#闸机与监控点联动 +#指定监控点识别黑名单事件后关闭对应闸机 +devicelinkage: + configMap: + #一期主楼 + 1d07f327d63f4fabac94d6e0fc92496c: [534542c51e9c4499becf464ec80895f5,9efea996b23840b691ddb80e823f3d8d,7e6b4f58908040bd871279a0701b2b62, + 889916c8a9b749febb56c569fab4a2b2,1eacbe03363c4b2980a59999188fc116] + #录制楼 + ad83b94f17e24814abc84e2c576265ec: [2014a1d8fead4b76a5cb836ecf1c4db6,4b56821684224b8ea0467acae2fa4f6f,7840b20c767b47b68f1cfd5050be0333] + #二期主楼西门 + bc4fdb9593b448d5b6f001bded208188: [a02e957b3e8d446fb41c1adb729524fe,8f659690e27244bdba65dd2d0fa313ba,03bfd8c696fa46018f10b17faa7c5e41, + 2e22b7c9206c4184a756c7c091422a8d,57c2a7b7c19d48c9b04ac5f2e1c4b3ed,9b8450815d47401482dd7d4b075e4229, + dd6dd56306c746fabdd637a3489cef00] + #二期主楼东门 + 80560cd4292d468aa30809518f047e41: [d0a261d6a8bd4af09302970e392dd771,734530c21fb84bdbabc2ad50d6272ba4,bd86703f5ffe4f4d8ce437416d32fe8b] \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application-prod.yml b/casic-web/src/main/resources/config/application-prod.yml index d1c6782..b7d99ea 100644 --- a/casic-web/src/main/resources/config/application-prod.yml +++ b/casic-web/src/main/resources/config/application-prod.yml @@ -22,7 +22,7 @@ casic: kaptcha-open: false #是否开启登录时验证码 (true/false) - 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,/caseInfo/update,/**/list/unResolved,/last/drawNo,/multiScore/**,/caseInfo/oneClickSolved + 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,/caseInfo/update,/**/list/unResolved,/last/drawNo,/multiScore/**,/caseInfo/oneClickSolved,/deviceInfo/cameraList #flowable数据源和多数据源配置 db: init: @@ -84,4 +84,19 @@ 2e22b7c9206c4184a756c7c091422a8d,bbb12547f1d1453c8be02d6e8c413338,d4612a78089a4dcab0df417591c346e8,d277ae7102774ba6bd568cff9bbdfc08, 57c2a7b7c19d48c9b04ac5f2e1c4b3ed,69dee9f5bb51435bb9045cc5d59fa194,e5c6c81beee24131b18e12862123a68b,950b1a1708534bbbbb40dcb36d21eb70, 9b8450815d47401482dd7d4b075e4229,d69c2a94fb0a49ca86b0d9faa920068a,588593de9e7f42f9819f08f7cfc6ae86,ed7de18f260441f3aef025696e3bdb09, - dd6dd56306c746fabdd637a3489cef00,6b660fcc97e34c7c82c1ef517a88bb52,b62e4f68120249babd6203c90b53cb7a,0513c3e1926f450fb403f441dd644fcd] \ No newline at end of file + dd6dd56306c746fabdd637a3489cef00,6b660fcc97e34c7c82c1ef517a88bb52,b62e4f68120249babd6203c90b53cb7a,0513c3e1926f450fb403f441dd644fcd] +#闸机与监控点联动 +#指定监控点识别黑名单事件后关闭对应闸机 +devicelinkage: + configMap: + #一期主楼 + 1d07f327d63f4fabac94d6e0fc92496c: [534542c51e9c4499becf464ec80895f5,9efea996b23840b691ddb80e823f3d8d,7e6b4f58908040bd871279a0701b2b62, + 889916c8a9b749febb56c569fab4a2b2,1eacbe03363c4b2980a59999188fc116] + #录制楼 + ad83b94f17e24814abc84e2c576265ec: [2014a1d8fead4b76a5cb836ecf1c4db6,4b56821684224b8ea0467acae2fa4f6f,7840b20c767b47b68f1cfd5050be0333] + #二期主楼西门 + bc4fdb9593b448d5b6f001bded208188: [a02e957b3e8d446fb41c1adb729524fe,8f659690e27244bdba65dd2d0fa313ba,03bfd8c696fa46018f10b17faa7c5e41, + 2e22b7c9206c4184a756c7c091422a8d,57c2a7b7c19d48c9b04ac5f2e1c4b3ed,9b8450815d47401482dd7d4b075e4229, + dd6dd56306c746fabdd637a3489cef00] + #二期主楼东门 + 80560cd4292d468aa30809518f047e41: [d0a261d6a8bd4af09302970e392dd771,734530c21fb84bdbabc2ad50d6272ba4,bd86703f5ffe4f4d8ce437416d32fe8b] \ No newline at end of file diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml index d410e56..9dc8566 100644 --- a/casic-web/src/main/resources/config/application.yml +++ b/casic-web/src/main/resources/config/application.yml @@ -3,7 +3,7 @@ ########################################################## spring: profiles: - active: prod + active: dev servlet: multipart: max-file-size: 50MB