| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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; |
| | | |
| | | /** |
| | |
| | | @Autowired |
| | | private TMonitorMapper tMonitorMapper; |
| | | @Autowired |
| | | private YwPointMapper pointMapper; |
| | | @Autowired |
| | | private ISysConfigService configService; |
| | | @Autowired |
| | | private MongoTemplate mongoTemplate; |
| | |
| | | private SysDictDataMapper dictDataMapper; |
| | | @Autowired |
| | | private DynamicColumnMapper dynamicColumnMapper; |
| | | @Autowired |
| | | private ThreadPoolTaskExecutor threadPoolTaskExecutor; |
| | | |
| | | /** |
| | | * 查询设备资产 |
| | |
| | | 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()); |
| | |
| | | return tMonitorMapper.recoveryException(monitor); |
| | | } |
| | | |
| | | /** |
| | | * 查mongo查某个月设备总数 |
| | | * 查看工单数量查看异常的数 |
| | | * |
| | | * @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<>(); |
| | |
| | | @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静态方法,把list转为线程安全的list |
| | | 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()); |
| | | // 将年月字符串解析为YearMonth对象 |
| | | YearMonth yearMonth = YearMonth.parse(exportForm.getMonth()); |
| | | // 获取当月的第一天 |
| | | LocalDate start = yearMonth.atDay(1); |
| | | // 获取下个月的第一天(通过加上1个月并设置日为1) |
| | | YearMonth nextMonth = yearMonth.plusMonths(1); |
| | | LocalDate end = nextMonth.atDay(1); |
| | | //获取这个月份的部门数据,录像由于是前一天的所以不用createTime字段 |
| | | 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 = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"}; |
| | | // 创建一个Map来存储每天的累加数据 |
| | | Map<String, VideoTotalExp> totalMap = new HashMap<>(); |
| | | Map<String, VideoTotalExp> totalMap = new ConcurrentHashMap<>(); |
| | | List<CompletableFuture<Void>> futures = new ArrayList<>(); |
| | | //一个部门一个sheet |
| | | 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()); |
| | | 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()); |
| | | 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()); |
| | |
| | | @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静态方法,把list转为线程安全的list |
| | | 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()); |
| | | //筛选mongo区县数据 |
| | | 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()); |
| | | //筛选mongo区县数据 |
| | | 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); |
| | |
| | | @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()); |
| | | |
| | | // 将年月字符串解析为YearMonth对象 |
| | | YearMonth yearMonth = YearMonth.parse(exportForm.getMonth()); |
| | | // 获取当月的第一天 |
| | | LocalDate start = yearMonth.atDay(1); |
| | | // 获取下个月的第一天(通过加上1个月并设置日为1) |
| | | YearMonth nextMonth = yearMonth.plusMonths(1); |
| | | LocalDate end = nextMonth.atDay(1); |
| | | //获取这个月份的部门数据,录像由于是前一天的所以不用createTime字段 |
| | | 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); |
| | | |
| | | // 预先按部门ID分组 |
| | | 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()); |
| | | //筛选mongo区县数据 |
| | | 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直接获取记录,避免filter操作 |
| | | 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); |
| | |
| | | @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(); |
| | |
| | | } |
| | | } |
| | | List<String> deviceIds = tMonitorResults.stream().map(BaseResult::getNo).collect(Collectors.toList()); |
| | | Query query = getQuery(deviceIds, exportForm.getMonth()); |
| | | // 将年月字符串解析为YearMonth对象 |
| | | YearMonth yearMonth = YearMonth.parse(exportForm.getMonth()); |
| | | // 获取当月的第一天 |
| | | LocalDate start = yearMonth.atDay(1); |
| | | // 获取下个月的第一天(通过加上1个月并设置日为1) |
| | | YearMonth nextMonth = yearMonth.plusMonths(1); |
| | | LocalDate end = nextMonth.atDay(1); |
| | | //获取这个月份的部门数据,录像由于是前一天的所以不用createTime字段 |
| | | 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); |
| | | // 预先按部门ID分组 |
| | | 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()); |
| | | //筛选mongo区县数据 |
| | | 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直接获取记录,避免filter操作 |
| | | 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); |
| | |
| | | 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); |
| | |
| | | // 构建聚合管道 |
| | | 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)), |
| | |
| | | )) |
| | | .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 |
| | | )) |
| | |
| | | new Document("$group", new Document("_id", "$mongoCreateTime") |
| | | .append("onlineCount", new Document("$sum", |
| | | new Document("$cond", Arrays.asList( |
| | | new Document("$eq", Arrays.asList("$online",ApiConstants.UY_OnlineSite_Online)), |
| | | new Document("$eq", Arrays.asList("$online", ApiConstants.UY_OnlineSite_Online)), |
| | | 1, |
| | | 0 |
| | | )) |
| | |
| | | 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); |
| | | } |
| | | |
| | | |
| | |
| | | results.add(homecarVO); |
| | | } |
| | | |
| | | //TODO:在线修改,需要把检测海康优云检测的结果存入mongo,mongo查点位在线 |
| | | MongoCollection<Document> onlineCollection = database.getCollection("t_monitor_online"); |
| | | // 构建基本的$match条件 |
| | | List<Document> onlineMatch = new ArrayList<>(); |
| | |
| | | new Document("$group", new Document("_id", "$mongoCreateTime") |
| | | .append("onlineCount", new Document("$sum", |
| | | new Document("$cond", Arrays.asList( |
| | | new Document("$eq", Arrays.asList("$online",ApiConstants.UY_OnlineSite_Online)), |
| | | new Document("$eq", Arrays.asList("$online", ApiConstants.UY_OnlineSite_Online)), |
| | | 1, |
| | | 0 |
| | | )) |
| | |
| | | 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; |
| | | } |
| | | |
| | |
| | | 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; |
| | | } |
| | | |
| | |
| | | return vo; |
| | | } |
| | | |
| | | private Query getQuery(List<String> deviceIds, String month) { |
| | | private Query getQuery(VideoExportForm exportForm) { |
| | | String month = exportForm.getMonth(); |
| | | // 将年月字符串解析为YearMonth对象 |
| | | YearMonth yearMonth = YearMonth.parse(month); |
| | | // 获取当月的第一天 |
| | |
| | | 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; |
| | | } |
| | | |
| | |
| | | for (TMonitorResult monitorResult : onlineResult) { |
| | | int dayOfMonth = monitorResult.getMongoCreateTime().getDayOfMonth(); |
| | | String online = ""; |
| | | if(ApiConstants.UY_OnlineSite_Online.equals(monitorResult.getOnline())){ |
| | | online +="在线"; |
| | | }else if(ApiConstants.UY_OnlineSite_Offline.equals(monitorResult.getOnline())){ |
| | | online +="离线"; |
| | | }else { |
| | | online +="未知"; |
| | | if (ApiConstants.UY_OnlineSite_Online.equals(monitorResult.getOnline())) { |
| | | online += "在线"; |
| | | } else if (ApiConstants.UY_OnlineSite_Offline.equals(monitorResult.getOnline())) { |
| | | online += "离线"; |
| | | } else { |
| | | online += "未知"; |
| | | } |
| | | //反射赋值,字段统一定义为day+1,2,3... |
| | | Field field = videoDailyExp.getClass().getDeclaredField("day" + dayOfMonth); |
| | |
| | | } |
| | | |
| | | //设置每日录像数据 |
| | | 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)) { |
| | |
| | | } |
| | | |
| | | //设置每日录像缺失时长数据 |
| | | 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()); |
| | | //反射赋值,字段统一定义为day+1,2,3... |
| | | Field field = videoDailyExp.getClass().getDeclaredField("day" + dayOfMonth); |
| | | field.setAccessible(true); |