fuliqi
2024-09-27 3e518af3c57b80176823fa712c2ed10eb12f39f4
首页图表
5个文件已修改
4个文件已添加
500 ■■■■■ 已修改文件
ycl-pojo/src/main/java/com/ycl/platform/domain/query/HomeQuery.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/home/BaseHomeVO.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/home/HomeCarVO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/home/HomeFaceVO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/home/HomeVideoVO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/controller/HomeController.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/ITMonitorService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java 398 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/utils/uuid/IdUtils.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/query/HomeQuery.java
@@ -22,10 +22,17 @@
     * 日期范围
     */
    private List<Date> dateRange;
    /**
     * 月份
     */
    private String date;
    /**
     * 日期类型
     */
    private String dateType;
    /**
     * 考核标签1/2 省厅/公安部
     */
    private Integer examineTag;
}
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/home/BaseHomeVO.java
New file
@@ -0,0 +1,15 @@
package com.ycl.platform.domain.vo.home;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
@Data
public class BaseHomeVO {
    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createDate;
}
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/home/HomeCarVO.java
New file
@@ -0,0 +1,16 @@
package com.ycl.platform.domain.vo.home;
import lombok.Data;
@Data
public class HomeCarVO extends BaseHomeVO {
    /**
     * 抓拍量
     */
    private Integer snapCount;
    /**
     * 点位在线数
     */
    private Integer online;
}
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/home/HomeFaceVO.java
New file
@@ -0,0 +1,16 @@
package com.ycl.platform.domain.vo.home;
import lombok.Data;
@Data
public class HomeFaceVO extends BaseHomeVO {
    /**
     * 抓拍量
     */
    private Integer snapCount;
    /**
     * 点位在线数
     */
    private Integer online;
}
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/home/HomeVideoVO.java
New file
@@ -0,0 +1,19 @@
package com.ycl.platform.domain.vo.home;
import lombok.Data;
@Data
public class HomeVideoVO extends BaseHomeVO {
    /**
     * 录像完整数
     */
    private Integer integrityNum;
    /**
     * 录像缺失数
     */
    private Integer loseNum;
    /**
     * 点位在线数
     */
    private Integer online;
}
ycl-server/src/main/java/com/ycl/platform/controller/HomeController.java
@@ -8,6 +8,9 @@
import org.springframework.web.bind.annotation.RestController;
import pojo.AjaxResult;
import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
/**
 * @author gonghl
 * @since 2024/8/1 下午 5:41
@@ -34,6 +37,20 @@
        return AjaxResult.success(tMonitorService.home(monitorQuery));
    }
    @GetMapping("/video")
    public AjaxResult videoHome(HomeQuery monitorQuery) throws ParseException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
        return AjaxResult.success(tMonitorService.videoHome(monitorQuery));
    }
    @GetMapping("/car")
    public AjaxResult carHome(HomeQuery monitorQuery) throws ParseException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
        return AjaxResult.success(tMonitorService.carHome(monitorQuery));
    }
    @GetMapping("/face")
    public AjaxResult faceHome(HomeQuery monitorQuery) throws ParseException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
        return AjaxResult.success(tMonitorService.faceHome(monitorQuery));
    }
    @GetMapping("/workOrder")
    public AjaxResult workOrder(HomeQuery monitorQuery) {
        return AjaxResult.success(workOrderService.home(monitorQuery));
ycl-server/src/main/java/com/ycl/platform/service/ITMonitorService.java
@@ -13,6 +13,8 @@
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
import java.util.List;
import java.util.Map;
@@ -120,4 +122,10 @@
    void exportVideoRecord(HttpServletResponse response, VideoExportForm exportForm) throws IOException, NoSuchFieldException, IllegalAccessException;
    void exportVideoLoseTime(HttpServletResponse response, VideoExportForm exportForm) throws NoSuchFieldException, IllegalAccessException, IOException;
    Map<String, Object> faceHome(HomeQuery monitorQuery) throws ParseException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException;
    Map<String, Object> carHome(HomeQuery monitorQuery) throws ParseException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException;
    Map<String, Object> videoHome(HomeQuery monitorQuery) throws ParseException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException;
}
ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java
@@ -3,6 +3,9 @@
import annotation.DataScope;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
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.VideoDailyExp;
import com.ycl.platform.domain.excel.VideoTotalExp;
@@ -21,12 +24,19 @@
import com.ycl.platform.domain.result.UY.RecordMetaDSumResult;
import com.ycl.platform.domain.vo.TMonitorVO;
import com.ycl.platform.domain.vo.WorkOrderVO;
import com.ycl.platform.domain.vo.home.BaseHomeVO;
import com.ycl.platform.domain.vo.home.HomeCarVO;
import com.ycl.platform.domain.vo.home.HomeFaceVO;
import com.ycl.platform.domain.vo.home.HomeVideoVO;
import com.ycl.platform.domain.vo.screen.MonitorRateVO;
import com.ycl.platform.domain.vo.screen.MonitorTotalVO;
import com.ycl.platform.mapper.TMonitorMapper;
import com.ycl.platform.mapper.WorkOrderMapper;
import com.ycl.platform.service.ITMonitorService;
import com.ycl.system.Result;
import com.ycl.system.entity.SysDictData;
import com.ycl.system.mapper.SysConfigMapper;
import com.ycl.system.mapper.SysDictDataMapper;
import com.ycl.system.page.PageUtil;
import com.ycl.system.service.ISysConfigService;
import com.ycl.utils.DateUtils;
@@ -35,7 +45,10 @@
import constant.CheckConstants;
import enumeration.general.AreaDeptEnum;
import jakarta.servlet.http.HttpServletResponse;
import lombok.SneakyThrows;
import org.apache.commons.lang3.ObjectUtils;
import org.bson.Document;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
@@ -47,11 +60,16 @@
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.YearMonth;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.stream.Collectors;
@@ -71,6 +89,8 @@
    private MongoTemplate mongoTemplate;
    @Autowired
    private WorkOrderMapper workOrderMapper;
    @Autowired
    private SysDictDataMapper dictDataMapper;
    /**
     * 查询设备资产
@@ -387,7 +407,7 @@
    @Override
    public void exportVideoTotal(HttpServletResponse response, VideoExportForm exportForm) throws IOException {
        List<ExcelExp> mysheet = new ArrayList<>();
        exportForm.setCameraFunType(Integer.valueOf(CheckConstants.Rule_Category_Video+""));
        exportForm.setCameraFunType(Integer.valueOf(CheckConstants.Rule_Category_Video + ""));
        VideoExportForm.convertTags(exportForm);
        List<TMonitorResult> tMonitorResults = tMonitorMapper.selectMonitorResult(exportForm);
        List<String> deviceIds = tMonitorResults.stream().map(BaseResult::getNo).collect(Collectors.toList());
@@ -471,7 +491,7 @@
    @Override
    public void exportVideoOnline(HttpServletResponse response, VideoExportForm exportForm) throws IOException, NoSuchFieldException, IllegalAccessException {
        List<ExcelExp> mysheet = new ArrayList<>();
        exportForm.setCameraFunType(Integer.valueOf(CheckConstants.Rule_Category_Video+""));
        exportForm.setCameraFunType(Integer.valueOf(CheckConstants.Rule_Category_Video + ""));
        VideoExportForm.convertTags(exportForm);
        List<TMonitorResult> tMonitorResults = tMonitorMapper.selectMonitorResult(exportForm);
        List<String> deviceIds = tMonitorResults.stream().map(BaseResult::getNo).collect(Collectors.toList());
@@ -494,7 +514,7 @@
                videoDailyExp.setSerialNumber(result.getNo());
                videoDailyExp.setDeviceName(result.getName());
                videoDailyExp.setArea(areaDeptEnum == null ? "未知" : areaDeptEnum.getName());
                String tag ="" + (result.getProvinceTag() ? "省厅、" : "") + (result.getImportantTag() ? "重点点位、" : "") + (result.getImportantCommandImageTag() ? "重点指挥图像、" : "") + (result.getDeptTag() ? "部级、" : "");
                String tag = "" + (result.getProvinceTag() ? "省厅、" : "") + (result.getImportantTag() ? "重点点位、" : "") + (result.getImportantCommandImageTag() ? "重点指挥图像、" : "") + (result.getDeptTag() ? "部级、" : "");
                // 删除字符串末尾的“、”
                if (tag.endsWith("、")) {
                    tag = tag.substring(0, tag.length() - 1);
@@ -521,7 +541,7 @@
    @Override
    public void exportVideoRecord(HttpServletResponse response, VideoExportForm exportForm) throws IOException, NoSuchFieldException, IllegalAccessException {
        List<ExcelExp> mysheet = new ArrayList<>();
        exportForm.setCameraFunType(Integer.valueOf(CheckConstants.Rule_Category_Video+""));
        exportForm.setCameraFunType(Integer.valueOf(CheckConstants.Rule_Category_Video + ""));
        VideoExportForm.convertTags(exportForm);
        List<TMonitorResult> tMonitorResults = tMonitorMapper.selectMonitorResult(exportForm);
        List<String> deviceIds = tMonitorResults.stream().map(BaseResult::getNo).collect(Collectors.toList());
@@ -544,7 +564,7 @@
                videoDailyExp.setSerialNumber(result.getNo());
                videoDailyExp.setDeviceName(result.getName());
                videoDailyExp.setArea(areaDeptEnum == null ? "未知" : areaDeptEnum.getName());
                String tag ="" + (result.getProvinceTag() ? "省厅、" : "") + (result.getImportantTag() ? "重点点位、" : "") + (result.getImportantCommandImageTag() ? "重点指挥图像、" : "") + (result.getDeptTag() ? "部级、" : "");
                String tag = "" + (result.getProvinceTag() ? "省厅、" : "") + (result.getImportantTag() ? "重点点位、" : "") + (result.getImportantCommandImageTag() ? "重点指挥图像、" : "") + (result.getDeptTag() ? "部级、" : "");
                // 删除字符串末尾的“、”
                if (tag.endsWith("、")) {
                    tag = tag.substring(0, tag.length() - 1);
@@ -571,7 +591,7 @@
    @Override
    public void exportVideoLoseTime(HttpServletResponse response, VideoExportForm exportForm) throws NoSuchFieldException, IllegalAccessException, IOException {
        List<ExcelExp> mysheet = new ArrayList<>();
        exportForm.setCameraFunType(Integer.valueOf(CheckConstants.Rule_Category_Video+""));
        exportForm.setCameraFunType(Integer.valueOf(CheckConstants.Rule_Category_Video + ""));
        VideoExportForm.convertTags(exportForm);
        List<TMonitorResult> tMonitorResults = tMonitorMapper.selectMonitorResult(exportForm);
        List<String> deviceIds = tMonitorResults.stream().map(BaseResult::getNo).collect(Collectors.toList());
@@ -594,7 +614,7 @@
                videoDailyExp.setSerialNumber(result.getNo());
                videoDailyExp.setDeviceName(result.getName());
                videoDailyExp.setArea(areaDeptEnum == null ? "未知" : areaDeptEnum.getName());
                String tag ="" + (result.getProvinceTag() ? "省厅、" : "") + (result.getImportantTag() ? "重点点位、" : "") + (result.getImportantCommandImageTag() ? "重点指挥图像、" : "") + (result.getDeptTag() ? "部级、" : "");
                String tag = "" + (result.getProvinceTag() ? "省厅、" : "") + (result.getImportantTag() ? "重点点位、" : "") + (result.getImportantCommandImageTag() ? "重点指挥图像、" : "") + (result.getDeptTag() ? "部级、" : "");
                // 删除字符串末尾的“、”
                if (tag.endsWith("、")) {
                    tag = tag.substring(0, tag.length() - 1);
@@ -614,6 +634,368 @@
        util.exportExcelManySheet(response, mysheet);
    }
    //首页视频报表
    @Override
    public Map<String, Object> videoHome(HomeQuery monitorQuery) throws ParseException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
        List<HomeVideoVO> results = new ArrayList<>();
        String month = monitorQuery.getDate();
        if (StringUtils.isEmpty(month)) {
            //如果为空查本月的数据
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM");
            month = simpleDateFormat.format(new Date());
        }
        // 创建一个SimpleDateFormat对象来解析日期字符串
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        Date date = sdf.parse(month);
        // 创建一个Calendar对象并设置时间为解析出的Date
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 设置Calendar为月份的第一天
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        // 获取月份第一天的Date
        Date startDate = calendar.getTime();
        // 设置Calendar为月份的最后一天(通过增加一个月份然后减去一天)
        calendar.add(Calendar.MONTH, 1);
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        // 获取月份最后一天的Date
        Date endDate = calendar.getTime();
        //mongo查录像状态
        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));
        // 根据examineTag的值动态添加额外的条件
        if (examineTag != null && examineTag.equals(1)) {
            matchConditions.append("provinceTag", true);
        } else if (examineTag != null && examineTag.equals(2)) {
            matchConditions.append("deptTag", true);
        }
        // 构建聚合管道
        List<Document> pipeline = Arrays.asList(
                new Document("$match", matchConditions),
                new Document("$group", new Document("_id", "$mongoCreateTime")
                        .append("normalCount", new Document("$sum",
                                new Document("$cond", Arrays.asList(
                                        new Document("$eq", Arrays.asList("$recordStatus", 1)),
                                        1,
                                        0
                                ))
                        ))
                        .append("loseCount", new Document("$sum",
                                new Document("$cond", Arrays.asList(
                                        new Document("$eq", Arrays.asList("$recordStatus", -1)),
                                        1,
                                        0
                                ))
                        ))
                )
        );
        // 执行聚合查询并获取结果
        AggregateIterable<Document> result = collection.aggregate(pipeline);
        for (Document doc : result) {
            HomeVideoVO homeVideoVO = new HomeVideoVO();
            homeVideoVO.setCreateDate(doc.getDate("_id"));
            homeVideoVO.setIntegrityNum(doc.getInteger("normalCount"));
            homeVideoVO.setLoseNum(doc.getInteger("loseCount"));
            results.add(homeVideoVO);
        }
        //mongo查点位在线
        MongoCollection<Document> onlineCollection = database.getCollection("t_monitor_online");
        // 构建基本的$match条件
        List<Document> onlineMatch = new ArrayList<>();
        onlineMatch.add(new Document("mongoCreateTime", new Document("$gte", startDate).append("$lte", endDate)));
        onlineMatch.add(new Document("monitorType", new Document("$regex", "1")));
        if (examineTag != null && examineTag.equals(1)) {
            onlineMatch.add(new Document("provinceTag", true));
        } else if (examineTag != null && examineTag.equals(2)) {
            onlineMatch.add(new Document("deptTag", true));
        }
        // 构建聚合管道
        List<Document> onlinePipeline = Arrays.asList(
                new Document("$match", new Document("$and", onlineMatch)),
                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)),
                                        1,
                                        0
                                ))
                        ))
                )
        );
        // 执行聚合查询并获取结果
        AggregateIterable<Document> onlineResult = onlineCollection.aggregate(onlinePipeline);
        for (Document doc : onlineResult) {
            HomeVideoVO vo = findOrCreateVO(doc, results, HomeVideoVO.class);
            vo.setOnline(doc.getInteger("onlineCount"));
        }
        results = results.stream().sorted(Comparator.comparing(BaseHomeVO::getCreateDate)).collect(Collectors.toList());
        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 = "video_province_baseLine";
        } else if (examineTag != null && examineTag == 2) {
            condition = "video_dept_baseLine";
        } else {
            condition = "video_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;
    }
    //首页车辆报表
    @Override
    public Map<String, Object> carHome(HomeQuery monitorQuery) throws ParseException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
        List<HomeCarVO> results = new ArrayList<>();
        String month = monitorQuery.getDate();
        if (StringUtils.isEmpty(month)) {
            //如果为空查本月的数据
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM");
            month = simpleDateFormat.format(new Date());
        }
        // 创建一个SimpleDateFormat对象来解析日期字符串
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        Date date = sdf.parse(month);
        // 创建一个Calendar对象并设置时间为解析出的Date
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 设置Calendar为月份的第一天
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        // 获取月份第一天的Date
        Date startDate = calendar.getTime();
        // 设置Calendar为月份的最后一天(通过增加一个月份然后减去一天)
        calendar.add(Calendar.MONTH, 1);
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        // 获取月份最后一天的Date
        Date endDate = calendar.getTime();
        //mongo查抓拍量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_snapshot_data_monitor");
        Integer examineTag = monitorQuery.getExamineTag();
        // 构建基本的$match条件
        List<Document> matchConditions = new ArrayList<>();
        matchConditions.add(new Document("mongoCreateTime", new Document("$gte", startDate).append("$lte", endDate)));
        matchConditions.add(new Document("dataType", new Document("$eq", ApiConstants.HK_DataType_CAR)));
        if (examineTag != null && examineTag.equals(1)) {
            matchConditions.add(new Document("provinceTag", true));
        } else if (examineTag != null && examineTag.equals(2)) {
            matchConditions.add(new Document("deptTag", true));
        }
        // 构建聚合管道
        List<Document> pipeline = Arrays.asList(
                new Document("$match", new Document("$and", matchConditions)),
                new Document("$group", new Document("_id", "$mongoCreateTime")
                        .append("dataCount", new Document("$sum", "$dataCount"))
                )
        );
        // 执行聚合查询并获取结果
        AggregateIterable<Document> result = collection.aggregate(pipeline);
        for (Document doc : result) {
            HomeCarVO homecarVO = new HomeCarVO();
            homecarVO.setCreateDate(doc.getDate("_id"));
            homecarVO.setSnapCount(doc.getInteger("dataCount"));
            results.add(homecarVO);
        }
        //mongo查点位在线
        MongoCollection<Document> onlineCollection = database.getCollection("t_monitor_online");
        // 构建基本的$match条件
        List<Document> onlineMatch = new ArrayList<>();
        onlineMatch.add(new Document("mongoCreateTime", new Document("$gte", startDate).append("$lte", endDate)));
        onlineMatch.add(new Document("monitorType", new Document("$regex", "2")));
        if (examineTag != null && examineTag.equals(1)) {
            onlineMatch.add(new Document("provinceTag", true));
        } else if (examineTag != null && examineTag.equals(2)) {
            onlineMatch.add(new Document("deptTag", true));
        }
        // 构建聚合管道
        List<Document> onlinePipeline = Arrays.asList(
                new Document("$match", new Document("$and", onlineMatch)),
                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)),
                                        1,
                                        0
                                ))
                        ))
                )
        );
        // 执行聚合查询并获取结果
        AggregateIterable<Document> onlineResult = onlineCollection.aggregate(onlinePipeline);
        for (Document doc : onlineResult) {
            HomeCarVO vo = findOrCreateVO(doc, results, HomeCarVO.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 (HomeCarVO vo : results) {
            if (vo.getSnapCount() != null) {
                snapCount += vo.getSnapCount();
            }
            vo.setSnapCount(snapCount);
        }
        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;
    }
    //首页人脸报表
    @Override
    public Map<String, Object> faceHome(HomeQuery monitorQuery) throws ParseException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
        List<HomeFaceVO> results = new ArrayList<>();
        String month = monitorQuery.getDate();
        if (StringUtils.isEmpty(month)) {
            //如果为空查本月的数据
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM");
            month = simpleDateFormat.format(new Date());
        }
        // 创建一个SimpleDateFormat对象来解析日期字符串
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
        Date date = sdf.parse(month);
        // 创建一个Calendar对象并设置时间为解析出的Date
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        // 设置Calendar为月份的第一天
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        // 获取月份第一天的Date
        Date startDate = calendar.getTime();
        // 设置Calendar为月份的最后一天(通过增加一个月份然后减去一天)
        calendar.add(Calendar.MONTH, 1);
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        // 获取月份最后一天的Date
        Date endDate = calendar.getTime();
        //mongo查抓拍量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_snapshot_data_monitor");
        Integer examineTag = monitorQuery.getExamineTag();
        // 构建基本的$match条件
        List<Document> matchConditions = new ArrayList<>();
        matchConditions.add(new Document("mongoCreateTime", new Document("$gte", startDate).append("$lte", endDate)));
        matchConditions.add(new Document("dataType", new Document("$eq", ApiConstants.HK_DataType_FACE)));
        if (examineTag != null && examineTag.equals(1)) {
            matchConditions.add(new Document("provinceTag", true));
        } else if (examineTag != null && examineTag.equals(2)) {
            matchConditions.add(new Document("deptTag", true));
        }
        // 构建聚合管道
        List<Document> pipeline = Arrays.asList(
                new Document("$match", new Document("$and", matchConditions)),
                new Document("$group", new Document("_id", "$mongoCreateTime")
                        .append("dataCount", new Document("$sum", "$dataCount"))
                )
        );
        // 执行聚合查询并获取结果
        AggregateIterable<Document> result = collection.aggregate(pipeline);
        for (Document doc : result) {
            HomeFaceVO homefaceVO = new HomeFaceVO();
            homefaceVO.setCreateDate(doc.getDate("_id"));
            homefaceVO.setSnapCount(doc.getInteger("dataCount"));
            results.add(homefaceVO);
        }
        //mongo查点位在线
        MongoCollection<Document> onlineCollection = database.getCollection("t_monitor_online");
        // 构建基本的$match条件
        List<Document> onlineMatch = new ArrayList<>();
        onlineMatch.add(new Document("mongoCreateTime", new Document("$gte", startDate).append("$lte", endDate)));
        onlineMatch.add(new Document("monitorType", new Document("$regex", "3")));
        if (examineTag != null && examineTag.equals(1)) {
            onlineMatch.add(new Document("provinceTag", true));
        } else if (examineTag != null && examineTag.equals(2)) {
            onlineMatch.add(new Document("deptTag", true));
        }
        // 构建聚合管道
        List<Document> onlinePipeline = Arrays.asList(
                new Document("$match", new Document("$and", onlineMatch)),
                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)),
                                        1,
                                        0
                                ))
                        ))
                )
        );
        // 执行聚合查询并获取结果
        AggregateIterable<Document> onlineResult = onlineCollection.aggregate(onlinePipeline);
        for (Document doc : onlineResult) {
            HomeFaceVO vo = findOrCreateVO(doc, results, HomeFaceVO.class);
            vo.setOnline(doc.getInteger("onlineCount"));
        }
        //按时间排序
        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();
            }
            vo.setSnapCount(snapCount);
        }
        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;
    }
    private <T extends BaseHomeVO> T findOrCreateVO(Document doc, List<T> results, Class<T> clazz) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Date createDate = doc.getDate("_id");
        for (T vo : results) {
            if (vo.getCreateDate().equals(createDate)) {
                return vo;
            }
        }
        // 如果没有找到匹配项,则创建一个新的VO
        T vo = clazz.getDeclaredConstructor().newInstance();
        vo.setCreateDate(createDate);
        results.add(vo);
        return vo;
    }
    private Query getQuery(List<String> deviceIds, String month) {
        // 将年月字符串解析为YearMonth对象
@@ -677,7 +1059,7 @@
            field.setAccessible(true);
            //防止转换为科学计数法
            BigDecimal bigDecimal = BigDecimal.valueOf(recordResult.getMissDuration() == null ? 0 : recordResult.getMissDuration());
            field.set(videoDailyExp,bigDecimal.toString());
            field.set(videoDailyExp, bigDecimal.toString());
        }
    }
}
ycl-server/src/main/java/com/ycl/utils/uuid/IdUtils.java
@@ -70,6 +70,6 @@
     */
    public static String workOrderNO(Date now,String orderNumber)
    {
        return DAY_FORMAT.format(now) + orderNumber;
        return DAY_FORMAT.format(now) +"_"+ orderNumber;
    }
}