From 27e913d6d28a9cfa0785d15453a4de10fd36ce6d Mon Sep 17 00:00:00 2001 From: fuliqi <fuliqi@qq.com> Date: 星期一, 10 二月 2025 11:17:59 +0800 Subject: [PATCH] 首页录像统计加上间歇 --- ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java | 782 +++++++++++++++++++++++++++++++++++++----------------- 1 files changed, 531 insertions(+), 251 deletions(-) diff --git a/ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java b/ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java index 713fc0b..c17d4ee 100644 --- a/ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java +++ b/ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java @@ -3,10 +3,12 @@ import annotation.DataScope; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mongodb.ExplainVerbosity; import com.mongodb.client.AggregateIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; import com.ycl.platform.domain.entity.TMonitor; +import com.ycl.platform.domain.excel.TMonitorExp; import com.ycl.platform.domain.excel.VideoDailyExp; import com.ycl.platform.domain.excel.VideoTotalExp; import com.ycl.platform.domain.form.VideoExportForm; @@ -14,10 +16,7 @@ import com.ycl.platform.domain.query.DataCenterQuery; import com.ycl.platform.domain.query.HomeQuery; import com.ycl.platform.domain.result.BaseResult; -import com.ycl.platform.domain.result.HK.FaceDeviceInspectionResult; -import com.ycl.platform.domain.result.HK.FaceDeviceSamplingResult; -import com.ycl.platform.domain.result.HK.VehicleDeviceInspectionResult; -import com.ycl.platform.domain.result.HK.VehicleDeviceSamplingResult; +import com.ycl.platform.domain.result.HK.*; import com.ycl.platform.domain.result.SYS.TMonitorResult; import com.ycl.platform.domain.result.UY.MonitorQualifyResult; import com.ycl.platform.domain.result.UY.OsdCheckResult; @@ -34,6 +33,7 @@ import com.ycl.platform.mapper.DynamicColumnMapper; import com.ycl.platform.mapper.TMonitorMapper; import com.ycl.platform.mapper.WorkOrderMapper; +import com.ycl.platform.mapper.YwPointMapper; import com.ycl.platform.service.ITMonitorService; import com.ycl.system.Result; import com.ycl.system.entity.SysDictData; @@ -43,6 +43,7 @@ import com.ycl.system.service.ISysConfigService; import com.ycl.utils.DateUtils; import com.ycl.utils.StringUtils; +import com.ycl.utils.poi.ExcelUtil; import constant.ApiConstants; import constant.CheckConstants; import enumeration.general.AreaDeptEnum; @@ -55,7 +56,9 @@ import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import pojo.ExcelExp; import utils.poi.ExcelUtilManySheet; @@ -73,6 +76,9 @@ import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalAdjusters; import java.util.*; +import java.util.concurrent.*; +import java.util.function.BinaryOperator; +import java.util.function.Function; import java.util.stream.Collectors; /** @@ -86,6 +92,8 @@ @Autowired private TMonitorMapper tMonitorMapper; @Autowired + private YwPointMapper pointMapper; + @Autowired private ISysConfigService configService; @Autowired private MongoTemplate mongoTemplate; @@ -95,6 +103,8 @@ private SysDictDataMapper dictDataMapper; @Autowired private DynamicColumnMapper dynamicColumnMapper; + @Autowired + private ThreadPoolTaskExecutor threadPoolTaskExecutor; /** * 鏌ヨ璁惧璧勪骇 @@ -137,7 +147,7 @@ for (TMonitorVO monitor : monitors) { if (!CollectionUtils.isEmpty(voList)) { for (WorkOrderVO workOrderVO : voList) { - if (monitor.getWorkOrderNo().equals(workOrderVO.getWorkOrderNo())) { + if (monitor.getWorkOrderNo() != null && monitor.getWorkOrderNo().equals(workOrderVO.getWorkOrderNo())) { monitor.setUnitContact(workOrderVO.getUnitContact()); monitor.setUnitContactPhone(workOrderVO.getUnitContactPhone()); monitor.setYwPeopleName(workOrderVO.getYwPeopleName()); @@ -189,21 +199,30 @@ } // 杞﹁締鐩戞帶璁惧 if (Objects.equals(tMonitor.getCameraFunType(), "2")) { - //灞炴�т竴鑷寸巼銆佸ぇ鍥俱�乽rl + //灞炴�т竴鑷寸巼銆佸ぇ鍥� List<VehicleDeviceSamplingResult> sampleResults = mongoTemplate.find(query, VehicleDeviceSamplingResult.class); + List<PicAccessResult> picAccessResults = mongoTemplate.find(query, PicAccessResult.class); //鎶撴媿閲忋�佹椂閽熴�佷笂浼� List<VehicleDeviceInspectionResult> inspectResults = mongoTemplate.find(query, VehicleDeviceInspectionResult.class); for (TMonitorVO monitor : monitors) { monitor.setMongoCreateTime(now); //涓�鏈轰竴妗� setOneFile(monitorQualifyResults, monitor); - //灞炴�т竴鑷寸巼銆佸ぇ鍥俱�乽rl + //url + if (!CollectionUtils.isEmpty(sampleResults)) { + for (PicAccessResult picAccessResult : picAccessResults) { + if (monitor.getSerialNumber().equals(picAccessResult.getNo())) { + BigDecimal bigDecimal = PicAccessResult.calUrl(picAccessResult); + monitor.setUrlPercent(bigDecimal); + } + } + } + //灞炴�т竴鑷寸巼銆佸ぇ鍥� if (!CollectionUtils.isEmpty(sampleResults)) { for (VehicleDeviceSamplingResult sampleResult : sampleResults) { if (monitor.getSerialNumber().equals(sampleResult.getNo())) { if (sampleResult.getBigUseful() != null) { monitor.setBigUsefulPercent(sampleResult.getBigUseful().getBigUsefulPercent()); - monitor.setUrlPercent(VehicleDeviceSamplingResult.BigUsefulness.calUrl(sampleResult.getBigUseful())); } if (sampleResult.getVehDiff() != null) { monitor.setImportantConPercent(sampleResult.getVehDiff().getImportantConPercent()); @@ -237,13 +256,12 @@ monitor.setMongoCreateTime(now); //涓�鏈轰竴妗� setOneFile(monitorQualifyResults, monitor); - //浜鸿劯鍚堟牸銆佸ぇ鍥俱�乽rl璁块棶寮傚父 + //浜鸿劯鍚堟牸銆佸ぇ鍥� if (!CollectionUtils.isEmpty(sampleResults)) { for (FaceDeviceSamplingResult sampleResult : sampleResults) { if (monitor.getSerialNumber().equals(sampleResult.getNo())) { if (sampleResult.getBigUseful() != null) { monitor.setBigUsefulPercent(sampleResult.getBigUseful().getBigUsefulPercent()); - monitor.setUrlPercent(FaceDeviceSamplingResult.BigUsefulness.calUrl(sampleResult.getBigUseful())); } if (sampleResult.getFaceEligibility() != null) monitor.setFacePercent(sampleResult.getFaceEligibility().getFaceEligPercent()); @@ -345,8 +363,16 @@ return tMonitorMapper.recoveryException(monitor); } + /** + * 鏌ongo鏌ユ煇涓湀璁惧鎬绘暟 + * 鏌ョ湅宸ュ崟鏁伴噺鏌ョ湅寮傚父鐨勬暟 + * + * @param monitorQuery 鏌ヨ鏉′欢 + * @return + */ @Override public Map<String, Object> home(HomeQuery monitorQuery) { + Map<String, Object> dataMap = new HashMap<>(); Map<String, Object> monthMap1 = new HashMap<>(); Map<String, Object> monthMap2 = new HashMap<>(); @@ -411,81 +437,117 @@ @Override public void exportVideoTotal(HttpServletResponse response, VideoExportForm exportForm) throws IOException { //榛樿鏌ユ墍鏈夐儴闂� - if(CollectionUtils.isEmpty(exportForm.getDeptIds())){ + if (CollectionUtils.isEmpty(exportForm.getDeptIds())) { List<Integer> deptIds = new ArrayList<>(); for (AreaDeptEnum value : AreaDeptEnum.values()) { deptIds.add(value.getDeptId()); } exportForm.setDeptIds(deptIds); } - List<ExcelExp> mysheet = new ArrayList<>(); - exportForm.setCameraFunType(Integer.valueOf(CheckConstants.Rule_Category_Video + "")); + List<ExcelExp> sheet = new ArrayList<>(); + //閫氳繃Collections闈欐�佹柟娉曪紝鎶妉ist杞负绾跨▼瀹夊叏鐨刲ist + List mysheet = Collections.synchronizedList(sheet); VideoExportForm.convertTags(exportForm); - List<TMonitorResult> tMonitorResults = tMonitorMapper.selectMonitorResult(exportForm); - List<String> deviceIds = tMonitorResults.stream().map(BaseResult::getNo).collect(Collectors.toList()); - Query query = getQuery(deviceIds, exportForm.getMonth()); + Query query = getQuery(exportForm); //鏈堜唤姣忔棩鍦ㄧ嚎鏁版嵁 List<TMonitorResult> onlineResult = mongoTemplate.find(query, TMonitorResult.class); + // 浣跨敤 Collectors.toMap 鍘婚噸锛屼繚鐣欐瘡涓� No 鐨勭涓�涓亣鍒扮殑鍏冪礌 + Map<String, TMonitorResult> uniqueResultsMap = onlineResult.stream() + .collect(Collectors.toMap( + TMonitorResult::getNo, // keyMapper锛岃繖閲屽亣璁� getNo() 杩斿洖 No 瀛楁 + Function.identity(), // valueMapper锛岀洿鎺ヤ娇鐢ㄥ璞℃湰韬� + (existing, replacement) -> existing // mergeFunction锛屽鏋滄湁閲嶅锛屼繚鐣欑涓�涓� + )); + // 灏� Map 杞崲涓� List + List<TMonitorResult> tMonitorResults = new ArrayList<>(uniqueResultsMap.values()); + List<String> deviceIds = tMonitorResults.stream().map(BaseResult::getNo).collect(Collectors.toList()); + // 灏嗗勾鏈堝瓧绗︿覆瑙f瀽涓篩earMonth瀵硅薄 + YearMonth yearMonth = YearMonth.parse(exportForm.getMonth()); + // 鑾峰彇褰撴湀鐨勭涓�澶� + LocalDate start = yearMonth.atDay(1); + // 鑾峰彇涓嬩釜鏈堢殑绗竴澶╋紙閫氳繃鍔犱笂1涓湀骞惰缃棩涓�1锛� + YearMonth nextMonth = yearMonth.plusMonths(1); + LocalDate end = nextMonth.atDay(1); + //鑾峰彇杩欎釜鏈堜唤鐨勯儴闂ㄦ暟鎹紝褰曞儚鐢变簬鏄墠涓�澶╃殑鎵�浠ヤ笉鐢╟reateTime瀛楁 + Query videoQuery = new Query(Criteria.where("statTime").gte(start).lt(end)); + videoQuery.addCriteria(Criteria.where("no").in(deviceIds)); //鏈堜唤姣忔棩褰曞儚鏁版嵁 - List<RecordMetaDSumResult> recordResult = mongoTemplate.find(query, RecordMetaDSumResult.class); + List<RecordMetaDSumResult> recordResult = mongoTemplate.find(videoQuery, RecordMetaDSumResult.class); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); String[] weeks = {"鏄熸湡涓�", "鏄熸湡浜�", "鏄熸湡涓�", "鏄熸湡鍥�", "鏄熸湡浜�", "鏄熸湡鍏�", "鏄熸湡鏃�"}; // 鍒涘缓涓�涓狹ap鏉ュ瓨鍌ㄦ瘡澶╃殑绱姞鏁版嵁 - Map<String, VideoTotalExp> totalMap = new HashMap<>(); + Map<String, VideoTotalExp> totalMap = new ConcurrentHashMap<>(); + List<CompletableFuture<Void>> futures = new ArrayList<>(); //涓�涓儴闂ㄤ竴涓猻heet for (Integer deptId : exportForm.getDeptIds()) { - //浠庢暟鎹簱闆嗗悎绛涢�夐儴闂ㄦ暟鎹� - List<String> ids = tMonitorResults.stream().filter(tMonitorResult -> deptId.equals(tMonitorResult.getDeptId())).map(BaseResult::getNo).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(ids)) continue; - //绛涢�夐儴闂ㄦ暟鎹� - List<TMonitorResult> onlineList = onlineResult.stream().filter(tMonitorResult -> ids.contains(tMonitorResult.getNo())).collect(Collectors.toList()); - List<RecordMetaDSumResult> recordList = recordResult.stream().filter(result -> ids.contains(result.getNo())).collect(Collectors.toList()); - List<VideoTotalExp> videoTotalExps = new ArrayList<>(); - for (int i = 0; i < 31; i++) { - String date = exportForm.getMonth(); - date += "-" + (i < 9 ? "0" + (i + 1) : (i + 1)); - //鎬婚噺 - VideoTotalExp totalExp = totalMap.computeIfAbsent(date, k -> new VideoTotalExp()); - LocalDate parseTime = LocalDate.parse(date, formatter); - //鑾峰彇鏄熸湡鍑� - String week = weeks[parseTime.getDayOfWeek().getValue() - 1]; - VideoTotalExp videoExp = new VideoTotalExp(); - videoExp.setDate(date); - videoExp.setWeek(week); - //璁剧疆鐐逛綅鍦ㄧ嚎鎬婚噺 - List<TMonitorResult> onlines = onlineList.stream().filter(tMonitorResult -> tMonitorResult.getMongoCreateTime().minusDays(1).equals(parseTime)).collect(Collectors.toList()); - if (!CollectionUtils.isEmpty(onlines)) { - videoExp.setTotal(onlines.size()); - videoExp.setOnline(Integer.valueOf(onlines.stream() - .filter(TMonitorResult::getPingOnline) - .count() + "")); - videoExp.setOffline(videoExp.getTotal() - videoExp.getOnline()); + CompletableFuture<Void> future = CompletableFuture.runAsync(() -> { + SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + //绛涢�夐儴闂ㄦ暟鎹� + Set<String> ids = onlineResult.stream().filter(tMonitorResult -> deptId.equals(tMonitorResult.getDeptId())).map(BaseResult::getNo).collect(Collectors.toSet()); + if (CollectionUtils.isEmpty(ids)) return; + //绛涢�夐儴闂ㄦ暟鎹� + List<TMonitorResult> onlineList = onlineResult.stream().filter(tMonitorResult -> deptId.equals(tMonitorResult.getDeptId())).collect(Collectors.toList()); + Map<LocalDate, List<TMonitorResult>> onlineMap = onlineList.stream() + .collect(Collectors.groupingBy(TMonitorResult::getMongoCreateTime)); + List<RecordMetaDSumResult> recordList = recordResult.stream().filter(result -> ids.contains(result.getNo())).collect(Collectors.toList()); + Map<Date, List<RecordMetaDSumResult>> recordMap = recordList.stream().collect(Collectors.groupingBy(RecordMetaDSumResult::getStatTime)); + List<VideoTotalExp> videoTotalExps = new ArrayList<>(); + for (int i = 0; i < 31; i++) { + String date = exportForm.getMonth(); + date += "-" + (i < 9 ? "0" + (i + 1) : (i + 1)); + //鎬婚噺 + VideoTotalExp totalExp = totalMap.computeIfAbsent(date, k -> new VideoTotalExp()); + LocalDate parseTime = LocalDate.parse(date, formatter); + try { + Date parseDate = simpleDateFormat.parse(date); + //鑾峰彇鏄熸湡鍑� + String week = weeks[parseTime.getDayOfWeek().getValue() - 1]; + VideoTotalExp videoExp = new VideoTotalExp(); + videoExp.setDate(date); + videoExp.setWeek(week); + //璁剧疆鐐逛綅鍦ㄧ嚎鎬婚噺 + List<TMonitorResult> onlines = onlineMap.get(parseTime); + if (!CollectionUtils.isEmpty(onlines)) { + videoExp.setTotal(onlines.size()); + long count = onlines.stream() + .filter(item -> ApiConstants.UY_OnlineSite_Online.equals(item.getOnline())) + .count(); + videoExp.setOnline(Integer.valueOf(count + "")); + videoExp.setOffline(videoExp.getTotal() - videoExp.getOnline()); + } + //璁剧疆瀛樺偍鎯呭喌 + List<RecordMetaDSumResult> records = recordMap.get(parseDate); + if (!CollectionUtils.isEmpty(records)) { + videoExp.setNoStore(Integer.valueOf(records.stream() + .filter(record -> ApiConstants.UY_RecordStatus_Abnormal.equals(record.getRecordStatus())) + .count() + "")); + videoExp.setPartStore(Integer.valueOf(records.stream() + .filter(record -> ApiConstants.UY_RecordStatus_Interval.equals(record.getRecordStatus())) + .count() + "")); + } + videoTotalExps.add(videoExp); + //绱姞浣滀负鍏ㄩ噺琛� + totalExp.setDate(date); + totalExp.setWeek(week); + totalExp.setTotal((totalExp.getTotal() == null ? 0 : totalExp.getTotal()) + (videoExp.getTotal() == null ? 0 : videoExp.getTotal())); + totalExp.setOnline((totalExp.getOnline() == null ? 0 : totalExp.getOnline()) + (videoExp.getOnline() == null ? 0 : videoExp.getOnline())); + totalExp.setOffline((totalExp.getOffline() == null ? 0 : totalExp.getOffline()) + (videoExp.getOffline() == null ? 0 : videoExp.getOffline())); + totalExp.setNoStore((totalExp.getNoStore() == null ? 0 : totalExp.getNoStore()) + (videoExp.getNoStore() == null ? 0 : videoExp.getNoStore())); + totalExp.setPartStore((totalExp.getPartStore() == null ? 0 : totalExp.getPartStore()) + (videoExp.getPartStore() == null ? 0 : videoExp.getPartStore())); + totalMap.put(date, totalExp); + } catch (ParseException e) { + e.printStackTrace(); + } } - //璁剧疆瀛樺偍鎯呭喌 - List<RecordMetaDSumResult> records = recordList.stream().filter(record -> record.getMongoCreateTime().minusDays(1).equals(parseTime)).collect(Collectors.toList()); - if (!CollectionUtils.isEmpty(records)) { - videoExp.setNoStore(Integer.valueOf(records.stream() - .filter(record -> ApiConstants.UY_RecordStatus_Abnormal.equals(record.getRecordStatus())) - .count() + "")); - videoExp.setPartStore(Integer.valueOf(records.stream() - .filter(record -> ApiConstants.UY_RecordStatus_Interval.equals(record.getRecordStatus())) - .count() + "")); - } - videoTotalExps.add(videoExp); - //绱姞浣滀负鍏ㄩ噺琛� - totalExp.setDate(date); - totalExp.setWeek(week); - totalExp.setTotal((totalExp.getTotal() == null ? 0 : totalExp.getTotal()) + (videoExp.getTotal() == null ? 0 : videoExp.getTotal())); - totalExp.setOnline((totalExp.getOnline() == null ? 0 : totalExp.getOnline()) + (videoExp.getOnline() == null ? 0 : videoExp.getOnline())); - totalExp.setOffline((totalExp.getOffline() == null ? 0 : totalExp.getOffline()) + (videoExp.getOffline() == null ? 0 : videoExp.getOffline())); - totalExp.setNoStore((totalExp.getNoStore() == null ? 0 : totalExp.getNoStore()) + (videoExp.getNoStore() == null ? 0 : videoExp.getNoStore())); - totalExp.setPartStore((totalExp.getPartStore() == null ? 0 : totalExp.getPartStore()) + (videoExp.getPartStore() == null ? 0 : videoExp.getPartStore())); - totalMap.put(date, totalExp); - } - AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromDept(deptId); - ExcelExp excelExp = new ExcelExp(areaDeptEnum == null ? "鏈煡" : areaDeptEnum.getName(), videoTotalExps, VideoTotalExp.class); - mysheet.add(excelExp); + AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromDept(deptId); + ExcelExp excelExp = new ExcelExp(areaDeptEnum == null ? "鏈煡" : areaDeptEnum.getName(), videoTotalExps, VideoTotalExp.class); + mysheet.add(excelExp); + }, threadPoolTaskExecutor); + futures.add(future); } + // 绛夊緟鎵�鏈変换鍔″畬鎴� + CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); + allFutures.join(); // 杩欏皢闃诲鐩村埌鎵�鏈変换鍔″畬鎴� //娣诲姞鍏ㄩ噺琛� List<VideoTotalExp> totalExps = new ArrayList<>(totalMap.values()); totalExps = totalExps.stream().sorted(Comparator.comparing(VideoTotalExp::getDate)).collect(Collectors.toList()); @@ -503,69 +565,107 @@ @Override public void exportVideoOnline(HttpServletResponse response, VideoExportForm exportForm) throws IOException, NoSuchFieldException, IllegalAccessException { //榛樿鏌ユ墍鏈夐儴闂� - if(CollectionUtils.isEmpty(exportForm.getDeptIds())){ + if (CollectionUtils.isEmpty(exportForm.getDeptIds())) { List<Integer> deptIds = new ArrayList<>(); for (AreaDeptEnum value : AreaDeptEnum.values()) { deptIds.add(value.getDeptId()); } exportForm.setDeptIds(deptIds); } - List<ExcelExp> mysheet = new ArrayList<>(); - exportForm.setCameraFunType(Integer.valueOf(CheckConstants.Rule_Category_Video + "")); + List<ExcelExp> sheet = new ArrayList<>(); + //閫氳繃Collections闈欐�佹柟娉曪紝鎶妉ist杞负绾跨▼瀹夊叏鐨刲ist + List mysheet = Collections.synchronizedList(sheet); VideoExportForm.convertTags(exportForm); - List<TMonitorResult> tMonitorResults = tMonitorMapper.selectMonitorResult(exportForm); + Query query = getQuery(exportForm); + //鏈堜唤姣忔棩鍦ㄧ嚎鏁版嵁 + List<TMonitorResult> onlineResult = mongoTemplate.find(query, TMonitorResult.class); + // 浣跨敤 Collectors.toMap 鍘婚噸锛屼繚鐣欐瘡涓� No 鐨勭涓�涓亣鍒扮殑鍏冪礌 + Map<String, TMonitorResult> uniqueResultsMap = onlineResult.stream() + .collect(Collectors.toMap( + TMonitorResult::getNo, // keyMapper锛岃繖閲屽亣璁� getNo() 杩斿洖 No 瀛楁 + Function.identity(), // valueMapper锛岀洿鎺ヤ娇鐢ㄥ璞℃湰韬� + (existing, replacement) -> existing // mergeFunction锛屽鏋滄湁閲嶅锛屼繚鐣欑涓�涓� + )); + // 灏� Map 杞崲涓� List + List<TMonitorResult> tMonitorResults = new ArrayList<>(uniqueResultsMap.values()); //鑾峰彇鍔ㄦ�佸垪鏁版嵁 List<Integer> pointIds = tMonitorResults.stream().map(TMonitorResult::getPointId).collect(Collectors.toList()); List<DynamicColumnVO> dynamics = dynamicColumnMapper.getDynamicsByIds("t_yw_point", pointIds); //琛ュ厖鍔ㄦ�佸垪鏁版嵁 - if(!CollectionUtils.isEmpty(dynamics)) { + if (!CollectionUtils.isEmpty(dynamics)) { Map<Integer, List<DynamicColumnVO>> map = dynamics.stream().collect(Collectors.groupingBy(DynamicColumnVO::getRefId)); for (TMonitorResult tMonitorResult : tMonitorResults) { Integer pointId = tMonitorResult.getPointId(); tMonitorResult.setDynamicColumnList(map.get(pointId)); } } - List<String> deviceIds = tMonitorResults.stream().map(BaseResult::getNo).collect(Collectors.toList()); - Query query = getQuery(deviceIds, exportForm.getMonth()); - //鏈堜唤姣忔棩鍦ㄧ嚎鏁版嵁 - List<TMonitorResult> onlineResult = mongoTemplate.find(query, TMonitorResult.class); - //鍏ㄩ噺琛� - List<VideoDailyExp> totalExps = new ArrayList<>(); + List<CompletableFuture<List<VideoDailyExp>>> futures = new ArrayList<>(); for (Integer deptId : exportForm.getDeptIds()) { - List<VideoDailyExp> videoDailyExps = new ArrayList<>(); - //浠庢暟鎹簱闆嗗悎绛涢�夐儴闂ㄦ暟鎹� - List<TMonitorResult> monitors = tMonitorResults.stream().filter(tMonitorResult -> deptId.equals(tMonitorResult.getDeptId())).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(monitors)) continue; - List<String> ids = monitors.stream().map(BaseResult::getNo).collect(Collectors.toList()); - //绛涢�塵ongo鍖哄幙鏁版嵁 - List<TMonitorResult> onlines = onlineResult.stream().filter(result -> ids.contains(result.getNo())).collect(Collectors.toList()); - AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromDept(deptId); - for (TMonitorResult result : monitors) { - VideoDailyExp videoDailyExp = new VideoDailyExp(); - videoDailyExp.setSerialNumber(result.getNo()); - videoDailyExp.setDeviceName(result.getName()); - videoDailyExp.setArea(areaDeptEnum == null ? "鏈煡" : areaDeptEnum.getName()); - StringBuilder tag = new StringBuilder("" + (result.getProvinceTag() ? "鐪佸巺銆�" : "") + (result.getImportantTag() ? "閲嶇偣鐐逛綅銆�" : "") + (result.getImportantCommandImageTag() ? "閲嶇偣鎸囨尌鍥惧儚銆�" : "") + (result.getDeptTag() ? "閮ㄧ骇銆�" : "")); - //鍔ㄦ�佸垪澶勭悊鍔犲湪鏍囩閲� - if(!CollectionUtils.isEmpty(result.getDynamicColumnList())){ - List<DynamicColumnVO> dynamicColumnList = result.getDynamicColumnList(); - for (DynamicColumnVO dynamicColumnVO : dynamicColumnList) { - tag.append(dynamicColumnVO.getColumnValue()).append("銆�"); + CompletableFuture<List<VideoDailyExp>> future = CompletableFuture.supplyAsync(() -> { + List<VideoDailyExp> videoDailyExps = new ArrayList<>(); + //绛涢�夐儴闂ㄦ暟鎹� + List<TMonitorResult> monitors = tMonitorResults.stream() + .filter(tMonitorResult -> deptId.equals(tMonitorResult.getDeptId())) + .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(monitors)) return videoDailyExps; + + List<String> ids = monitors.stream() + .map(BaseResult::getNo) + .collect(Collectors.toList()); + //绛涢�塵ongo鍖哄幙鏁版嵁 + List<TMonitorResult> onlines = onlineResult.stream() + .filter(result -> ids.contains(result.getNo())) + .collect(Collectors.toList()); + + AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromDept(deptId); + for (TMonitorResult result : monitors) { + VideoDailyExp videoDailyExp = new VideoDailyExp(); + videoDailyExp.setSerialNumber(result.getNo()); + videoDailyExp.setDeviceName(result.getName()); + videoDailyExp.setArea(areaDeptEnum == null ? "鏈煡" : areaDeptEnum.getName()); + + StringBuilder tag = new StringBuilder("" + + (result.getProvinceTag() ? "鐪佸巺銆�" : "") + + (result.getImportantTag() ? "閲嶇偣鐐逛綅銆�" : "") + + (result.getImportantCommandImageTag() ? "閲嶇偣鎸囨尌鍥惧儚銆�" : "") + + (result.getDeptTag() ? "閮ㄧ骇銆�" : "")); + + //鍔ㄦ�佸垪澶勭悊鍔犲湪鏍囩閲� + if (!CollectionUtils.isEmpty(result.getDynamicColumnList())) { + for (DynamicColumnVO dynamicColumnVO : result.getDynamicColumnList()) { + tag.append(dynamicColumnVO.getColumnValue()).append("銆�"); + } } + // 鍒犻櫎瀛楃涓叉湯灏剧殑"銆�" + if (tag.toString().endsWith("銆�")) { + tag = new StringBuilder(tag.substring(0, tag.length() - 1)); + } + videoDailyExp.setTag(tag.toString()); + + try { + setOnlineDaily(videoDailyExp, result, onlines); + } catch (Exception e) { + log.error(e.getMessage()); + } + videoDailyExps.add(videoDailyExp); } - // 鍒犻櫎瀛楃涓叉湯灏剧殑鈥溿�佲�� - if (tag.toString().endsWith("銆�")) { - tag = new StringBuilder(tag.substring(0, tag.length() - 1)); - } - videoDailyExp.setTag(tag.toString()); - setOnlineDaily(videoDailyExp, result, onlines); - videoDailyExps.add(videoDailyExp); - //鍏ㄩ噺琛� - totalExps.add(videoDailyExp); - } - ExcelExp excelExp = new ExcelExp(areaDeptEnum == null ? "鏈煡" : areaDeptEnum.getName(), videoDailyExps, VideoDailyExp.class); - mysheet.add(excelExp); + + ExcelExp excelExp = new ExcelExp( + areaDeptEnum == null ? "鏈煡" : areaDeptEnum.getName(), + videoDailyExps, + VideoDailyExp.class + ); + mysheet.add(excelExp); + + return videoDailyExps; + }, threadPoolTaskExecutor); + futures.add(future); } + // 鑾峰彇鍏ㄩ噺鏁版嵁 + List<VideoDailyExp> totalExps = futures.stream() + .map(CompletableFuture::join) + .flatMap(List::stream) + .collect(Collectors.toList()); ExcelExp excelExp = new ExcelExp("鍏ㄩ噺", totalExps, VideoDailyExp.class); mysheet.add(excelExp); ExcelUtilManySheet<List<ExcelExp>> util = new ExcelUtilManySheet<>(mysheet); @@ -579,70 +679,118 @@ @Override public void exportVideoRecord(HttpServletResponse response, VideoExportForm exportForm) throws IOException, NoSuchFieldException, IllegalAccessException { //榛樿鏌ユ墍鏈夐儴闂� - if(CollectionUtils.isEmpty(exportForm.getDeptIds())){ + if (CollectionUtils.isEmpty(exportForm.getDeptIds())) { List<Integer> deptIds = new ArrayList<>(); for (AreaDeptEnum value : AreaDeptEnum.values()) { deptIds.add(value.getDeptId()); } exportForm.setDeptIds(deptIds); } - List<ExcelExp> mysheet = new ArrayList<>(); - exportForm.setCameraFunType(Integer.valueOf(CheckConstants.Rule_Category_Video + "")); + VideoExportForm.convertTags(exportForm); - List<TMonitorResult> tMonitorResults = tMonitorMapper.selectMonitorResult(exportForm); + Query query = getQuery(exportForm); + //鏈堜唤姣忔棩鍦ㄧ嚎鏁版嵁 + List<TMonitorResult> onlineResult = mongoTemplate.find(query, TMonitorResult.class); + + // 浣跨敤 Collectors.toMap 鍘婚噸锛屼繚鐣欐瘡涓� No 鐨勭涓�涓亣鍒扮殑鍏冪礌 + Map<String, TMonitorResult> uniqueResultsMap = onlineResult.stream() + .collect(Collectors.toMap( + TMonitorResult::getNo, // keyMapper锛岃繖閲屽亣璁� getNo() 杩斿洖 No 瀛楁 + Function.identity(), // valueMapper锛岀洿鎺ヤ娇鐢ㄥ璞℃湰韬� + (existing, replacement) -> existing // mergeFunction锛屽鏋滄湁閲嶅锛屼繚鐣欑涓�涓� + )); + // 灏� Map 杞崲涓� List + List<TMonitorResult> tMonitorResults = new ArrayList<>(uniqueResultsMap.values()); + List<String> deviceIds = tMonitorResults.stream().map(BaseResult::getNo).collect(Collectors.toList()); //鑾峰彇鍔ㄦ�佸垪鏁版嵁 List<Integer> pointIds = tMonitorResults.stream().map(TMonitorResult::getPointId).collect(Collectors.toList()); List<DynamicColumnVO> dynamics = dynamicColumnMapper.getDynamicsByIds("t_yw_point", pointIds); //琛ュ厖鍔ㄦ�佸垪鏁版嵁 - if(!CollectionUtils.isEmpty(dynamics)) { + if (!CollectionUtils.isEmpty(dynamics)) { Map<Integer, List<DynamicColumnVO>> map = dynamics.stream().collect(Collectors.groupingBy(DynamicColumnVO::getRefId)); for (TMonitorResult tMonitorResult : tMonitorResults) { Integer pointId = tMonitorResult.getPointId(); tMonitorResult.setDynamicColumnList(map.get(pointId)); } } - List<String> deviceIds = tMonitorResults.stream().map(BaseResult::getNo).collect(Collectors.toList()); - Query query = getQuery(deviceIds, exportForm.getMonth()); + + // 灏嗗勾鏈堝瓧绗︿覆瑙f瀽涓篩earMonth瀵硅薄 + YearMonth yearMonth = YearMonth.parse(exportForm.getMonth()); + // 鑾峰彇褰撴湀鐨勭涓�澶� + LocalDate start = yearMonth.atDay(1); + // 鑾峰彇涓嬩釜鏈堢殑绗竴澶╋紙閫氳繃鍔犱笂1涓湀骞惰缃棩涓�1锛� + YearMonth nextMonth = yearMonth.plusMonths(1); + LocalDate end = nextMonth.atDay(1); + //鑾峰彇杩欎釜鏈堜唤鐨勯儴闂ㄦ暟鎹紝褰曞儚鐢变簬鏄墠涓�澶╃殑鎵�浠ヤ笉鐢╟reateTime瀛楁 + Query videoQuery = new Query(Criteria.where("statTime").gte(start).lt(end)); + videoQuery.addCriteria(Criteria.where("no").in(deviceIds)); //鏈堜唤姣忔棩褰曞儚绾挎暟鎹� - List<RecordMetaDSumResult> recordResult = mongoTemplate.find(query, RecordMetaDSumResult.class); - //鍏ㄩ噺琛� - List<VideoDailyExp> totalExps = new ArrayList<>(); + List<RecordMetaDSumResult> recordResult = mongoTemplate.find(videoQuery, RecordMetaDSumResult.class); + + // 棰勫厛鎸夐儴闂↖D鍒嗙粍 + Map<Integer, List<TMonitorResult>> monitorsByDept = tMonitorResults.stream() + .collect(Collectors.groupingBy(TMonitorResult::getDeptId)); + // 棰勫厛鏋勫缓鏄犲皠 + Map<String, List<RecordMetaDSumResult>> recordMap = recordResult.stream() + .collect(Collectors.groupingBy(RecordMetaDSumResult::getNo)); + List<CompletableFuture<List<VideoDailyExp>>> futures = new ArrayList<>(); for (Integer deptId : exportForm.getDeptIds()) { - List<VideoDailyExp> videoDailyExps = new ArrayList<>(); - //浠庢暟鎹簱闆嗗悎绛涢�夐儴闂ㄦ暟鎹� - List<TMonitorResult> monitors = tMonitorResults.stream().filter(tMonitorResult -> deptId.equals(tMonitorResult.getDeptId())).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(monitors)) continue; - List<String> ids = monitors.stream().map(BaseResult::getNo).collect(Collectors.toList()); - //绛涢�塵ongo鍖哄幙鏁版嵁 - List<RecordMetaDSumResult> records = recordResult.stream().filter(result -> ids.contains(result.getNo())).collect(Collectors.toList()); - AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromDept(deptId); - for (TMonitorResult result : monitors) { - VideoDailyExp videoDailyExp = new VideoDailyExp(); - videoDailyExp.setSerialNumber(result.getNo()); - videoDailyExp.setDeviceName(result.getName()); - videoDailyExp.setArea(areaDeptEnum == null ? "鏈煡" : areaDeptEnum.getName()); - StringBuilder tag = new StringBuilder("" + (result.getProvinceTag() ? "鐪佸巺銆�" : "") + (result.getImportantTag() ? "閲嶇偣鐐逛綅銆�" : "") + (result.getImportantCommandImageTag() ? "閲嶇偣鎸囨尌鍥惧儚銆�" : "") + (result.getDeptTag() ? "閮ㄧ骇銆�" : "")); - //鍔ㄦ�佸垪澶勭悊鍔犲湪鏍囩閲� - if(!CollectionUtils.isEmpty(result.getDynamicColumnList())){ - List<DynamicColumnVO> dynamicColumnList = result.getDynamicColumnList(); - for (DynamicColumnVO dynamicColumnVO : dynamicColumnList) { - tag.append(dynamicColumnVO.getColumnValue()).append("銆�"); + CompletableFuture<List<VideoDailyExp>> future = CompletableFuture.supplyAsync(() -> { + List<VideoDailyExp> videoDailyExps = new ArrayList<>(); + // 鑾峰彇褰撳墠閮ㄩ棬鐨勬暟鎹� + List<TMonitorResult> monitors = monitorsByDept.getOrDefault(deptId, Collections.emptyList()); + if (CollectionUtils.isEmpty(monitors)) return videoDailyExps; + AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromDept(deptId); + for (TMonitorResult result : monitors) { + VideoDailyExp videoDailyExp = new VideoDailyExp(); + videoDailyExp.setSerialNumber(result.getNo()); + videoDailyExp.setDeviceName(result.getName()); + videoDailyExp.setArea(areaDeptEnum == null ? "鏈煡" : areaDeptEnum.getName()); + StringBuilder tag = new StringBuilder("" + (result.getProvinceTag() ? "鐪佸巺銆�" : "") + (result.getImportantTag() ? "閲嶇偣鐐逛綅銆�" : "") + (result.getImportantCommandImageTag() ? "閲嶇偣鎸囨尌鍥惧儚銆�" : "") + (result.getDeptTag() ? "閮ㄧ骇銆�" : "")); + //鍔ㄦ�佸垪澶勭悊鍔犲湪鏍囩閲� + if (!CollectionUtils.isEmpty(result.getDynamicColumnList())) { + List<DynamicColumnVO> dynamicColumnList = result.getDynamicColumnList(); + for (DynamicColumnVO dynamicColumnVO : dynamicColumnList) { + tag.append(dynamicColumnVO.getColumnValue()).append("銆�"); + } } + // 鍒犻櫎瀛楃涓叉湯灏剧殑鈥溿�佲�� + if (tag.toString().endsWith("銆�")) { + tag = new StringBuilder(tag.substring(0, tag.length() - 1)); + } + videoDailyExp.setTag(tag.toString()); + // 浣跨敤Map鐩存帴鑾峰彇璁板綍锛岄伩鍏峟ilter鎿嶄綔 + List<RecordMetaDSumResult> recordsResult = recordMap.get(result.getNo()); + try { + if (!CollectionUtils.isEmpty(recordsResult)) + setRecordDaily(videoDailyExp, result, recordsResult); + } catch (Exception e) { + log.error(e.getMessage()); + } + //鍖哄幙琛� + videoDailyExps.add(videoDailyExp); } - // 鍒犻櫎瀛楃涓叉湯灏剧殑鈥溿�佲�� - if (tag.toString().endsWith("銆�")) { - tag = new StringBuilder(tag.substring(0, tag.length() - 1)); - } - videoDailyExp.setTag(tag.toString()); - setRecordDaily(videoDailyExp, result, records); - //鍖哄幙琛� - videoDailyExps.add(videoDailyExp); - //鍏ㄩ噺琛� - totalExps.add(videoDailyExp); - } - ExcelExp excelExp = new ExcelExp(areaDeptEnum == null ? "鏈煡" : areaDeptEnum.getName(), videoDailyExps, VideoDailyExp.class); - mysheet.add(excelExp); + return videoDailyExps; + }, threadPoolTaskExecutor); + futures.add(future); } + // 绛夊緟鎵�鏈変换鍔″畬鎴� + CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); + // 姣忎釜閮ㄩ棬鐨勬暟鎹崟鐙繚瀛� + List<List<VideoDailyExp>> results = futures.stream() + .map(CompletableFuture::join) // 鑾峰彇姣忎釜Future鐨勭粨鏋� + .collect(Collectors.toList()); + List<VideoDailyExp> totalExps = new ArrayList<>(); + List<ExcelExp> mysheet = new ArrayList<>(); + for (List<VideoDailyExp> result : results) { + ExcelExp excelExp = new ExcelExp( + result.get(0).getArea() == null ? "鏈煡" : result.get(0).getArea(), + result, + VideoDailyExp.class); + mysheet.add(excelExp); + totalExps.addAll(result); + } + ExcelExp excelExp = new ExcelExp("鍏ㄩ噺", totalExps, VideoDailyExp.class); mysheet.add(excelExp); ExcelUtilManySheet<List<ExcelExp>> util = new ExcelUtilManySheet<>(mysheet); @@ -655,22 +803,30 @@ @Override public void exportVideoLoseTime(HttpServletResponse response, VideoExportForm exportForm) throws NoSuchFieldException, IllegalAccessException, IOException { //榛樿鏌ユ墍鏈夐儴闂� - if(CollectionUtils.isEmpty(exportForm.getDeptIds())){ + if (CollectionUtils.isEmpty(exportForm.getDeptIds())) { List<Integer> deptIds = new ArrayList<>(); for (AreaDeptEnum value : AreaDeptEnum.values()) { deptIds.add(value.getDeptId()); } exportForm.setDeptIds(deptIds); } - List<ExcelExp> mysheet = new ArrayList<>(); - exportForm.setCameraFunType(Integer.valueOf(CheckConstants.Rule_Category_Video + "")); - VideoExportForm.convertTags(exportForm); - List<TMonitorResult> tMonitorResults = tMonitorMapper.selectMonitorResult(exportForm); + Query query = getQuery(exportForm); + //鏈堜唤姣忔棩鍦ㄧ嚎鏁版嵁 + List<TMonitorResult> onlineResult = mongoTemplate.find(query, TMonitorResult.class); + // 浣跨敤 Collectors.toMap 鍘婚噸锛屼繚鐣欐瘡涓� No 鐨勭涓�涓亣鍒扮殑鍏冪礌 + Map<String, TMonitorResult> uniqueResultsMap = onlineResult.stream() + .collect(Collectors.toMap( + TMonitorResult::getNo, // keyMapper锛岃繖閲屽亣璁� getNo() 杩斿洖 No 瀛楁 + Function.identity(), // valueMapper锛岀洿鎺ヤ娇鐢ㄥ璞℃湰韬� + (existing, replacement) -> existing // mergeFunction锛屽鏋滄湁閲嶅锛屼繚鐣欑涓�涓� + )); + // 灏� Map 杞崲涓� List + List<TMonitorResult> tMonitorResults = new ArrayList<>(uniqueResultsMap.values()); //鑾峰彇鍔ㄦ�佸垪鏁版嵁 List<Integer> pointIds = tMonitorResults.stream().map(TMonitorResult::getPointId).collect(Collectors.toList()); List<DynamicColumnVO> dynamics = dynamicColumnMapper.getDynamicsByIds("t_yw_point", pointIds); //琛ュ厖鍔ㄦ�佸垪鏁版嵁 - if(!CollectionUtils.isEmpty(dynamics)) { + if (!CollectionUtils.isEmpty(dynamics)) { Map<Integer, List<DynamicColumnVO>> map = dynamics.stream().collect(Collectors.groupingBy(DynamicColumnVO::getRefId)); for (TMonitorResult tMonitorResult : tMonitorResults) { Integer pointId = tMonitorResult.getPointId(); @@ -678,45 +834,80 @@ } } List<String> deviceIds = tMonitorResults.stream().map(BaseResult::getNo).collect(Collectors.toList()); - Query query = getQuery(deviceIds, exportForm.getMonth()); + // 灏嗗勾鏈堝瓧绗︿覆瑙f瀽涓篩earMonth瀵硅薄 + YearMonth yearMonth = YearMonth.parse(exportForm.getMonth()); + // 鑾峰彇褰撴湀鐨勭涓�澶� + LocalDate start = yearMonth.atDay(1); + // 鑾峰彇涓嬩釜鏈堢殑绗竴澶╋紙閫氳繃鍔犱笂1涓湀骞惰缃棩涓�1锛� + YearMonth nextMonth = yearMonth.plusMonths(1); + LocalDate end = nextMonth.atDay(1); + //鑾峰彇杩欎釜鏈堜唤鐨勯儴闂ㄦ暟鎹紝褰曞儚鐢变簬鏄墠涓�澶╃殑鎵�浠ヤ笉鐢╟reateTime瀛楁 + Query videoQuery = new Query(Criteria.where("statTime").gte(start).lt(end)); + videoQuery.addCriteria(Criteria.where("no").in(deviceIds)); //鏈堜唤姣忔棩褰曞儚绾挎暟鎹� - List<RecordMetaDSumResult> recordResult = mongoTemplate.find(query, RecordMetaDSumResult.class); - //鍏ㄩ噺琛� - List<VideoDailyExp> totalExps = new ArrayList<>(); + List<RecordMetaDSumResult> recordResult = mongoTemplate.find(videoQuery, RecordMetaDSumResult.class); + // 棰勫厛鎸夐儴闂↖D鍒嗙粍 + Map<Integer, List<TMonitorResult>> monitorsByDept = tMonitorResults.stream() + .collect(Collectors.groupingBy(TMonitorResult::getDeptId)); + // 棰勫厛鏋勫缓鏄犲皠 + Map<String, List<RecordMetaDSumResult>> recordMap = recordResult.stream() + .collect(Collectors.groupingBy(RecordMetaDSumResult::getNo)); + + List<CompletableFuture<List<VideoDailyExp>>> futures = new ArrayList<>(); for (Integer deptId : exportForm.getDeptIds()) { - List<VideoDailyExp> videoDailyExps = new ArrayList<>(); - //浠庢暟鎹簱闆嗗悎绛涢�夐儴闂ㄦ暟鎹� - List<TMonitorResult> monitors = tMonitorResults.stream().filter(tMonitorResult -> deptId.equals(tMonitorResult.getDeptId())).collect(Collectors.toList()); - if (CollectionUtils.isEmpty(monitors)) continue; - List<String> ids = monitors.stream().map(BaseResult::getNo).collect(Collectors.toList()); - //绛涢�塵ongo鍖哄幙鏁版嵁 - List<RecordMetaDSumResult> records = recordResult.stream().filter(result -> ids.contains(result.getNo())).collect(Collectors.toList()); - AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromDept(deptId); - for (TMonitorResult result : monitors) { - VideoDailyExp videoDailyExp = new VideoDailyExp(); - videoDailyExp.setSerialNumber(result.getNo()); - videoDailyExp.setDeviceName(result.getName()); - videoDailyExp.setArea(areaDeptEnum == null ? "鏈煡" : areaDeptEnum.getName()); - StringBuilder tag = new StringBuilder("" + (result.getProvinceTag() ? "鐪佸巺銆�" : "") + (result.getImportantTag() ? "閲嶇偣鐐逛綅銆�" : "") + (result.getImportantCommandImageTag() ? "閲嶇偣鎸囨尌鍥惧儚銆�" : "") + (result.getDeptTag() ? "閮ㄧ骇銆�" : "")); - //鍔ㄦ�佸垪澶勭悊鍔犲湪鏍囩閲� - if(!CollectionUtils.isEmpty(result.getDynamicColumnList())){ - List<DynamicColumnVO> dynamicColumnList = result.getDynamicColumnList(); - for (DynamicColumnVO dynamicColumnVO : dynamicColumnList) { - tag.append(dynamicColumnVO.getColumnValue()).append("銆�"); + CompletableFuture<List<VideoDailyExp>> future = CompletableFuture.supplyAsync(() -> { + List<VideoDailyExp> videoDailyExps = new ArrayList<>(); + // 鑾峰彇褰撳墠閮ㄩ棬鐨勬暟鎹� + List<TMonitorResult> monitors = monitorsByDept.getOrDefault(deptId, Collections.emptyList()); + if (CollectionUtils.isEmpty(monitors)) return videoDailyExps; + AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromDept(deptId); + for (TMonitorResult result : monitors) { + VideoDailyExp videoDailyExp = new VideoDailyExp(); + videoDailyExp.setSerialNumber(result.getNo()); + videoDailyExp.setDeviceName(result.getName()); + videoDailyExp.setArea(areaDeptEnum == null ? "鏈煡" : areaDeptEnum.getName()); + StringBuilder tag = new StringBuilder("" + (result.getProvinceTag() ? "鐪佸巺銆�" : "") + (result.getImportantTag() ? "閲嶇偣鐐逛綅銆�" : "") + (result.getImportantCommandImageTag() ? "閲嶇偣鎸囨尌鍥惧儚銆�" : "") + (result.getDeptTag() ? "閮ㄧ骇銆�" : "")); + //鍔ㄦ�佸垪澶勭悊鍔犲湪鏍囩閲� + if (!CollectionUtils.isEmpty(result.getDynamicColumnList())) { + List<DynamicColumnVO> dynamicColumnList = result.getDynamicColumnList(); + for (DynamicColumnVO dynamicColumnVO : dynamicColumnList) { + tag.append(dynamicColumnVO.getColumnValue()).append("銆�"); + } } + // 鍒犻櫎瀛楃涓叉湯灏剧殑鈥溿�佲�� + if (tag.toString().endsWith("銆�")) { + tag = new StringBuilder(tag.substring(0, tag.length() - 1)); + } + videoDailyExp.setTag(tag.toString()); + // 浣跨敤Map鐩存帴鑾峰彇璁板綍锛岄伩鍏峟ilter鎿嶄綔 + List<RecordMetaDSumResult> recordsResult = recordMap.get(result.getNo()); + try { + if (!CollectionUtils.isEmpty(recordsResult)) setLoseDaily(videoDailyExp, recordsResult); + } catch (Exception e) { + log.error(e.getMessage()); + } + videoDailyExps.add(videoDailyExp); } - // 鍒犻櫎瀛楃涓叉湯灏剧殑鈥溿�佲�� - if (tag.toString().endsWith("銆�")) { - tag = new StringBuilder(tag.substring(0, tag.length() - 1)); - } - videoDailyExp.setTag(tag.toString()); - setLoseDaily(videoDailyExp, result, records); - videoDailyExps.add(videoDailyExp); - //鍏ㄩ噺琛� - totalExps.add(videoDailyExp); - } - ExcelExp excelExp = new ExcelExp(areaDeptEnum == null ? "鏈煡" : areaDeptEnum.getName(), videoDailyExps, VideoDailyExp.class); + return videoDailyExps; + }, threadPoolTaskExecutor); + futures.add(future); + } + // 绛夊緟鎵�鏈変换鍔″畬鎴� + CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join(); + + // 姣忎釜閮ㄩ棬鐨勬暟鎹崟鐙繚瀛� + List<List<VideoDailyExp>> results = futures.stream() + .map(CompletableFuture::join) // 鑾峰彇姣忎釜Future鐨勭粨鏋� + .collect(Collectors.toList()); + List<VideoDailyExp> totalExps = new ArrayList<>(); + List<ExcelExp> mysheet = new ArrayList<>(); + for (List<VideoDailyExp> result : results) { + ExcelExp excelExp = new ExcelExp( + result.get(0).getArea() == null ? "鏈煡" : result.get(0).getArea(), + result, + VideoDailyExp.class); mysheet.add(excelExp); + totalExps.addAll(result); } ExcelExp excelExp = new ExcelExp("鍏ㄩ噺", totalExps, VideoDailyExp.class); mysheet.add(excelExp); @@ -754,7 +945,7 @@ MongoDatabase database = mongoTemplate.getDb(); MongoCollection<Document> collection = database.getCollection("uy_record_meta_d_sum"); Integer examineTag = monitorQuery.getExamineTag(); - Document matchConditions = new Document("mongoCreateTime", new Document("$gte", startDate).append("$lte", endDate)); + Document matchConditions = new Document("statTime", new Document("$gte", startDate).append("$lte", endDate)); // 鏍规嵁examineTag鐨勫�煎姩鎬佹坊鍔犻澶栫殑鏉′欢 if (examineTag != null && examineTag.equals(1)) { matchConditions.append("provinceTag", true); @@ -764,7 +955,7 @@ // 鏋勫缓鑱氬悎绠¢亾 List<Document> pipeline = Arrays.asList( new Document("$match", matchConditions), - new Document("$group", new Document("_id", "$mongoCreateTime") + new Document("$group", new Document("_id", "$statTime") .append("normalCount", new Document("$sum", new Document("$cond", Arrays.asList( new Document("$eq", Arrays.asList("$recordStatus", 1)), @@ -774,7 +965,7 @@ )) .append("loseCount", new Document("$sum", new Document("$cond", Arrays.asList( - new Document("$eq", Arrays.asList("$recordStatus", -1)), + new Document("$in", Arrays.asList("$recordStatus", Arrays.asList(-1, 0))), 1, 0 )) @@ -809,7 +1000,7 @@ new Document("$group", new Document("_id", "$mongoCreateTime") .append("onlineCount", new Document("$sum", new Document("$cond", Arrays.asList( - new Document("$eq", Arrays.asList("$online", Boolean.TRUE)), + new Document("$eq", Arrays.asList("$online", ApiConstants.UY_OnlineSite_Online)), 1, 0 )) @@ -841,6 +1032,78 @@ resultMap.put("baseLine", Integer.valueOf(sysDictData.getDictValue())); } return resultMap; + } + + /** + * 鍒楄〃瀵煎嚭 + * + * @param response + * @param tMonitor + */ + @Override + public void export(HttpServletResponse response, TMonitorVO tMonitor) { + List<TMonitorExp> monitors = tMonitorMapper.exportTMonitorList(tMonitor); + //鑾峰彇鍔ㄦ�佸垪鏁版嵁 + List<Integer> pointIds = monitors.stream().map(TMonitorExp::getPointId).collect(Collectors.toList()); + List<DynamicColumnVO> dynamics = dynamicColumnMapper.getDynamicsByIds("t_yw_point", pointIds); + //琛ュ厖鍔ㄦ�佸垪鏁版嵁 + if (!CollectionUtils.isEmpty(dynamics)) { + Map<Integer, List<DynamicColumnVO>> map = dynamics.stream().collect(Collectors.groupingBy(DynamicColumnVO::getRefId)); + for (TMonitorExp tMonitorResult : monitors) { + Integer pointId = tMonitorResult.getPointId(); + tMonitorResult.setDynamicColumnList(map.get(pointId)); + } + } + monitors.forEach(monitor -> { + String cameraFunType = monitor.getCameraFunType(); + if (!StringUtils.isEmpty(cameraFunType)) { + String video = cameraFunType.replaceAll("1", "瑙嗛"); + String car = video.replaceAll("2", "杞﹁締"); + String type = car.replaceAll("3", "浜鸿劯"); + monitor.setCameraFunType(type); + } + StringBuilder tag = new StringBuilder("" + (monitor.getProvinceTagVideo() ? "鐪佸巺瑙嗛銆�" : "") + (monitor.getProvinceTagCar() ? "鐪佸巺杞﹁締銆�" : "") + (monitor.getProvinceTagFace() ? "鐪佸巺浜鸿劯銆�" : "") + (monitor.getImportantTag() ? "閲嶇偣鐐逛綅銆�" : "") + (monitor.getImportantCommandImageTag() ? "閲嶇偣鎸囨尌鍥惧儚銆�" : "") + (monitor.getDeptTag() ? "閮ㄧ骇銆�" : "")); + //鍔ㄦ�佸垪澶勭悊鍔犲湪鏍囩閲� + if (!CollectionUtils.isEmpty(monitor.getDynamicColumnList())) { + List<DynamicColumnVO> dynamicColumnList = monitor.getDynamicColumnList(); + for (DynamicColumnVO dynamicColumnVO : dynamicColumnList) { + tag.append(dynamicColumnVO.getColumnValue()).append("銆�"); + } + } + // 鍒犻櫎瀛楃涓叉湯灏剧殑鈥溿�佲�� + if (tag.toString().endsWith("銆�")) { + tag = new StringBuilder(tag.substring(0, tag.length() - 1)); + } + monitor.setTag(tag.toString()); + }); + ExcelUtil<TMonitorExp> util = new ExcelUtil<>(TMonitorExp.class); + String sheetName = ""; + if ("1".equals(tMonitor.getCameraFunType())) { + sheetName = "瑙嗛"; + } else if ("2".equals(tMonitor.getCameraFunType())) { + sheetName = "杞﹁締"; + } else if ("3".equals(tMonitor.getCameraFunType())) { + sheetName = "浜鸿劯"; + } + util.exportExcel(response, monitors, sheetName); + } + + /** + * 娓呯悊涓�鏈轰竴妗� + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public Result clearMonitor() { + tMonitorMapper.clearMonitor(); + pointMapper.clearMonitor(); + return Result.ok(); + } + + @Override + public Result assetManagementCount(DataCenterQuery query) { + Map<String, String> map =tMonitorMapper.assetManagementCount(); + return Result.ok().data(map); } @@ -896,7 +1159,6 @@ results.add(homecarVO); } - //TODO锛氬湪绾夸慨鏀癸紝闇�瑕佹妸妫�娴嬫捣搴蜂紭浜戞娴嬬殑缁撴灉瀛樺叆mongo锛宮ongo鏌ョ偣浣嶅湪绾� MongoCollection<Document> onlineCollection = database.getCollection("t_monitor_online"); // 鏋勫缓鍩烘湰鐨�$match鏉′欢 List<Document> onlineMatch = new ArrayList<>(); @@ -911,7 +1173,7 @@ new Document("$group", new Document("_id", "$mongoCreateTime") .append("onlineCount", new Document("$sum", new Document("$cond", Arrays.asList( - new Document("$eq", Arrays.asList("$online", Boolean.TRUE)), + new Document("$eq", Arrays.asList("$online", ApiConstants.UY_OnlineSite_Online)), 1, 0 )) @@ -927,30 +1189,33 @@ Map<String, Object> resultMap = new HashMap<>(); //鎸夋椂闂存帓搴� results = results.stream().sorted(Comparator.comparing(BaseHomeVO::getCreateDate)).collect(Collectors.toList()); - int snapCount = 0; - for (HomeCarVO vo : results) { - if (vo.getSnapCount() != null) { - snapCount += vo.getSnapCount(); + //濡傛灉鏄粯璁ゆ垨绱拰鍒欒繘琛岀疮鍜屼互鍙婅幏鍙栧熀鍑嗙嚎 + if (monitorQuery.getCategory() == null || monitorQuery.getCategory().equals(1)) { + int snapCount = 0; + for (HomeCarVO vo : results) { + if (vo.getSnapCount() != null) { + snapCount += vo.getSnapCount(); + } + vo.setSnapCount(snapCount); } - vo.setSnapCount(snapCount); + //浠庡瓧鍏歌幏鍙栧熀鍑嗙嚎 + List<SysDictData> baseLines = dictDataMapper.selectDictDataByType("home_baseLine"); + String condition; + if (examineTag != null && examineTag == 1) { + condition = "car_province_baseLine"; + } else if (examineTag != null && examineTag == 2) { + condition = "car_dept_baseLine"; + } else { + condition = "car_all_baseLine"; + } + + Optional<SysDictData> first = baseLines.stream().filter(sysDictData -> condition.equals(sysDictData.getDictLabel())).findFirst(); + if (first.isPresent()) { + SysDictData sysDictData = first.get(); + resultMap.put("baseLine", Integer.valueOf(sysDictData.getDictValue())); + } } resultMap.put("list", results); - //浠庡瓧鍏歌幏鍙栧熀鍑嗙嚎 - List<SysDictData> baseLines = dictDataMapper.selectDictDataByType("home_baseLine"); - String condition; - if (examineTag != null && examineTag == 1) { - condition = "car_province_baseLine"; - } else if (examineTag != null && examineTag == 2) { - condition = "car_dept_baseLine"; - } else { - condition = "car_all_baseLine"; - } - - Optional<SysDictData> first = baseLines.stream().filter(sysDictData -> condition.equals(sysDictData.getDictLabel())).findFirst(); - if (first.isPresent()) { - SysDictData sysDictData = first.get(); - resultMap.put("baseLine", Integer.valueOf(sysDictData.getDictValue())); - } return resultMap; } @@ -1022,7 +1287,7 @@ new Document("$group", new Document("_id", "$mongoCreateTime") .append("onlineCount", new Document("$sum", new Document("$cond", Arrays.asList( - new Document("$eq", Arrays.asList("$online", Boolean.TRUE)), + new Document("$eq", Arrays.asList("$online", ApiConstants.UY_OnlineSite_Online)), 1, 0 )) @@ -1035,32 +1300,35 @@ HomeFaceVO vo = findOrCreateVO(doc, results, HomeFaceVO.class); vo.setOnline(doc.getInteger("onlineCount")); } + Map<String, Object> resultMap = new HashMap<>(); //鎸夋椂闂存帓搴� results = results.stream().sorted(Comparator.comparing(BaseHomeVO::getCreateDate)).collect(Collectors.toList()); - int snapCount = 0; - for (HomeFaceVO vo : results) { - if (vo.getSnapCount() != null) { - snapCount += vo.getSnapCount(); + //濡傛灉鏄粯璁ゆ垨绱拰鍒欒繘琛岀疮鍜屼互鍙婅幏鍙栧熀鍑嗙嚎 + if (monitorQuery.getCategory() == null || monitorQuery.getCategory().equals(1)) { + int snapCount = 0; + for (HomeFaceVO vo : results) { + if (vo.getSnapCount() != null) { + snapCount += vo.getSnapCount(); + } + vo.setSnapCount(snapCount); } - vo.setSnapCount(snapCount); + //浠庡瓧鍏歌幏鍙栧熀鍑嗙嚎 + List<SysDictData> baseLines = dictDataMapper.selectDictDataByType("home_baseLine"); + String condition; + if (examineTag != null && examineTag == 1) { + condition = "face_province_baseLine"; + } else if (examineTag != null && examineTag == 2) { + condition = "face_dept_baseLine"; + } else { + condition = "face_all_baseLine"; + } + Optional<SysDictData> first = baseLines.stream().filter(sysDictData -> condition.equals(sysDictData.getDictLabel())).findFirst(); + if (first.isPresent()) { + SysDictData sysDictData = first.get(); + resultMap.put("baseLine", Integer.valueOf(sysDictData.getDictValue())); + } } - Map<String, Object> resultMap = new HashMap<>(); resultMap.put("list", results); - //浠庡瓧鍏歌幏鍙栧熀鍑嗙嚎 - List<SysDictData> baseLines = dictDataMapper.selectDictDataByType("home_baseLine"); - String condition; - if (examineTag != null && examineTag == 1) { - condition = "face_province_baseLine"; - } else if (examineTag != null && examineTag == 2) { - condition = "face_dept_baseLine"; - } else { - condition = "face_all_baseLine"; - } - Optional<SysDictData> first = baseLines.stream().filter(sysDictData -> condition.equals(sysDictData.getDictLabel())).findFirst(); - if (first.isPresent()) { - SysDictData sysDictData = first.get(); - resultMap.put("baseLine", Integer.valueOf(sysDictData.getDictValue())); - } return resultMap; } @@ -1078,7 +1346,8 @@ return vo; } - private Query getQuery(List<String> deviceIds, String month) { + private Query getQuery(VideoExportForm exportForm) { + String month = exportForm.getMonth(); // 灏嗗勾鏈堝瓧绗︿覆瑙f瀽涓篩earMonth瀵硅薄 YearMonth yearMonth = YearMonth.parse(month); // 鑾峰彇褰撴湀鐨勭涓�澶� @@ -1088,7 +1357,15 @@ LocalDate end = nextMonth.atDay(1); //鑾峰彇杩欎釜鏈堜唤鐨勯儴闂ㄦ暟鎹� Query query = new Query(Criteria.where("mongoCreateTime").gte(start).lt(end)); - query.addCriteria(Criteria.where("no").in(deviceIds)); + if (!CollectionUtils.isEmpty(exportForm.getDeptIds())) + query.addCriteria(Criteria.where("deptId").in(exportForm.getDeptIds())); + if (exportForm.getDeptTag() != null) query.addCriteria(Criteria.where("deptTag").is(exportForm.getDeptTag())); + if (exportForm.getProvinceTag() != null) + query.addCriteria(Criteria.where("provinceTag").is(exportForm.getProvinceTag())); + if (exportForm.getImportantTag() != null) + query.addCriteria(Criteria.where("importantTag").is(exportForm.getImportantTag())); + if (exportForm.getImportantCommandImageTag() != null) + query.addCriteria(Criteria.where("importantCommandImageTag").is(exportForm.getImportantCommandImageTag())); return query; } @@ -1099,7 +1376,13 @@ for (TMonitorResult monitorResult : onlineResult) { int dayOfMonth = monitorResult.getMongoCreateTime().getDayOfMonth(); String online = ""; - online += monitorResult.getPingOnline() ? "鍦ㄧ嚎" : "绂荤嚎"; + if (ApiConstants.UY_OnlineSite_Online.equals(monitorResult.getOnline())) { + online += "鍦ㄧ嚎"; + } else if (ApiConstants.UY_OnlineSite_Offline.equals(monitorResult.getOnline())) { + online += "绂荤嚎"; + } else { + online += "鏈煡"; + } //鍙嶅皠璧嬪�硷紝瀛楁缁熶竴瀹氫箟涓篸ay+1锛�2锛�3... Field field = videoDailyExp.getClass().getDeclaredField("day" + dayOfMonth); field.setAccessible(true); @@ -1108,11 +1391,9 @@ } //璁剧疆姣忔棩褰曞儚鏁版嵁 - private void setRecordDaily(VideoDailyExp videoDailyExp, TMonitorResult result, List<RecordMetaDSumResult> records) throws NoSuchFieldException, IllegalAccessException { - //涓�涓澶囧綋鏈堝湪绾挎儏鍐� - List<RecordMetaDSumResult> recordResults = records.stream().filter(online -> online.getNo().equals(result.getNo())).collect(Collectors.toList()); + private void setRecordDaily(VideoDailyExp videoDailyExp, TMonitorResult result, List<RecordMetaDSumResult> recordResults) throws NoSuchFieldException, IllegalAccessException { for (RecordMetaDSumResult recordResult : recordResults) { - int dayOfMonth = recordResult.getMongoCreateTime().getDayOfMonth(); + int dayOfMonth = DateUtils.getDayOfMonth(recordResult.getStatTime()); Integer status = recordResult.getRecordStatus(); String text = ""; if (ApiConstants.UY_RecordStatus_Interval.equals(status)) { @@ -1130,11 +1411,10 @@ } //璁剧疆姣忔棩褰曞儚缂哄け鏃堕暱鏁版嵁 - private void setLoseDaily(VideoDailyExp videoDailyExp, TMonitorResult result, List<RecordMetaDSumResult> records) throws NoSuchFieldException, IllegalAccessException { + private void setLoseDaily(VideoDailyExp videoDailyExp, List<RecordMetaDSumResult> recordResults) throws NoSuchFieldException, IllegalAccessException { //涓�涓澶囧綋鏈堝湪绾挎儏鍐� - List<RecordMetaDSumResult> recordResults = records.stream().filter(online -> online.getNo().equals(result.getNo())).collect(Collectors.toList()); for (RecordMetaDSumResult recordResult : recordResults) { - int dayOfMonth = recordResult.getMongoCreateTime().getDayOfMonth(); + int dayOfMonth = DateUtils.getDayOfMonth(recordResult.getStatTime()); //鍙嶅皠璧嬪�硷紝瀛楁缁熶竴瀹氫箟涓篸ay+1锛�2锛�3... Field field = videoDailyExp.getClass().getDeclaredField("day" + dayOfMonth); field.setAccessible(true); -- Gitblit v1.8.0