ycl-pojo/src/main/java/com/ycl/platform/domain/excel/VideoDailyExp.java
New file @@ -0,0 +1,149 @@ package com.ycl.platform.domain.excel; import annotation.Excel; import lombok.Data; @Data public class VideoDailyExp { /** 设备编号 */ @Excel(name = "设备编号",width = 20) private String serialNumber; /** 设备名称 */ @Excel(name = "设备名称",width = 20) private String deviceName; /** 标签 */ @Excel(name = "标签") private String tag; /** 区域 */ @Excel(name = "区域") private String area; /** 日期 */ @Excel(name = "1",width = 10) private String day1; /** 日期 */ @Excel(name = "2",width = 10) private String day2; /** 日期 */ @Excel(name = "3",width = 10) private String day3; /** 日期 */ @Excel(name = "4",width = 10) private String day4; /** 日期 */ @Excel(name = "5",width = 10) private String day5; /** 日期 */ @Excel(name = "6",width = 10) private String day6; /** 日期 */ @Excel(name = "7",width = 10) private String day7; /** 日期 */ @Excel(name = "8",width = 10) private String day8; /** 日期 */ @Excel(name = "9",width = 10) private String day9; /** 日期 */ @Excel(name = "10",width = 10) private String day10; /** 日期 */ @Excel(name = "11",width = 10) private String day11; /** 日期 */ @Excel(name = "12",width = 10) private String day12; /** 日期 */ @Excel(name = "13",width = 10) private String day13; /** 日期 */ @Excel(name = "14",width = 10) private String day14; /** 日期 */ @Excel(name = "15",width = 10) private String day15; /** 日期 */ @Excel(name = "16",width = 10) private String day16; /** 日期 */ @Excel(name = "17",width = 10) private String day17; /** 日期 */ @Excel(name = "18",width = 10) private String day18; /** 日期 */ @Excel(name = "19",width = 10) private String day19; /** 日期 */ @Excel(name = "20",width = 10) private String day20; /** 日期 */ @Excel(name = "21",width = 10) private String day21; /** 日期 */ @Excel(name = "22",width = 10) private String day22; /** 日期 */ @Excel(name = "23",width = 10) private String day23; /** 日期 */ @Excel(name = "24",width = 10) private String day24; /** 日期 */ @Excel(name = "25",width = 10) private String day25; /** 日期 */ @Excel(name = "26",width = 10) private String day26; /** 日期 */ @Excel(name = "27",width = 10) private String day27; /** 日期 */ @Excel(name = "28",width = 10) private String day28; /** 日期 */ @Excel(name = "29",width = 10) private String day29; /** 日期 */ @Excel(name = "30",width = 10) private String day30; /** 日期 */ @Excel(name = "31",width = 10) private String day31; } ycl-pojo/src/main/java/com/ycl/platform/domain/excel/VideoTotalExp.java
New file @@ -0,0 +1,35 @@ package com.ycl.platform.domain.excel; import annotation.Excel; import lombok.Data; @Data public class VideoTotalExp { /** 日期 */ @Excel(name = "日期") private String date; /** 星期 */ @Excel(name = "星期") private String week; /** 总量 */ @Excel(name = "总量") private Integer total; /** 在线 */ @Excel(name = "在线") private Integer online; /** 离线 */ @Excel(name = "离线") private Integer offline; /** 无存储 */ @Excel(name = "无存储") private Integer noStore; /** 部分存储 */ @Excel(name = "部分存储") private Integer partStore; } ycl-pojo/src/main/java/com/ycl/platform/domain/form/VideoExportForm.java
New file @@ -0,0 +1,15 @@ package com.ycl.platform.domain.form; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import lombok.Data; import java.util.List; @Data public class VideoExportForm { @NotBlank(message = "月份不能为空") private String month; @NotEmpty(message = "部门不能为空") private List<Integer> deptIds; } ycl-pojo/src/main/java/com/ycl/platform/domain/result/BaseResult.java
@@ -9,7 +9,6 @@ import java.util.Date; //deptId不做记录,如果更换区域,国标码前8位会改,等于一个新设备不会影响历史数据 @Data public class BaseResult { @Id @@ -19,12 +18,10 @@ */ @CreatedDate private LocalDate mongoCreateTime; /** * 国标码 */ private String no; /** * 省厅 */ ycl-pojo/src/main/java/com/ycl/platform/domain/result/SYS/TMonitorResult.java
@@ -3,14 +3,22 @@ import com.ycl.platform.domain.result.BaseResult; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; /** * 点位在线率 */ @Data @Document(collection = "t_monitor_online") public class TMonitorResult extends BaseResult { /** 部门id */ /** * 部门id */ private Integer deptId; /** 在线 */ private Boolean online; /** 设备类型 */ private String monitorType; /** 设备名 */ private String name; } ycl-server/src/main/java/com/ycl/api/DH/lib/LibraryLoad.java
@@ -26,7 +26,7 @@ /** 当前读取的目录 */ private static String currentFold; /** 动态库需要写入的目录 */ private static String EXTRACT_PATH = System.getProperty("java.io.tmpdir"); private static String EXTRACT_PATH = "/deviceSDK/linux64"; private static boolean written = false; ycl-server/src/main/java/com/ycl/platform/controller/TMonitorController.java
@@ -2,6 +2,7 @@ import annotation.Log; import com.ycl.platform.domain.entity.TMonitor; import com.ycl.platform.domain.form.VideoExportForm; import com.ycl.platform.domain.vo.TMonitorVO; import com.ycl.platform.service.ITMonitorService; import com.ycl.system.AjaxResult; @@ -12,8 +13,10 @@ import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.io.IOException; import java.util.List; /** @@ -42,18 +45,41 @@ } /** * 导出设备资产列表 * 导出 */ @PreAuthorize("@ss.hasPermi('system:monitor:export')") @Log(title = "设备资产", businessType = BusinessType.EXPORT) @PostMapping("/export") public void export(HttpServletResponse response, TMonitorVO tMonitor) { List<TMonitorVO> list = tMonitorService.selectTMonitorList(tMonitor); ExcelUtil<TMonitorVO> util = new ExcelUtil<TMonitorVO>(TMonitorVO.class); util.exportExcel(response, list, "设备资产数据"); @Log(title = "导出视频总量数据", businessType = BusinessType.EXPORT) @PostMapping("/export/video/total") public void exportVideoTotal(HttpServletResponse response, @Validated VideoExportForm exportForm) throws IOException { tMonitorService.exportVideoTotal(response,exportForm); } /** * 导出 */ @PreAuthorize("@ss.hasPermi('system:monitor:export')") @Log(title = "导出每日在线情况", businessType = BusinessType.EXPORT) @PostMapping("/export/video/online") public void exportVideoOnline(HttpServletResponse response, @Validated VideoExportForm exportForm) throws IOException, NoSuchFieldException, IllegalAccessException { tMonitorService.exportVideoOnline(response,exportForm); } /** * 导出 */ @PreAuthorize("@ss.hasPermi('system:monitor:export')") @Log(title = "导出每日录像情况", businessType = BusinessType.EXPORT) @PostMapping("/export/video/record") public void exportVideoRecord(HttpServletResponse response, @Validated VideoExportForm exportForm) throws IOException, NoSuchFieldException, IllegalAccessException { tMonitorService.exportVideoRecord(response,exportForm); } /** * 导出 */ @PreAuthorize("@ss.hasPermi('system:monitor:export')") @Log(title = "导出每日离线时长", businessType = BusinessType.EXPORT) @PostMapping("/export/video/loseTime") public void exportVideoOffTime(HttpServletResponse response, @Validated VideoExportForm exportForm) throws IOException, NoSuchFieldException, IllegalAccessException { tMonitorService.exportVideoLoseTime(response,exportForm); } /** * 获取设备资产详细信息 */ ycl-server/src/main/java/com/ycl/platform/mapper/TMonitorMapper.java
@@ -13,6 +13,7 @@ import com.ycl.platform.domain.vo.screen.MonitorTotalVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.security.core.parameters.P; import java.util.List; import java.util.Map; @@ -49,6 +50,7 @@ * @return 设备资产集合 */ public List<TMonitorVO> selectMonitorVOList(); /** * 新增设备资产 * @@ -171,5 +173,5 @@ * @param tMonitor 设备资产 * @return 设备资产集合 */ public List<TMonitorResult> selectMonitorResult(Short cameraFunType); public List<TMonitorResult> selectMonitorResult(@Param("cameraFunType") Short cameraFunType,@Param("deptIds") List<Integer> deptIds); } ycl-server/src/main/java/com/ycl/platform/service/ITMonitorService.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ycl.platform.domain.entity.TMonitor; import com.ycl.platform.domain.form.VideoExportForm; import com.ycl.platform.domain.query.DashboardQuery; import com.ycl.platform.domain.query.DataCenterQuery; import com.ycl.platform.domain.query.HomeQuery; @@ -9,7 +10,9 @@ import com.ycl.platform.domain.vo.screen.MonitorRateVO; import com.ycl.platform.domain.vo.screen.MonitorTotalVO; import com.ycl.system.Result; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; import java.util.Map; @@ -109,4 +112,12 @@ * @return */ Result assetManagement(DataCenterQuery query); void exportVideoTotal(HttpServletResponse response, VideoExportForm exportForm) throws IOException; void exportVideoOnline(HttpServletResponse response, VideoExportForm exportForm) throws IOException, NoSuchFieldException, IllegalAccessException; void exportVideoRecord(HttpServletResponse response, VideoExportForm exportForm) throws IOException, NoSuchFieldException, IllegalAccessException; void exportVideoLoseTime(HttpServletResponse response, VideoExportForm exportForm) throws NoSuchFieldException, IllegalAccessException, IOException; } ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java
@@ -4,13 +4,18 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ycl.platform.domain.entity.TMonitor; 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.domain.query.DashboardQuery; 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.SYS.TMonitorResult; import com.ycl.platform.domain.result.UY.MonitorQualifyResult; import com.ycl.platform.domain.result.UY.OsdCheckResult; import com.ycl.platform.domain.result.UY.RecordMetaDSumResult; @@ -26,7 +31,10 @@ import com.ycl.system.service.ISysConfigService; import com.ycl.utils.DateUtils; import com.ycl.utils.StringUtils; import constant.ApiConstants; import constant.CheckConstants; import enumeration.general.AreaDeptEnum; import jakarta.servlet.http.HttpServletResponse; import org.apache.commons.lang3.ObjectUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; @@ -34,8 +42,16 @@ import org.springframework.data.mongodb.core.query.Query; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import pojo.ExcelExp; import utils.poi.ExcelUtilManySheet; import java.io.IOException; import java.lang.reflect.Field; import java.math.BigDecimal; import java.text.DecimalFormat; import java.time.LocalDate; import java.time.YearMonth; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -364,4 +380,262 @@ baseMapper.assetManagement(page, query); return Result.ok().data(page.getRecords()).total(page.getTotal()); } /** * 导出总量数据 */ @Override public void exportVideoTotal(HttpServletResponse response, VideoExportForm exportForm) throws IOException { List<ExcelExp> mysheet = new ArrayList<>(); List<TMonitorResult> tMonitorResults = tMonitorMapper.selectMonitorResult(CheckConstants.Rule_Category_Video, exportForm.getDeptIds()); 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<RecordMetaDSumResult> recordResult = mongoTemplate.find(query, RecordMetaDSumResult.class); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); String[] weeks = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"}; // 创建一个Map来存储每天的累加数据 Map<String, VideoTotalExp> totalMap = new HashMap<>(); //一个部门一个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()); videoExp.setOnline(Integer.valueOf(onlines.stream() .filter(TMonitorResult::getOnline) .count() + "")); videoExp.setOffline(videoExp.getTotal() - videoExp.getOnline()); } //设置存储情况 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); } //添加全量表 List<VideoTotalExp> totalExps = new ArrayList<>(totalMap.values()); totalExps = totalExps.stream().sorted(Comparator.comparing(VideoTotalExp::getDate)).collect(Collectors.toList()); ExcelExp excelExp = new ExcelExp("全量", totalExps, VideoTotalExp.class); mysheet.add(excelExp); //导出 ExcelUtilManySheet<List<ExcelExp>> util = new ExcelUtilManySheet<>(mysheet); util.exportExcelManySheet(response, mysheet); } /** * 导出每日在线数据 */ @Override public void exportVideoOnline(HttpServletResponse response, VideoExportForm exportForm) throws IOException, NoSuchFieldException, IllegalAccessException { List<ExcelExp> mysheet = new ArrayList<>(); List<TMonitorResult> tMonitorResults = tMonitorMapper.selectMonitorResult(CheckConstants.Rule_Category_Video, exportForm.getDeptIds()); 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); 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()); videoDailyExp.setTag("" + (result.getProvinceTag() ? "省厅" : "") + (result.getImportantTag() ? "、重点点位" : "") + (result.getImportantCommandImageTag() ? "、重点指挥图像" : "") + (result.getDeptTag() ? "、部级" : "")); setOnlineDaily(videoDailyExp, result, onlines); videoDailyExps.add(videoDailyExp); } ExcelExp excelExp = new ExcelExp(areaDeptEnum == null ? "未知" : areaDeptEnum.getName(), videoDailyExps, VideoDailyExp.class); mysheet.add(excelExp); } ExcelUtilManySheet<List<ExcelExp>> util = new ExcelUtilManySheet<>(mysheet); util.exportExcelManySheet(response, mysheet); } /** * 导出每日录像情况数据 */ @Override public void exportVideoRecord(HttpServletResponse response, VideoExportForm exportForm) throws IOException, NoSuchFieldException, IllegalAccessException { List<ExcelExp> mysheet = new ArrayList<>(); List<TMonitorResult> tMonitorResults = tMonitorMapper.selectMonitorResult(CheckConstants.Rule_Category_Video, exportForm.getDeptIds()); List<String> deviceIds = tMonitorResults.stream().map(BaseResult::getNo).collect(Collectors.toList()); Query query = getQuery(deviceIds, exportForm.getMonth()); //月份每日录像线数据 List<RecordMetaDSumResult> recordResult = mongoTemplate.find(query, RecordMetaDSumResult.class); 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()); videoDailyExp.setTag("" + (result.getProvinceTag() ? "省厅" : "") + (result.getImportantTag() ? "、重点点位" : "") + (result.getImportantCommandImageTag() ? "、重点指挥图像" : "") + (result.getDeptTag() ? "、部级" : "")); setRecordDaily(videoDailyExp, result, records); videoDailyExps.add(videoDailyExp); } ExcelExp excelExp = new ExcelExp(areaDeptEnum == null ? "未知" : areaDeptEnum.getName(), videoDailyExps, VideoDailyExp.class); mysheet.add(excelExp); } ExcelUtilManySheet<List<ExcelExp>> util = new ExcelUtilManySheet<>(mysheet); util.exportExcelManySheet(response, mysheet); } /** * 导出每日录像缺失时长 */ @Override public void exportVideoLoseTime(HttpServletResponse response, VideoExportForm exportForm) throws NoSuchFieldException, IllegalAccessException, IOException { List<ExcelExp> mysheet = new ArrayList<>(); List<TMonitorResult> tMonitorResults = tMonitorMapper.selectMonitorResult(CheckConstants.Rule_Category_Video, exportForm.getDeptIds()); List<String> deviceIds = tMonitorResults.stream().map(BaseResult::getNo).collect(Collectors.toList()); Query query = getQuery(deviceIds, exportForm.getMonth()); //月份每日录像线数据 List<RecordMetaDSumResult> recordResult = mongoTemplate.find(query, RecordMetaDSumResult.class); 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()); videoDailyExp.setTag("" + (result.getProvinceTag() ? "省厅" : "") + (result.getImportantTag() ? "、重点点位" : "") + (result.getImportantCommandImageTag() ? "、重点指挥图像" : "") + (result.getDeptTag() ? "、部级" : "")); setLoseDaily(videoDailyExp, result, records); videoDailyExps.add(videoDailyExp); } ExcelExp excelExp = new ExcelExp(areaDeptEnum == null ? "未知" : areaDeptEnum.getName(), videoDailyExps, VideoDailyExp.class); mysheet.add(excelExp); } ExcelUtilManySheet<List<ExcelExp>> util = new ExcelUtilManySheet<>(mysheet); util.exportExcelManySheet(response, mysheet); } private Query getQuery(List<String> deviceIds, String month) { // 将年月字符串解析为YearMonth对象 YearMonth yearMonth = YearMonth.parse(month); // 获取当月的第一天 LocalDate start = yearMonth.atDay(1); // 获取下个月的第一天(通过加上1个月并设置日为1) YearMonth nextMonth = yearMonth.plusMonths(1); LocalDate end = nextMonth.atDay(1); //获取这个月份的部门数据 Query query = new Query(Criteria.where("mongoCreateTime").gte(start).lt(end)); query.addCriteria(Criteria.where("no").in(deviceIds)); return query; } //设置每日在线数据 private void setOnlineDaily(VideoDailyExp videoDailyExp, TMonitorResult result, List<TMonitorResult> onlines) throws NoSuchFieldException, IllegalAccessException { //一个设备当月在线情况 List<TMonitorResult> onlineResult = onlines.stream().filter(online -> online.getNo().equals(result.getNo())).collect(Collectors.toList()); for (TMonitorResult monitorResult : onlineResult) { int dayOfMonth = monitorResult.getMongoCreateTime().getDayOfMonth(); String online = ""; online += monitorResult.getOnline() ? "在线" : "离线"; //反射赋值,字段统一定义为day+1,2,3... Field field = videoDailyExp.getClass().getDeclaredField("day" + dayOfMonth); field.setAccessible(true); field.set(videoDailyExp, online); } } //设置每日录像数据 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()); for (RecordMetaDSumResult recordResult : recordResults) { int dayOfMonth = recordResult.getMongoCreateTime().getDayOfMonth(); Integer status = recordResult.getRecordStatus(); String text = ""; if (ApiConstants.UY_RecordStatus_Interval.equals(status)) { text += "间歇"; } else if (ApiConstants.UY_RecordStatus_Abnormal.equals(status)) { text += "缺失"; } else if (ApiConstants.UY_RecordStatus_Integrity.equals(status)) { text += "完整"; } //反射赋值,字段统一定义为day+1,2,3... Field field = videoDailyExp.getClass().getDeclaredField("day" + dayOfMonth); field.setAccessible(true); field.set(videoDailyExp, text); } } //设置每日录像缺失时长数据 private void setLoseDaily(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()); for (RecordMetaDSumResult recordResult : recordResults) { int dayOfMonth = recordResult.getMongoCreateTime().getDayOfMonth(); //反射赋值,字段统一定义为day+1,2,3... Field field = videoDailyExp.getClass().getDeclaredField("day" + dayOfMonth); field.setAccessible(true); //防止转换为科学计数法 BigDecimal bigDecimal = BigDecimal.valueOf(recordResult.getMissDuration() == null ? 0 : recordResult.getMissDuration()); field.set(videoDailyExp,bigDecimal.toString()); } } } ycl-server/src/main/java/com/ycl/task/CarTask.java
@@ -43,7 +43,7 @@ private YwPointMapper pointMapper; public void siteOnlineTask() { log.info("开始计算点位在线率"); List<TMonitorResult> tMonitorResults = monitorMapper.selectMonitorResult(CheckConstants.Rule_Category_Car); List<TMonitorResult> tMonitorResults = monitorMapper.selectMonitorResult(CheckConstants.Rule_Category_Car,null); CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Car_SiteOnline); calculator.calculate(tMonitorResults); log.info("结束计算视图库对接稳定性"); ycl-server/src/main/java/com/ycl/task/ContractTask.java
@@ -15,7 +15,9 @@ import com.ycl.platform.domain.vo.WorkOrderVO; import com.ycl.platform.mapper.*; import com.ycl.platform.service.IContractScoreService; import com.ycl.system.mapper.SysConfigMapper; import com.ycl.utils.DateUtils; import com.ycl.utils.StringUtils; import constant.ApiConstants; import enumeration.ContractRule; import enumeration.ErrorType; @@ -56,7 +58,8 @@ private IContractScoreService contractScoreService; @Autowired private WorkOrderMapper workOrderMapper; @Autowired private SysConfigMapper sysConfigMapper; private static final Integer Online = 1; private static final Integer Offline = -1; private static final String AuditStatus_Pass = "1"; @@ -88,7 +91,7 @@ ) )); Map<String, Integer> onlineStatusMap = new HashMap<>(); //查mongo获取设备在线情况 //TODO 在线率修改,查mongo获取设备在线情况 Date date = DateUtils.getDay(2024, 7, 13); //车辆、人脸 Query query = new Query(); @@ -323,8 +326,16 @@ */ public void randomDeductPic() { Random random = new Random(); Integer num = randomSize; //给定随机范围 int number = random.nextInt(randomSize); String count = sysConfigMapper.checkConfigKeyUnique("check.contract.sample").getConfigValue(); if (!StringUtils.isEmpty(count)) { Integer temp = Integer.valueOf(count); if (temp > 0) { num = temp; } } int number = random.nextInt(num); if (number == 0) { log.info("开始抽查图片完整状态"); //准备批量打分的集合 @@ -346,7 +357,7 @@ queryWrapper.in("serial_number", serialNumbers); //获取公司所运维的设备集合,key为unitId value为设备国标码集合 Map<Long, List<String>> unitMonitorMap = ywPointMapper.selectList(queryWrapper).stream() .collect(Collectors.groupingBy(YwPoint::getUnitId, .filter(ywPoint -> ywPoint.getUnitId()!=null).collect(Collectors.groupingBy(YwPoint::getUnitId, Collectors.mapping( YwPoint::getSerialNumber, Collectors.toList()))); @@ -395,7 +406,16 @@ public void randomDeductVideo() { Random random = new Random(); //给定随机范围 int number = random.nextInt(randomSize); Integer num = randomSize; //给定随机范围 String count = sysConfigMapper.checkConfigKeyUnique("check.contract.sample").getConfigValue(); if (!StringUtils.isEmpty(count)) { Integer temp = Integer.valueOf(count); if (temp > 0) { num = temp; } } int number = random.nextInt(num); if (number == 0) { log.info("开始抽查录像完整状态"); //准备批量打分的集合 @@ -417,7 +437,7 @@ queryWrapper.in("serial_number", serialNumbers); //获取公司所运维的设备集合,key为unitId value为设备国标码集合 Map<Long, List<String>> unitMonitorMap = ywPointMapper.selectList(queryWrapper).stream() .collect(Collectors.groupingBy(YwPoint::getUnitId, .filter(ywPoint -> ywPoint.getUnitId()!=null).collect(Collectors.groupingBy(YwPoint::getUnitId, Collectors.mapping( YwPoint::getSerialNumber, Collectors.toList()))); ycl-server/src/main/java/com/ycl/task/FaceTask.java
@@ -39,7 +39,7 @@ public void siteOnlineTask() { log.info("开始计算点位在线率"); List<TMonitorResult> tMonitorResults = monitorMapper.selectMonitorResult(CheckConstants.Rule_Category_Face); List<TMonitorResult> tMonitorResults = monitorMapper.selectMonitorResult(CheckConstants.Rule_Category_Face,null); CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Face_SiteOnline); calculator.calculate(tMonitorResults); log.info("结束计算视图库对接稳定性"); ycl-server/src/main/java/com/ycl/task/MonitorTask.java
@@ -4,8 +4,11 @@ import com.alibaba.druid.support.json.JSONUtils; import com.alibaba.fastjson2.JSONArray; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.mongodb.client.result.DeleteResult; import com.ycl.platform.domain.entity.TMonitor; import com.ycl.platform.domain.entity.YwPoint; import com.ycl.platform.domain.result.HK.VehicleDeviceInspectionResult; import com.ycl.platform.domain.result.SYS.TMonitorResult; import com.ycl.platform.domain.result.UY.MonitorQualifyResult; import com.ycl.platform.domain.result.UY.OneMachineFileResult; import com.ycl.platform.domain.result.UY.OsdCheckResult; @@ -18,6 +21,7 @@ import com.ycl.system.service.ISysDictDataService; import com.ycl.utils.DateUtils; import com.ycl.utils.StringUtils; import constant.CheckConstants; import constant.RedisConstant; import enumeration.general.AreaDeptEnum; import enumeration.general.PointStatus; @@ -57,6 +61,21 @@ @Autowired private RedisTemplate redisTemplate; //同步点位在线率到mongo //TODO:加定时任务12.过开始 public void siteOnline() { log.info("开始同步点位在线率到mongo"); List<TMonitorResult> tMonitorResults = monitorMapper.selectMonitorResult(null,null); if (!CollectionUtils.isEmpty(tMonitorResults)) { //如果存在之前的数据先删除 Query query = new Query(Criteria.where("mongoCreateTime").gte(DateUtils.getDayStart(new Date())).lt(DateUtils.getDayEnd(new Date()))); DeleteResult result = mongoTemplate.remove(query, TMonitorResult.class); //存放在mongo中 mongoTemplate.insertAll(tMonitorResults); log.info("结束同步点位在线率到mongo"); } } //同步mongodb一机一档到数据库 @Transactional(rollbackFor = Exception.class) public void synchronize() { ycl-server/src/main/java/com/ycl/task/OsdTask.java
@@ -47,6 +47,18 @@ private UYErrorTypeCheckService uyErrorTypeCheckService; @Autowired private YwPointService pointService; @Value("${HK.userName}") public String HKUserName; @Value("${HK.password}") public String HKPassword; @Value("${DH.userName}") public String DHUserName; @Value("${DH.password}") public String DHPassword; @Value("${YS.userName}") public String YSUserName; @Value("${YS.password}") public String YSPassword; /** * 通过查mongoDB每日一机一档数据获取设备ip * 通过设备ip、品牌调用不同api获取osd信息 @@ -75,7 +87,7 @@ List<Future<OSDResult>> futureList = new ArrayList<>(48); List<OSDResult> osdResultList = new ArrayList<>(); for (TMonitor monitor : monitors) { OSDCheckThread thread = new OSDCheckThread(monitor); OSDCheckThread thread = new OSDCheckThread(monitor,HKUserName,HKPassword,DHUserName,DHPassword,YSUserName,YSPassword); Future<OSDResult> future = executorService.submit(thread); futureList.add(future); } @@ -88,6 +100,7 @@ List<OsdCheckResult> checkResults = new ArrayList<>(); Map<String, TMonitor> monitorMap = monitors.stream().collect(Collectors.toMap(TMonitor::getSerialNumber, Function.identity())); for (OSDResult osdResult : osdResultList) { if(osdResult!=null) { TMonitor monitor = monitorMap.get(osdResult.getSerialNumber()); //封装OsdCheckResult OsdCheckResult osdCheckResult = getOsdCheckResult(osdResult, monitor); @@ -95,6 +108,7 @@ log.info("校验结果:{}",osdCheckResult); checkResults.add(osdCheckResult); } } log.info("结果数据大小:{}", checkResults.size()); //结果存入mongo if (!CollectionUtils.isEmpty(checkResults)) { ycl-server/src/main/java/com/ycl/task/VideoTask.java
@@ -57,7 +57,7 @@ public void siteOnlineTask() { log.info("开始计算点位在线率"); List<TMonitorResult> tMonitorResults = monitorMapper.selectMonitorResult(CheckConstants.Rule_Category_Video); List<TMonitorResult> tMonitorResults = monitorMapper.selectMonitorResult(CheckConstants.Rule_Category_Video,null); CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Video_SiteOnline); calculator.calculate(tMonitorResults); log.info("结束计算点位在线率"); ycl-server/src/main/java/com/ycl/thread/OSDCheckThread.java
@@ -13,21 +13,21 @@ @Slf4j public class OSDCheckThread implements Callable<OSDResult> { private TMonitor monitor; @Value("${HK.userName}") public String HKUserName; @Value("${HK.password}") public String HKPassword; @Value("${DH.userName}") public String DHUserName; @Value("${DH.password}") public String DHPassword; @Value("${YS.userName}") public String YSUserName; @Value("${YS.password}") public String YSPassword; public OSDCheckThread(TMonitor monitor) { public OSDCheckThread(TMonitor monitor, String HKUserName, String HKPassword, String DHUserName, String DHPassword, String YSUserName, String YSPassword) { this.monitor = monitor; this.HKUserName = HKUserName; this.HKPassword = HKPassword; this.DHUserName = DHUserName; this.DHPassword = DHPassword; this.YSUserName = YSUserName; this.YSPassword = YSPassword; } public TMonitor getMonitor() { @@ -38,6 +38,54 @@ this.monitor = monitor; } public String getHKUserName() { return HKUserName; } public void setHKUserName(String HKUserName) { this.HKUserName = HKUserName; } public String getHKPassword() { return HKPassword; } public void setHKPassword(String HKPassword) { this.HKPassword = HKPassword; } public String getDHUserName() { return DHUserName; } public void setDHUserName(String DHUserName) { this.DHUserName = DHUserName; } public String getDHPassword() { return DHPassword; } public void setDHPassword(String DHPassword) { this.DHPassword = DHPassword; } public String getYSUserName() { return YSUserName; } public void setYSUserName(String YSUserName) { this.YSUserName = YSUserName; } public String getYSPassword() { return YSPassword; } public void setYSPassword(String YSPassword) { this.YSPassword = YSPassword; } @Override public OSDResult call() throws Exception { if (DeviceType.HK.getType().equals(monitor.getDeviceType())) { ycl-server/src/main/java/com/ycl/utils/DateUtils.java
@@ -1,6 +1,7 @@ package com.ycl.utils; import org.apache.commons.lang3.time.DateFormatUtils; import org.glassfish.jaxb.core.v2.TODO; import javax.annotation.Nullable; import java.lang.management.ManagementFactory; @@ -232,10 +233,13 @@ /** * 获取某月开始日期 */ //TODO:校验逻辑是否正确 public static String getMouthStart(@Nullable Date date) { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); c.add(Calendar.MONTH, 0); if (date != null) { c.setTime(date); // 如果date不为null,则设置Calendar的日期为date } c.set(Calendar.DAY_OF_MONTH,1); return df.format(c.getTime()); } @@ -246,6 +250,9 @@ public static String getMouthEnd(@Nullable Date date) { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); Calendar c = Calendar.getInstance(); if (date != null) { c.setTime(date); // 如果date不为null,则设置Calendar的日期为date } c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH)); return df.format(c.getTime()); } ycl-server/src/main/resources/application-dev.yml
@@ -37,9 +37,12 @@ spring: # 数据源配置 datasource: url: jdbc:mysql://101.35.247.188:3306/zgyw?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowMultiQueries=true&allowPublicKeyRetrieval=true # url: jdbc:mysql://101.35.247.188:3306/zgyw?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowMultiQueries=true&allowPublicKeyRetrieval=true # username: root # password: ycl@202466 url: jdbc:mysql://localhost:3306/zgyw?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&allowMultiQueries=true&allowPublicKeyRetrieval=true username: root password: ycl@202466 password: 1234 type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver @@ -77,12 +80,12 @@ spring.data: redis: # 地址 host: 42.193.1.25 # host: 127.0.0.1 # host: 42.193.1.25 host: 127.0.0.1 # 端口,默认为6379 port: 6379 password: ycl2018 # password: # password: ycl2018 password: 123456 # 数据库索引 database: 0 # 密码(如没有密码请注释掉) ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml
@@ -99,7 +99,8 @@ <select id="selectTMonitorList" resultType="com.ycl.platform.domain.vo.TMonitorVO"> select m.id, m.serial_number, name, site_type, mac_addr, ip, camera_fun_type, longitude, latitude, camera_capture_area, p.online as onState, civil_code, d.dept_id, d.dept_name, d.area, p.province_tag, IF(COUNT(w.id) OVER() > 0, '是', '否') AS error, u.unit_name,p.recovery_time,p.reason,p.start_time,p.end_time,w.work_order_no from t_monitor m IF(COUNT(w.id) OVER() > 0, '是', '否') AS error, u.unit_name,p.recovery_time,p.reason,p.start_time,p.end_time,w.work_order_no from t_monitor m left join t_yw_point p on m.serial_number = p.serial_number and p.deleted = 0 left join sys_dept d on p.dept_id = d.dept_id and d.del_flag = 0 left join ( @@ -113,6 +114,7 @@ <if test="serialNumber != null and serialNumber != ''">and m.serial_number = #{serialNumber}</if> <if test="name != null and name != ''"> and (name like concat('%', #{name}, '%') or m.ip like concat('%', #{name}, '%') or m.serial_number like concat('%', #{name}, '%') or u.unit_name like concat('%', #{name}, '%')) </if> @@ -166,13 +168,19 @@ </select> <select id="selectMonitorResult" resultType="com.ycl.platform.domain.result.SYS.TMonitorResult"> select m.id, m.serial_number as no,d.dept_id,p.province_tag,p.important_tag,p.important_command_image_tag,p.dept_tag,p.online select m.id, m.serial_number as no,m.name,m.camera_fun_type as monitorType,d.dept_id,p.province_tag,p.important_tag,p.important_command_image_tag,p.dept_tag,p.online from t_monitor m left join t_yw_point p on m.serial_number = p.serial_number left join sys_dept d on p.dept_id = d.dept_id <where> <if test="cameraFunType!=null"> m.camera_fun_type like concat('%',#{cameraFunType},'%') and m.camera_fun_type like concat('%',#{cameraFunType},'%') </if> <if test="deptIds!=null and deptIds.size>0"> and p.dept_id in <foreach collection="deptIds" item="deptId" open="(" close=")" separator=","> #{deptId} </foreach> </if> </where> </select>