ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java
@@ -1,7 +1,7 @@
package com.ycl.platform.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
@@ -9,6 +9,7 @@
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.ycl.platform.domain.entity.*;
import com.ycl.platform.domain.form.UpdateDynamicValueForm;
import com.ycl.platform.domain.query.DataCenterQuery;
import com.ycl.platform.domain.result.HK.*;
import com.ycl.platform.domain.result.SYS.TMonitorResult;
@@ -16,20 +17,28 @@
import com.ycl.platform.domain.vo.DataCenter.BigPicUsefulVO;
import com.ycl.platform.domain.vo.DataCenter.MonitorQualifyResultVO;
import com.ycl.platform.domain.vo.DataCenter.SnapClockVO;
import com.ycl.platform.domain.vo.PointDetailVO;
import com.ycl.platform.domain.vo.home.HomeFaceVO;
import com.ycl.platform.domain.vo.DynamicColumnVO;
import com.ycl.platform.mapper.DynamicColumnMapper;
import com.ycl.platform.mapper.ImageResourceSecurityDetailMapper;
import com.ycl.platform.mapper.TMonitorMapper;
import com.ycl.platform.mapper.YwPointMapper;
import com.ycl.platform.service.*;
import com.ycl.system.Result;
import com.ycl.system.page.PageUtil;
import com.ycl.system.entity.SysDept;
import com.ycl.system.model.LoginUser;
import com.ycl.system.service.ISysConfigService;
import com.ycl.system.service.ISysDeptService;
import com.ycl.utils.DateUtils;
import com.ycl.utils.MongoUtil;
import com.ycl.utils.SecurityUtils;
import com.ycl.utils.StringUtils;
import com.ycl.utils.bean.BeanUtils;
import constant.ApiConstants;
import constant.CheckConstants;
import com.ycl.utils.poi.ExcelUtil;
import constant.*;
import enumeration.general.AreaDeptEnum;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.bson.Document;
import org.springframework.data.domain.Sort;
@@ -37,12 +46,13 @@
import org.springframework.data.mongodb.core.aggregation.*;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.TextCriteria;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@@ -55,41 +65,183 @@
 */
@Service
@RequiredArgsConstructor
@Slf4j
public class DataCenterServiceImpl implements DataCenterService {
    private final MongoTemplate mongoTemplate;
    private final ImageResourceSecurityDetailMapper securityDetailMapper;
    private final YwPointMapper pointMapper;
    private final ICheckIndexVideoService checkIndexVideoService;
    private final ICheckIndexCarService checkIndexCarService;
    private final ICheckIndexFaceService checkIndexFaceService;
    private final DynamicColumnMapper dynamicColumnMapper;
    private final static String TIME_FIELD = "mongoCreateTime";
    private static DecimalFormat DF = new DecimalFormat("#.####");
    /**
     * 视频:点位在线率
     *
     * @param params
     * @return
     */
    public Map<String,List<DynamicColumnVO>> getDynamicByConditions(DataCenterQuery params,List<DynamicColumnVO> list){
        //TODO 该位置没有过滤账号的部门对应的设备信息,而是更具条件查询的全部
        //获得到对应id,且包含传入字符串 动态列集合
        List<DynamicColumnVO> likeFieldDynamicColumnVOList = list.stream()
                .filter(dynamicColumnVO ->
                    dynamicColumnVO.getLabelId().equals(params.getDyId()) &&
                            dynamicColumnVO.getColumnValue().contains(params.getDyValue())
        ).collect(Collectors.toList());
        //获得满足条件的id集合
        List<String> ids = likeFieldDynamicColumnVOList.stream().map(DynamicColumnVO::getRefStringId).toList();
        Map<String,List<DynamicColumnVO>> groupByRefStringIdMap = list.stream().collect(Collectors.groupingBy(DynamicColumnVO::getRefStringId));
        Set<String> removeSet = new HashSet<>(ids);
        //移除掉不符合条件的key
        groupByRefStringIdMap.keySet().retainAll(removeSet);
        return groupByRefStringIdMap;
    }
    //录像可用
    @Override
    public Result videoPointOnlineRate(DataCenterQuery params) {
    public void recordingAvailabilityExport(HttpServletResponse response,DataCenterQuery params) throws IOException {
        List<String> likeFileds = Arrays.asList("deviceId", "deviceName");
        Query query = MongoUtil.getQuery(params, "createTime", likeFileds, null);
        //下拉框录像情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("recordStatus").is(params.getOption()));
        }
        SysDept sysDept = getSysDeptByLoginUser();
        if (sysDept !=null){
            AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null){
                query.addCriteria(Criteria.where("no").regex("^" +areaDeptEnum.getCode()));
            }
        }
        MongoUtil.setNoPage(query, params, TIME_FIELD);
        List<RecordMetaDSumResult> resultList = mongoTemplate.find(query, RecordMetaDSumResult.class);
        //翻译行政区域
        resultList.forEach(item -> {
            String areaCode = item.getArealayername().substring(0, 6);
            AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromCode(areaCode);
            if (areaDeptEnum != null) item.setArealayername(areaDeptEnum.getName());
        });
        //获得动态列数据
        List<DynamicColumnVO> dynamicColumnVOList = dynamicColumnMapper.getDynamicColumnByTableName(TableNameConstants.COLUMN_NAME_VIDEO);
        //判断是否有查询条件
        boolean conditions = false;
        Map<String,List<DynamicColumnVO>> groupByRefStringIdMap = new HashMap<>();
        if (params.getDyId() != null && StringUtils.isNotEmpty(params.getDyValue())){
            conditions = true;
            //获得动态列集合中包含了的字符串值的集合 区分大小写
            groupByRefStringIdMap = getDynamicByConditions(params,dynamicColumnVOList);
        }else{
            groupByRefStringIdMap = dynamicColumnVOList.stream().collect(Collectors.groupingBy(DynamicColumnVO::getRefStringId));
        }
        //固定表头
        LinkedHashSet<String> headers = new LinkedHashSet<>();
        headers.add(RecordingAvailabilityHeaders.arealayername);
        headers.add(RecordingAvailabilityHeaders.arealayerno);
        headers.add(RecordingAvailabilityHeaders.createTime);
        headers.add(RecordingAvailabilityHeaders.deviceId);
        headers.add(RecordingAvailabilityHeaders.missDuration);
        headers.add(RecordingAvailabilityHeaders.platId);
        headers.add(RecordingAvailabilityHeaders.recordDuration);
        headers.add(RecordingAvailabilityHeaders.recordStatusText);
        headers.add(RecordingAvailabilityHeaders.statTime);
        List<String> headersList = new LinkedList<>();
        List<String> dynamicsHeaders = dynamicColumnMapper.getHeader(TableNameConstants.COLUMN_NAME_VIDEO);
        //添加动态表头
        if (!org.springframework.util.CollectionUtils.isEmpty(dynamicsHeaders)) {
            //使用链表保证后续补充数据时获取数据顺序一致
            headersList.addAll(dynamicsHeaders);
            headers.addAll(headersList);
        }
//        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        //查询到有动态列查询条件
        //获得对应动态列中ref的对象id 与 查询结果id过滤
        if (conditions){
            Map<String, List<DynamicColumnVO>> finalGroupByRefStringIdMap = groupByRefStringIdMap;
            resultList = resultList.stream()
                    .filter(obj -> finalGroupByRefStringIdMap.containsKey(obj.getId()))
                    .collect(Collectors.toList());
        }
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        List<List<Object>> data = new ArrayList<>();
        for (RecordMetaDSumResult result : resultList){
            List<Object> row = new ArrayList<>();
            row.add(result.getArealayername());
            row.add(result.getArealayerno());
            row.add(dateFormat.format(result.getCreateTime()));
            row.add(result.getDeviceId());
            row.add(result.getMissDuration());
            row.add(result.getPlatId());
            row.add(result.getRecordDuration());
            row.add(result.getRecordStatusText());
            row.add(dateFormat.format(result.getCreateTime()));
            //添加动态列数据
            for (String header : headersList){
                boolean flag = false;
                List<DynamicColumnVO> columnVOS = groupByRefStringIdMap.get(result.getId());
                if (!CollectionUtils.isEmpty(columnVOS)) {
                    for (DynamicColumnVO columnVO : columnVOS) {
                        if (header.equals(columnVO.getLabelValue())) {
                            row.add(columnVO.getColumnValue());
                            flag = true;
                        }
                    }
                }
                //没找到用空串占位
                if (!flag) row.add("");
            }
            data.add(row);
        }
        List<List<String>> headList = new ArrayList<>();
        for (String header : headers) {
            headList.add(Collections.singletonList(header));
        }
        EasyExcel.write(response.getOutputStream())
                .head(headList) // 设置表头
                .sheet("录像可用率") // 设置sheet名称
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                .doWrite(data); // 写入数据
    }
    //点位在线
    @Override
    public void pointOnlineFaceExport(HttpServletResponse response, DataCenterQuery params) throws IOException {
        List<String> likeFileds = Arrays.asList("name", "no", "ip");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        //查视频设备
        query.addCriteria(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Video + ".*"));
        Query query = null;
        SysDept sysDept = getSysDeptByLoginUser();
        if (sysDept !=null){
            AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null){
                query = MongoUtil.getQueryDataCenter(areaDeptEnum.getCode(),params,TIME_FIELD,likeFileds,null,"no");
            }
        }else {
            query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        }
        //查人脸设备
        query.addCriteria(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Face + ".*"));
        //下拉框在线情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("online").is(params.getOption()));
        }
        Sort sort = Sort.by(
                Sort.Order.asc("pingOnline"), // 首先按照 pingOnline 升序排序
                Sort.Order.desc("offLineCount") // 首先按照 pingOnline 升序排序
        );
        // 通过pingOnline字段排序,为false的排在前面
        query.with(Sort.by(Sort.Order.asc("pingOnline")));
        query.with(sort);
        MongoUtil.setNoPage(query, params, TIME_FIELD);
        //分页数量
        long total = mongoTemplate.count(query, TMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<TMonitorResult> resultList = mongoTemplate.find(query, TMonitorResult.class);
        resultList.forEach(item -> {
            if (item.getPingOnline() == null) {
@@ -106,7 +258,509 @@
            } else {
                item.setOnlineStr("未知");
            }
            List<String> offLineTime = item.getOffLineTimeStr();
            if (!CollectionUtils.isEmpty(offLineTime)) {
                //后续可以改成配置的离线次数(提取前n次,n为配置的离线次数)
                if (offLineTime.size() > 1) {
                    offLineTime = offLineTime.subList(0, 2);
                }
                item.setOffLineTimeStr(offLineTime);
            }
        });
        List<DynamicColumnVO> dynamicColumnVOList = dynamicColumnMapper.getDynamicColumnByTableName(TableNameConstants.COLUMN_NAME_FACE_POINT);
        //判断是否有查询条件
        boolean conditions = false;
        Map<String,List<DynamicColumnVO>> groupByRefStringIdMap = new HashMap<>();
        if (params.getDyId() != null && StringUtils.isNotEmpty(params.getDyValue())){
            conditions = true;
            //获得动态列集合中包含了的字符串值的集合 区分大小写
            groupByRefStringIdMap = getDynamicByConditions(params,dynamicColumnVOList);
        }else{
            groupByRefStringIdMap = dynamicColumnVOList.stream().collect(Collectors.groupingBy(DynamicColumnVO::getRefStringId));
        }
        //固定表头
        LinkedHashSet<String> headers = new LinkedHashSet<>();
        headers.add(PointOnlineHeaders.no);
        headers.add(PointOnlineHeaders.name);
        headers.add(PointOnlineHeaders.ip);
        headers.add(PointOnlineHeaders.onlineStr);
        headers.add(PointOnlineHeaders.pingOnlineStr);
        headers.add(PointOnlineHeaders.checkCount);
        headers.add(PointOnlineHeaders.offLineCount);
        headers.add(PointOnlineHeaders.offLineTimeStr);
        headers.add(PointOnlineHeaders.mongoCreateTime);
        List<String> headersList = new LinkedList<>();
        List<String> dynamicsHeaders = dynamicColumnMapper.getHeader(TableNameConstants.COLUMN_NAME_FACE_POINT);
        //添加动态表头
        if (!org.springframework.util.CollectionUtils.isEmpty(dynamicsHeaders)) {
            //使用链表保证后续补充数据时获取数据顺序一致
            headersList.addAll(dynamicsHeaders);
            headers.addAll(headersList);
        }
        if (conditions){
            Map<String, List<DynamicColumnVO>> finalGroupByRefStringIdMap = groupByRefStringIdMap;
            resultList = resultList.stream()
                    .filter(obj -> finalGroupByRefStringIdMap.containsKey(obj.getNo()))
                    .collect(Collectors.toList());
        }
        List<List<Object>> data = new ArrayList<>();
        for (TMonitorResult result : resultList){
            List<Object> row = new ArrayList<>();
            row.add(result.getNo());
            row.add(result.getName());
            row.add(result.getIp());
            row.add(result.getOnlineStr());
            row.add(result.getPingOnlineStr());
            row.add(result.getCheckCount());
            row.add(result.getOffLineCount());
            if (CollectionUtils.isEmpty(result.getOffLineTimeStr())){
                row.add(null);
            }else {
                row.add(result.getOffLineTimeStr().toString());
            }
            row.add(result.getMongoCreateTime());
            //添加动态列数据
            for (String header : headersList){
                boolean flag = false;
                List<DynamicColumnVO> columnVOS = groupByRefStringIdMap.get(result.getNo());
                if (!CollectionUtils.isEmpty(columnVOS)) {
                    for (DynamicColumnVO columnVO : columnVOS) {
                        if (header.equals(columnVO.getLabelValue())) {
                            row.add(columnVO.getColumnValue());
                            flag = true;
                        }
                    }
                }
                //没找到用空串占位
                if (!flag) row.add("");
            }
            data.add(row);
        }
        List<List<String>> headList = new ArrayList<>();
        for (String header : headers) {
            headList.add(Collections.singletonList(header));
        }
        EasyExcel.write(response.getOutputStream())
                .head(headList) // 设置表头
                .sheet("人脸点位在线率") // 设置sheet名称
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                .doWrite(data); // 写入数据
    } private final ISysDeptService deptService;
    public SysDept getSysDeptByLoginUser(){
        LoginUser loginUser = SecurityUtils.getLoginUser();
        SysDept sysDept = null;
        Long deptId =null;
        if (loginUser.getDeptId() != null){
            deptId = loginUser.getDeptId();
            sysDept = deptService.selectDeptById(deptId);
        }
        return sysDept;
    }
    //视频单位在线
    @Override
    public void pointOnlineVideoExport(HttpServletResponse response, DataCenterQuery params) throws IOException {
        List<String> likeFileds = Arrays.asList("name", "no", "ip");
        Query query = null;
        SysDept sysDept = getSysDeptByLoginUser();
        if (sysDept !=null){
            AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null){
                query = MongoUtil.getQueryDataCenter(areaDeptEnum.getCode(),params,TIME_FIELD,likeFileds,null,"no");
            }
        }else {
            query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        }
        //查视频设备
        query.addCriteria(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Video + ".*"));
        //下拉框在线情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("online").is(params.getOption()));
        }
        Sort sort = Sort.by(
                Sort.Order.asc("pingOnline"), // 首先按照 pingOnline 升序排序
                Sort.Order.desc("offLineCount") // 首先按照 pingOnline 升序排序
        );
        // 通过pingOnline字段排序,为false的排在前面
        query.with(sort);
        MongoUtil.setNoPage(query, params, TIME_FIELD);
        List<TMonitorResult> resultList = mongoTemplate.find(query, TMonitorResult.class);
        resultList.forEach(item -> {
            if (item.getPingOnline() == null) {
                item.setPingOnlineStr("未知");
            } else if (item.getPingOnline()) {
                item.setPingOnlineStr("在线");
            } else if (!item.getPingOnline()) {
                item.setPingOnlineStr("离线");
            }
            if (1 == item.getOnline()) {
                item.setOnlineStr("在线");
            } else if (-1 == item.getOnline()) {
                item.setOnlineStr("离线");
            } else {
                item.setOnlineStr("未知");
            }
            List<String> offLineTime = item.getOffLineTimeStr();
            if (!CollectionUtils.isEmpty(offLineTime)) {
                if (offLineTime.size() > 1) {
                    offLineTime = offLineTime.subList(offLineTime.size() - 2, offLineTime.size());
                }
                item.setOffLineTimeStr(offLineTime);
            }
        });
        List<DynamicColumnVO> dynamicColumnVOList = dynamicColumnMapper.getDynamicColumnByTableName(TableNameConstants.COLUMN_NAME_VIDEO_POINT);
        //判断是否有查询条件
        boolean conditions = false;
        Map<String,List<DynamicColumnVO>> groupByRefStringIdMap = new HashMap<>();
        if (params.getDyId() != null && StringUtils.isNotEmpty(params.getDyValue())){
            conditions = true;
            //获得动态列集合中包含了的字符串值的集合 区分大小写
            groupByRefStringIdMap = getDynamicByConditions(params,dynamicColumnVOList);
        }else{
            groupByRefStringIdMap = dynamicColumnVOList.stream().collect(Collectors.groupingBy(DynamicColumnVO::getRefStringId));
        }
        //固定表头
        LinkedHashSet<String> headers = new LinkedHashSet<>();
        headers.add(PointOnlineHeaders.no);
        headers.add(PointOnlineHeaders.name);
        headers.add(PointOnlineHeaders.ip);
        headers.add(PointOnlineHeaders.onlineStr);
        headers.add(PointOnlineHeaders.pingOnlineStr);
        headers.add(PointOnlineHeaders.checkCount);
        headers.add(PointOnlineHeaders.offLineCount);
        headers.add(PointOnlineHeaders.offLineTimeStr);
        headers.add(PointOnlineHeaders.mongoCreateTime);
        List<String> headersList = new LinkedList<>();
        List<String> dynamicsHeaders = dynamicColumnMapper.getHeader(TableNameConstants.COLUMN_NAME_VIDEO_POINT);
        //添加动态表头
        if (!org.springframework.util.CollectionUtils.isEmpty(dynamicsHeaders)) {
            //使用链表保证后续补充数据时获取数据顺序一致
            headersList.addAll(dynamicsHeaders);
            headers.addAll(headersList);
        }
        if (conditions){
            Map<String, List<DynamicColumnVO>> finalGroupByRefStringIdMap = groupByRefStringIdMap;
            resultList = resultList.stream()
                    .filter(obj -> finalGroupByRefStringIdMap.containsKey(obj.getNo()))
                    .collect(Collectors.toList());
        }
        List<List<Object>> data = new ArrayList<>();
        for (TMonitorResult result : resultList){
            List<Object> row = new ArrayList<>();
            row.add(result.getNo());
            row.add(result.getName());
            row.add(result.getIp());
            row.add(result.getOnlineStr());
            row.add(result.getPingOnlineStr());
            row.add(result.getCheckCount());
            row.add(result.getOffLineCount());
            if (CollectionUtils.isEmpty(result.getOffLineTimeStr())){
                row.add(null);
            }else {
                row.add(result.getOffLineTimeStr().toString());
            }
            row.add(result.getMongoCreateTime());
            //添加动态列数据
            for (String header : headersList){
                boolean flag = false;
                List<DynamicColumnVO> columnVOS = groupByRefStringIdMap.get(result.getNo());
                if (!CollectionUtils.isEmpty(columnVOS)) {
                    for (DynamicColumnVO columnVO : columnVOS) {
                        if (header.equals(columnVO.getLabelValue())) {
                            row.add(columnVO.getColumnValue());
                            flag = true;
                        }
                    }
                }
                //没找到用空串占位
                if (!flag) row.add("");
            }
            data.add(row);
        }
        List<List<String>> headList = new ArrayList<>();
        for (String header : headers) {
            headList.add(Collections.singletonList(header));
        }
        EasyExcel.write(response.getOutputStream())
                .head(headList) // 设置表头
                .sheet("视频点位在线率") // 设置sheet名称
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                .doWrite(data); // 写入数据
    }
    //车辆点位在线
    @Override
    public void pointOnlineCarExport(HttpServletResponse response, DataCenterQuery params) throws IOException {
        List<String> likeFileds = Arrays.asList("name", "no", "ip");
        Query query = null;
        SysDept sysDept = getSysDeptByLoginUser();
        if (sysDept !=null){
            AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null){
                query = MongoUtil.getQueryDataCenter(areaDeptEnum.getCode(),params,TIME_FIELD,likeFileds,null,"no");
            }
        }else {
            query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        }
        //查车辆设备
        query.addCriteria(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Car + ".*"));
        //下拉框在线情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("online").is(params.getOption()));
        }
        Sort sort = Sort.by(
                Sort.Order.asc("pingOnline"), // 首先按照 pingOnline 升序排序
                Sort.Order.desc("offLineCount") // 首先按照 pingOnline 升序排序
        );
        // 通过pingOnline字段排序,为false的排在前面
        query.with(sort);
        //分页数量
        //系统ping的结果
        List<TMonitorResult> resultList = mongoTemplate.find(query, TMonitorResult.class);
        resultList.forEach(item -> {
            if (item.getPingOnline() == null) {
                item.setPingOnlineStr("未知");
            } else if (item.getPingOnline()) {
                item.setPingOnlineStr("在线");
            } else if (!item.getPingOnline()) {
                item.setPingOnlineStr("离线");
            }
            if (1 == item.getOnline()) {
                item.setOnlineStr("在线");
            } else if (-1 == item.getOnline()) {
                item.setOnlineStr("离线");
            } else {
                item.setOnlineStr("未知");
            }
            List<String> offLineTime = item.getOffLineTimeStr();
            if (!CollectionUtils.isEmpty(offLineTime)) {
                //后续可以改成配置的离线次数(提取前n次,n为配置的离线次数)
                if (offLineTime.size() > 1) {
                    offLineTime = offLineTime.subList(0, 2);
                }
                item.setOffLineTimeStr(offLineTime);
            }
        });
        List<DynamicColumnVO> dynamicColumnVOList = dynamicColumnMapper.getDynamicColumnByTableName(TableNameConstants.COLUMN_NAME_CAR_POINT);
        //判断是否有查询条件
        boolean conditions = false;
        Map<String,List<DynamicColumnVO>> groupByRefStringIdMap = new HashMap<>();
        if (params.getDyId() != null && StringUtils.isNotEmpty(params.getDyValue())){
            conditions = true;
            //获得动态列集合中包含了的字符串值的集合 区分大小写
            groupByRefStringIdMap = getDynamicByConditions(params,dynamicColumnVOList);
        }else{
            groupByRefStringIdMap = dynamicColumnVOList.stream().collect(Collectors.groupingBy(DynamicColumnVO::getRefStringId));
        }
        //固定表头
        LinkedHashSet<String> headers = new LinkedHashSet<>();
        headers.add(PointOnlineHeaders.no);
        headers.add(PointOnlineHeaders.name);
        headers.add(PointOnlineHeaders.ip);
        headers.add(PointOnlineHeaders.onlineStr);
        headers.add(PointOnlineHeaders.pingOnlineStr);
        headers.add(PointOnlineHeaders.checkCount);
        headers.add(PointOnlineHeaders.offLineCount);
        headers.add(PointOnlineHeaders.offLineTimeStr);
        headers.add(PointOnlineHeaders.mongoCreateTime);
        List<String> headersList = new LinkedList<>();
        List<String> dynamicsHeaders = dynamicColumnMapper.getHeader(TableNameConstants.COLUMN_NAME_CAR_POINT);
        //添加动态表头
        if (!org.springframework.util.CollectionUtils.isEmpty(dynamicsHeaders)) {
            //使用链表保证后续补充数据时获取数据顺序一致
            headersList.addAll(dynamicsHeaders);
            headers.addAll(headersList);
        }
        if (conditions){
            Map<String, List<DynamicColumnVO>> finalGroupByRefStringIdMap = groupByRefStringIdMap;
            resultList = resultList.stream()
                    .filter(obj -> finalGroupByRefStringIdMap.containsKey(obj.getNo()))
                    .collect(Collectors.toList());
        }
        List<List<Object>> data = new ArrayList<>();
        for (TMonitorResult result : resultList){
            List<Object> row = new ArrayList<>();
            row.add(result.getNo());
            row.add(result.getName());
            row.add(result.getIp());
            row.add(result.getOnlineStr());
            row.add(result.getPingOnlineStr());
            row.add(result.getCheckCount());
            row.add(result.getOffLineCount());
            if (CollectionUtils.isEmpty(result.getOffLineTimeStr())){
                row.add(null);
            }else {
                row.add(result.getOffLineTimeStr().toString());
            }
            row.add(result.getMongoCreateTime());
            //添加动态列数据
            for (String header : headersList){
                boolean flag = false;
                List<DynamicColumnVO> columnVOS = groupByRefStringIdMap.get(result.getNo());
                if (!CollectionUtils.isEmpty(columnVOS)) {
                    for (DynamicColumnVO columnVO : columnVOS) {
                        if (header.equals(columnVO.getLabelValue())) {
                            row.add(columnVO.getColumnValue());
                            flag = true;
                        }
                    }
                }
                //没找到用空串占位
                if (!flag) row.add("");
            }
            data.add(row);
        }
        List<List<String>> headList = new ArrayList<>();
        for (String header : headers) {
            headList.add(Collections.singletonList(header));
        }
        EasyExcel.write(response.getOutputStream())
                .head(headList) // 设置表头
                .sheet("车辆点位在线率") // 设置sheet名称
                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                .doWrite(data); // 写入数据
    }
    @Override
    public Result updateDynamicValue(UpdateDynamicValueForm form) {
        List<DynamicColumnVO> list = form.getDynamicColumnVOList();
        if (CollectionUtils.isEmpty(list) || StringUtils.isEmpty(form.getId())) {
            throw new RuntimeException("修改自定义列的传入值为null或传入id为null");
        }
        List<DynamicColumnValue> updateList = new ArrayList<>();
        List<DynamicColumnValue> addList = new ArrayList<>();
        for (DynamicColumnVO dynamicColumnVO : list){
            if(dynamicColumnVO.getColumnValue() == null){
                continue;
            }
            DynamicColumnValue dynamicColumnValue = new DynamicColumnValue();
            dynamicColumnValue.setColumnValue(dynamicColumnVO.getColumnValue());
            dynamicColumnValue.setDynamicColumnId(dynamicColumnVO.getId());
            dynamicColumnValue.setRefStringId(form.getId());
            dynamicColumnValue.setRefId(0);
            if(dynamicColumnVO.getValueId() == null){
                addList.add(dynamicColumnValue);
            }else {
                dynamicColumnValue.setId(dynamicColumnVO.getValueId());
                updateList.add(dynamicColumnValue);
            }
        }
        log.error("addList:{}",addList);
        log.error("updateList:{}",updateList);
        if (CollectionUtils.isNotEmpty(addList)){
            dynamicColumnMapper.saveBatch(addList);
        }
        if (CollectionUtils.isNotEmpty(updateList)) {
            dynamicColumnMapper.updateBatch(updateList);
        }
        return Result.ok("修改成功");
    }
    /**
     * 视频:点位在线率
     *
     * @param params
     * @return
     */
    @Override
    public Result videoPointOnlineRate(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("name", "no", "ip");
        //此处新增了根据用户权限查询的情况
        Query query = null;
        SysDept sysDept = getSysDeptByLoginUser();
        AreaDeptEnum areaDeptEnum = null;
        if (sysDept !=null){
            areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null){
                query = MongoUtil.getQueryDataCenter(areaDeptEnum.getCode(),params,TIME_FIELD,likeFileds,null,"no");
            }else{
                query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
            }
        }else {
            query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        }
        //查视频设备
        query.addCriteria(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Video + ".*"));
        //下拉框在线情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("online").is(params.getOption()));
        }
        Sort sort = Sort.by(
                Sort.Order.asc("pingOnline"), // 首先按照 pingOnline 升序排序
                Sort.Order.desc("offLineCount") // 首先按照 pingOnline 升序排序
        );
        // 通过pingOnline字段排序,为false的排在前面
        query.with(sort);
        //分页数量
        long total = mongoTemplate.count(query, TMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<TMonitorResult> resultList = mongoTemplate.find(query, TMonitorResult.class);
        resultList.forEach(item -> {
            if (item.getPingOnline() == null) {
                item.setPingOnlineStr("未知");
            } else if (item.getPingOnline()) {
                item.setPingOnlineStr("在线");
            } else if (!item.getPingOnline()) {
                item.setPingOnlineStr("离线");
            }
            if (1 == item.getOnline()) {
                item.setOnlineStr("在线");
            } else if (-1 == item.getOnline()) {
                item.setOnlineStr("离线");
            } else {
                item.setOnlineStr("未知");
            }
            List<String> offLineTime = item.getOffLineTimeStr();
            if (!CollectionUtils.isEmpty(offLineTime)) {
                if (offLineTime.size() > 1) {
                    offLineTime = offLineTime.subList(offLineTime.size() - 2, offLineTime.size());
                }
                item.setOffLineTimeStr(offLineTime);
            }
            //添加动态数据
            List<DynamicColumnVO> list = dynamicColumnMapper.getDynamicColumnByTable(TableNameConstants.COLUMN_NAME_VIDEO_POINT,item.getNo());
            item.setDynamicColumnList(list);
        });
        params.setDeptTag(-1);
        params.setDeviceType(1);
@@ -120,6 +774,10 @@
        // 添加固定条件
        criteriaList.add(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Video + ".*"));
        criteriaList.add(Criteria.where("mongoCreateTime").gte(params.getStartTime()).lte(params.getEndTime()));
        //此处新增了根据用户权限查询的情况
        if (areaDeptEnum != null){
            criteriaList.add(Criteria.where("no").regex("^" +areaDeptEnum.getCode()));
        }
        // 根据dataType动态添加条件
        if (params.getDataType() == 1) {
            criteriaList.add(Criteria.where("provinceTag").is(Boolean.TRUE));
@@ -144,20 +802,24 @@
            onlineCount = (Integer) result.getOrDefault("onlineCount", 0L);
            totalCount = offlineCount + unknownCount + onlineCount;
        }
        /** 查询当天在线率 */
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getSiteOnline)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, params.getStartTime(), params.getEndTime())
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getSiteOnline).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (totalCount!=0) {
            onlineRate = new BigDecimal(onlineCount).divide(new BigDecimal(totalCount), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
//        /** 查询当天在线率 */
//        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
//                .select(CheckIndexVideo::getSiteOnline)
//                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexVideo::getCreateTime, params.getStartTime(), params.getEndTime())
//                .list();
//
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getSiteOnline).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(totalCount + "", onlineCount + "", offlineCount + "", unknownCount + "", this.remove0(onlineRate)));
        map.put("list", resultList);
@@ -173,7 +835,21 @@
    @Override
    public Result deptVideoPointOnlineRate(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("name", "no", "ip");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        //此处新增了根据用户权限查询的情况
        Query query = null;
        SysDept sysDept = getSysDeptByLoginUser();
        AreaDeptEnum areaDeptEnum = null;
        if (sysDept !=null){
            areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null){
                query = MongoUtil.getQueryDataCenter(areaDeptEnum.getCode(),params,TIME_FIELD,likeFileds,null,"no");
            }else{
                query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
            }
        }else {
            query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        }
        //查视频设备
        query.addCriteria(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Video + ".*"));
        query.addCriteria(Criteria.where("deptTag").is(Boolean.TRUE));
@@ -211,9 +887,14 @@
        int unknownCount = 0;
        //构建条件
        List<Criteria> criteriaList = new ArrayList<>();
        //此处新增了根据用户权限查询的情况
        if (areaDeptEnum != null){
            criteriaList.add(Criteria.where("no").regex("^" +areaDeptEnum.getCode()));
        }
        // 添加固定条件
        criteriaList.add(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Video + ".*"));
        criteriaList.add(Criteria.where("mongoCreateTime").gte(params.getStartTime()).lte(params.getEndTime()));
        criteriaList.add(Criteria.where("deptTag").is(Boolean.TRUE));
        // 根据dataType动态添加条件
        if (params.getDataType() == 1) {
            criteriaList.add(Criteria.where("provinceTag").is(Boolean.TRUE));
@@ -238,21 +919,24 @@
            onlineCount = (Integer) result.getOrDefault("onlineCount", 0L);
            totalCount = offlineCount + unknownCount + onlineCount;
        }
        params.setDeptTag(1);
        params.setDeviceType(1);
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getMinistrySiteOnline)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, params.getStartTime(), params.getEndTime())
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getMinistrySiteOnline).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (totalCount!=0) {
            onlineRate = new BigDecimal(onlineCount).divide(new BigDecimal(totalCount), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
//        params.setDeptTag(1);
//        params.setDeviceType(1);
//        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
//                .select(CheckIndexVideo::getMinistrySiteOnline)
//                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexVideo::getCreateTime, params.getStartTime(), params.getEndTime())
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getMinistrySiteOnline).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(totalCount + "", onlineCount + "", offlineCount + "", unknownCount + "", this.remove0(onlineRate)));
        map.put("list", resultList);
@@ -268,7 +952,21 @@
    @Override
    public Result videoImportantPointOnlineRate(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("name", "no", "ip");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        //此处新增了根据用户权限查询的情况
        Query query = null;
        SysDept sysDept = getSysDeptByLoginUser();
        AreaDeptEnum areaDeptEnum = null;
        if (sysDept !=null){
            areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null){
                query = MongoUtil.getQueryDataCenter(areaDeptEnum.getCode(),params,TIME_FIELD,likeFileds,null,"no");
            }else{
                query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
            }
        }else {
            query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        }
        //查视频设备
        query.addCriteria(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Video + ".*"));
        query.addCriteria(Criteria.where("importantTag").is(Boolean.TRUE));
@@ -309,9 +1007,14 @@
        int unknownCount = 0;
        //构建条件
        List<Criteria> criteriaList = new ArrayList<>();
        //此处新增了根据用户权限查询的情况
        if (areaDeptEnum != null){
            criteriaList.add(Criteria.where("no").regex("^" +areaDeptEnum.getCode()));
        }
        // 添加固定条件
        criteriaList.add(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Video + ".*"));
        criteriaList.add(Criteria.where("mongoCreateTime").gte(params.getStartTime()).lte(params.getEndTime()));
        criteriaList.add(Criteria.where("importantTag").is(Boolean.TRUE));
        // 根据dataType动态添加条件
        if (params.getDataType() == 1) {
            criteriaList.add(Criteria.where("provinceTag").is(Boolean.TRUE));
@@ -336,18 +1039,22 @@
            onlineCount = (Integer) result.getOrDefault("onlineCount", 0L);
            totalCount = offlineCount + unknownCount + onlineCount;
        }
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getKeySiteOnline)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, params.getStartTime(), params.getEndTime())
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getKeySiteOnline).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (totalCount!=0) {
            onlineRate = new BigDecimal(onlineCount).divide(new BigDecimal(totalCount), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
//        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
//                .select(CheckIndexVideo::getKeySiteOnline)
//                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexVideo::getCreateTime, params.getStartTime(), params.getEndTime())
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getKeySiteOnline).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(totalCount + "", onlineCount + "", offlineCount + "", unknownCount + "", this.remove0(onlineRate)));
        map.put("list", resultList);
@@ -363,7 +1070,21 @@
    @Override
    public Result videoImportantPointImageOnlineRate(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("name", "no", "ip");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        //此处新增了根据用户权限查询的情况
        Query query = null;
        SysDept sysDept = getSysDeptByLoginUser();
        AreaDeptEnum areaDeptEnum = null;
        if (sysDept !=null){
            areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null){
                query = MongoUtil.getQueryDataCenter(areaDeptEnum.getCode(),params,TIME_FIELD,likeFileds,null,"no");
            }else{
                query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
            }
        }else {
            query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        }
        //查视频设备
        query.addCriteria(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Video + ".*"));
        query.addCriteria(Criteria.where("importantCommandImageTag").is(Boolean.TRUE));
@@ -405,9 +1126,14 @@
        int unknownCount = 0;
        //构建条件
        List<Criteria> criteriaList = new ArrayList<>();
        //此处新增了根据用户权限查询的情况
        if (areaDeptEnum != null){
            criteriaList.add(Criteria.where("no").regex("^" +areaDeptEnum.getCode()));
        }
        // 添加固定条件
        criteriaList.add(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Video + ".*"));
        criteriaList.add(Criteria.where("mongoCreateTime").gte(params.getStartTime()).lte(params.getEndTime()));
        criteriaList.add(Criteria.where("importantCommandImageTag").is(Boolean.TRUE));
        // 根据dataType动态添加条件
        if (params.getDataType() == 1) {
            criteriaList.add(Criteria.where("provinceTag").is(Boolean.TRUE));
@@ -432,19 +1158,22 @@
            onlineCount = (Integer) result.getOrDefault("onlineCount", 0L);
            totalCount = offlineCount + unknownCount + onlineCount;
        }
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getKeyCommandImageOnline)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, params.getStartTime(), params.getEndTime())
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getKeyCommandImageOnline).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (totalCount!=0) {
            onlineRate = new BigDecimal(onlineCount).divide(new BigDecimal(totalCount), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
//        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
//                .select(CheckIndexVideo::getKeyCommandImageOnline)
//                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexVideo::getCreateTime, params.getStartTime(), params.getEndTime())
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getKeyCommandImageOnline).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(totalCount + "", onlineCount + "", offlineCount + "", unknownCount + "", this.remove0(onlineRate)));
        map.put("list", resultList);
@@ -460,13 +1189,25 @@
    @Override
    public Result videoOneMachineDocumentRegister(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("ip.showValue", "name.showValue", "serialNumber.showValue");
        List<Criteria> andCriteria = MongoUtil.getAndCriteria(params, TIME_FIELD, likeFileds, null);
        SysDept sysDept = getSysDeptByLoginUser();
        List<Criteria> andCriteria;
        AreaDeptEnum areaDeptEnum = null;
        if (sysDept != null) {
            areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null) {
                andCriteria = MongoUtil.getAndCriteriaDateCenter(areaDeptEnum.getCode(),params, TIME_FIELD, likeFileds, null);
            }else {
                andCriteria = MongoUtil.getAndCriteria(params, TIME_FIELD, likeFileds, null);
            }
        }else {
            andCriteria = MongoUtil.getAndCriteria(params, TIME_FIELD, likeFileds, null);
        }
        Query query = new Query();
        Criteria and = new Criteria();
        if(params.getOption()!=null){
            if(params.getOption() ==1){
        if (params.getOption() != null) {
            if (params.getOption() == 1) {
                andCriteria.add(Criteria.where("newDevice").is(Boolean.TRUE));
            }else if(params.getOption() ==-1){
            } else if (params.getOption() == -1) {
                andCriteria.add(Criteria.where("newDevice").is(Boolean.FALSE));
            }
        }
@@ -483,15 +1224,26 @@
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("uy_monitor_qualify");
        Document areDocument = null;
        if (areaDeptEnum != null) {
            String areaCodePrefix = areaDeptEnum.getCode();
            areDocument = new Document("deviceNo", new Document("$regex", "^" + areaCodePrefix));
        }
        //总数
        List<Document> dList1 = new ArrayList<>(2);
        if(areDocument != null){
            dList1.add(areDocument);
        }
        setTag(params, dList1);
        Document totalFilter = new Document("$and",dList1);
        Document totalFilter = new Document("$and", dList1);
        //新设备数
        List<Document> dList2 = new ArrayList<>(2);
        if(areDocument != null){
            dList1.add(areDocument);
        }
        setTag(params, dList2);
        dList2.add(new Document("newDevice",Boolean.TRUE));
        Document newFilter = new Document("$and",dList2);
        dList2.add(new Document("newDevice", Boolean.TRUE));
        Document newFilter = new Document("$and", dList2);
        List<Document> lists = Arrays.asList(totalFilter, newFilter);
        List<String> rList = lists.stream().map(filter -> {
@@ -512,19 +1264,23 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getMonitorRegistration)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getMonitorRegistration).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
//                .select(CheckIndexVideo::getMonitorRegistration)
//                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getMonitorRegistration).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        BigDecimal rate = BigDecimal.ZERO;
        if (!StringUtils.isEmpty(rList.get(0)) && !"0".equals(rList.get(0))) {
            rate = new BigDecimal(rList.get(0)).subtract(new BigDecimal(rList.get(1))).divide(new BigDecimal(rList.get(0)), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        rList.add(this.remove0(onlineRate));
        rList.add(this.remove0(rate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", rList);
        map.put("list", resultVOS);
@@ -540,13 +1296,26 @@
    @Override
    public Result videoOneMachineDocumentQualified(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("ip.showValue", "name.showValue", "serialNumber.showValue");
        List<Criteria> andCriteria = MongoUtil.getAndCriteria(params, TIME_FIELD, likeFileds, null);
        SysDept sysDept = getSysDeptByLoginUser();
        List<Criteria> andCriteria;
        AreaDeptEnum areaDeptEnum = null;
        if (sysDept != null) {
            areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null) {
                andCriteria = MongoUtil.getAndCriteriaDateCenter(areaDeptEnum.getCode(),params, TIME_FIELD, likeFileds, null);
            }else {
                andCriteria = MongoUtil.getAndCriteria(params, TIME_FIELD, likeFileds, null);
            }
        }else {
            andCriteria = MongoUtil.getAndCriteria(params, TIME_FIELD, likeFileds, null);
        }
        Query query = new Query();
        Criteria and = new Criteria();
        and.andOperator(andCriteria);
        query = Query.query(and);
        if(params.getOption()!=null){
            if(params.getOption() ==1){
        if (params.getOption() != null) {
            if (params.getOption() == 1) {
                andCriteria.add(Criteria.where("serialNumber.error").is(Boolean.FALSE));
                andCriteria.add(Criteria.where("name.error").is(Boolean.FALSE));
                andCriteria.add(Criteria.where("civilCode.error").is(Boolean.FALSE));
@@ -562,7 +1331,7 @@
                Criteria and2 = new Criteria();
                and2.andOperator(andCriteria);
                query = Query.query(and2);
            }else if(params.getOption() ==-1){
            } else if (params.getOption() == -1) {
                Criteria c1 = Criteria.where("serialNumber.error").is(Boolean.TRUE);
                Criteria c2 = Criteria.where("name.error").is(Boolean.TRUE);
                Criteria c3 = Criteria.where("civilCode.error").is(Boolean.TRUE);
@@ -592,29 +1361,45 @@
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("uy_monitor_qualify");
        Document areDocument = null;
        if (areaDeptEnum != null) {
            String areaCodePrefix = areaDeptEnum.getCode();
            areDocument = new Document("deviceNo", new Document("$regex", "^" + areaCodePrefix));
        }
        //总数
        List<Document> dList1 = new ArrayList<>(2);
        if (areDocument != null){
            dList1.add(areDocument);
        }
        setTag(params, dList1);
        Document totalFilter = new Document("$and",dList1);
        Document totalFilter = new Document("$and", dList1);
        //list1
        //合格数
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("serialNumber.error",Boolean.FALSE));
        dList2.add(new Document("name.error",Boolean.FALSE));
        dList2.add(new Document("civilCode.error",Boolean.FALSE));
        dList2.add(new Document("integrated_device.error",Boolean.FALSE));
        dList2.add(new Document("jkdwlx.error",Boolean.FALSE));
        dList2.add(new Document("latitude.error",Boolean.FALSE));
        dList2.add(new Document("longitude.error",Boolean.FALSE));
        dList2.add(new Document("macdz.error",Boolean.FALSE));
        dList2.add(new Document("name.error",Boolean.FALSE));
        dList2.add(new Document("sbzt.error",Boolean.FALSE));
        dList2.add(new Document("sxjcjqy.error",Boolean.FALSE));
        dList2.add(new Document("sxjgnlx.error",Boolean.FALSE));
        setTag(params,dList2);
        Document qualifyFilter = new Document("$and",dList2);
        if (areDocument != null){
            dList2.add(areDocument);
        }
        dList2.add(new Document("serialNumber.error", Boolean.FALSE));
        dList2.add(new Document("name.error", Boolean.FALSE));
        dList2.add(new Document("civilCode.error", Boolean.FALSE));
        dList2.add(new Document("integrated_device.error", Boolean.FALSE));
        dList2.add(new Document("jkdwlx.error", Boolean.FALSE));
        dList2.add(new Document("latitude.error", Boolean.FALSE));
        dList2.add(new Document("longitude.error", Boolean.FALSE));
        dList2.add(new Document("macdz.error", Boolean.FALSE));
        dList2.add(new Document("name.error", Boolean.FALSE));
        dList2.add(new Document("sbzt.error", Boolean.FALSE));
        dList2.add(new Document("sxjcjqy.error", Boolean.FALSE));
        dList2.add(new Document("sxjgnlx.error", Boolean.FALSE));
        setTag(params, dList2);
        Document qualifyFilter = new Document("$and", dList2);
        //不合格数
        List<Document> dList3  = new ArrayList<>(2);
        setTag(params,dList3);
        List<Document> dList3 = new ArrayList<>(2);
        if (areDocument != null){
            dList3.add(areDocument);
        }
        setTag(params, dList3);
        List<Document> errorConditions = new ArrayList<>();
        errorConditions.add(new Document("serialNumber.error", new Document("$eq", Boolean.TRUE)));
        errorConditions.add(new Document("name.error", new Document("$eq", Boolean.TRUE)));
@@ -650,19 +1435,22 @@
            }
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getMonitorQualification)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getMonitorQualification).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (!StringUtils.isEmpty(rList.get(0)) && !"0".equals(rList.get(0))) {
            onlineRate = new BigDecimal(rList.get(1)).divide(new BigDecimal(rList.get(0)), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
//        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
//                .select(CheckIndexVideo::getMonitorQualification)
//                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getMonitorQualification).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", rList);
@@ -675,6 +1463,7 @@
     * 档案留存总量:mongo存的所有去重后的档案
     * 当日档案:当日的档案
     * 档案考核比 = 当日档案/档案留存总量
     *
     * @param params
     * @return1
     */
@@ -700,14 +1489,14 @@
        //总数
        List<Document> dList1 = new ArrayList<>(2);
        DataCenterQuery totalParams = new DataCenterQuery();
        BeanUtils.copyProperties(params,totalParams);
        BeanUtils.copyProperties(params, totalParams);
        totalParams.setStartTime(null);
        setTag(totalParams, dList1);
        Document totalFilter = new Document("$and",dList1);
        Document totalFilter = new Document("$and", dList1);
        //当日档案数
        List<Document> dList2 = new ArrayList<>(2);
        setTag(params, dList2);
        Document newFilter = new Document("$and",dList2);
        Document newFilter = new Document("$and", dList2);
        List<Document> lists = Arrays.asList(totalFilter, newFilter);
        List<String> rList = lists.stream().map(filter -> {
@@ -727,25 +1516,45 @@
            }
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getArchivesRate)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getArchivesRate).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (!StringUtils.isEmpty(rList.get(0)) && !"0".equals(rList.get(0))) {
            onlineRate = new BigDecimal(rList.get(1)).divide(new BigDecimal(rList.get(0)), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
//        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
//                .select(CheckIndexVideo::getArchivesRate)
//                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getArchivesRate).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", rList);
        map.put("list", resultVOS);
        return Result.ok().data(map).total(total);
    }
    private final ISysConfigService configService;
    public double getSySMinTime(){
        //获取系统参数
        String dictLabel =  configService.selectConfigByKey("recording_min_time");
        double recordingMinTime;
        try {
            recordingMinTime = Double.parseDouble(dictLabel) / 60; // 如果 dictLabel 是以小时为单位,则无需除以 60
        } catch (Exception e) {
            log.error("配置的删除时间范围格式不正确: {}", dictLabel, e);
            return  12.0; // 默认 12 小时(以小时为单位)
        }
        return recordingMinTime;
    }
    private final TMonitorMapper tMonitorMapper;
    /**
     * 视频:录像可用率
@@ -755,8 +1564,25 @@
     */
    @Override
    public Result videoAvailabilityRate(DataCenterQuery params) {
        List<String> noString = tMonitorMapper.getIdListVideo();
        List<String> likeFileds = Arrays.asList("deviceId", "deviceName");
        Query query = MongoUtil.getQuery(params, "createTime", likeFileds, null);
        SysDept sysDept = getSysDeptByLoginUser();
        AreaDeptEnum areaDeptEnum = null;
        Query query = null;
        if (sysDept !=null){
            areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null){
                query = MongoUtil.getQueryDataCenter(areaDeptEnum.getCode(),params,"createTime",likeFileds,null,"no");
            }else{
                query = MongoUtil.getQuery(params, "createTime", likeFileds, null);
            }
        }else {
            query = MongoUtil.getQuery(params, "createTime", likeFileds, null);
        }
        if (CollectionUtils.isNotEmpty(noString)) { // 防止空集合异常
            query.addCriteria(Criteria.where("no").in(noString));
        }
        //下拉框录像情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("recordStatus").is(params.getOption()));
@@ -764,19 +1590,38 @@
        long total = mongoTemplate.count(query, RecordMetaDSumResult.class);
        MongoUtil.setPage(query, params, "createTime");
        List<RecordMetaDSumResult> resultList = mongoTemplate.find(query, RecordMetaDSumResult.class);
        //查询动态列数据
        //查询动态列数据更具id查询
//        List<DynamicColumnVO> dynamicColumnNames = dynamicColumnMapper.getDynamicColumnByTableName("uy_record_meta_d_sum");
        //翻译行政区域
        resultList.forEach(item->{
        resultList.forEach(item -> {
            String areaCode = item.getArealayername().substring(0, 6);
            AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromCode(areaCode);
            if(areaDeptEnum!=null) item.setArealayername(areaDeptEnum.getName());
            AreaDeptEnum areaDeptEnumInfo = AreaDeptEnum.fromCode(areaCode);
            if (areaDeptEnumInfo != null) item.setArealayername(areaDeptEnumInfo.getName());
            List<DynamicColumnVO> list = dynamicColumnMapper.getDynamicColumnByTable(TableNameConstants.COLUMN_NAME_VIDEO,item.getId());
            item.setDynamicColumnList(list);
        });
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("uy_record_meta_d_sum");
        List<Integer> status = Arrays.asList(1, 0, -1);
        AreaDeptEnum finalAreaDeptEnum = areaDeptEnum;
        List<String> resultCount = status.stream().map(item -> {
            List<Document> dList = new ArrayList<>(2);
            dList.add(new Document("recordStatus", new Document("$eq", item)));
            if(finalAreaDeptEnum != null){
                dList.add(new Document("$and", Arrays.asList(
                        new Document("no", new Document("$in", noString)),
                        new Document("no", new Document("$regex", "^" + finalAreaDeptEnum.getCode()))
                )));
            }else {
                dList.add(new Document("no", new Document("$in", noString)));
            }
            setTag(params, dList);
            Document filter = new Document("$and", dList);
            // 构建聚合管道
@@ -795,25 +1640,59 @@
            }
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getVideoAvailable)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getVideoAvailable).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        //计算录像可用率
        MongoDatabase databaes2 = mongoTemplate.getDb();
        MongoCollection<Document> collection2 = databaes2.getCollection("uy_record_meta_d_sum");
        double finalRecordingMinTime = getSySMinTime();
        List<Document> documentList = new ArrayList<>(2);
        if(finalAreaDeptEnum != null){
            documentList.add(new Document("$and", Arrays.asList(
                    new Document("no", new Document("$in", noString)),
                    new Document("no", new Document("$regex", "^" + finalAreaDeptEnum.getCode()))
            )));
        }else {
            documentList.add(new Document("no", new Document("$in", noString)));
        }
        //加一个总数
//        documentList.add(new Document("$and", Arrays.asList(
//                new Document("no", new Document("$in", noString)),
//                new Document("no", new Document("$regex", "^" + finalAreaDeptEnum.getCode()))
//        )));
        setTag(params, documentList);
        Document recording = new Document("missDuration",new Document("$lte", finalRecordingMinTime));
        documentList.add(recording);
        Document filter = new Document("$and", documentList);
        // 构建聚合管道
        List<Document> pipeline = Arrays.asList(
                new Document("$match", filter),
                // $group 去重
                new Document("$group", new Document("_id", "$deviceId")),
                new Document("$count", "uniqueDeviceIds")
        );
        AggregateIterable<Document> result = collection2.aggregate(pipeline);
        Integer uniqueDeviceIdCount = 0;
        for (Document doc : result) {
            uniqueDeviceIdCount = doc.getInteger("uniqueDeviceIds");
            break; // 不需要继续遍历,因为 $count 只会产生一个结果
        }
        log.error("录像可用率打印:{}",uniqueDeviceIdCount);
        int totalCount = 0;
        for (String s : resultCount) {
            totalCount += Integer.parseInt(s);
        }
        resultCount.add(0, totalCount + "");
        BigDecimal onlineRate = BigDecimal.ZERO;
//        1:完整 0:间歇 -1:异常 |
        if (!StringUtils.isEmpty(resultCount.get(0)) && !"0".equals(resultCount.get(0))) {
            //resultCount.get(0)是总数 uniqueDeviceIdCount是更具系统参数查询到mongodb中大于等于 recordDuration字段的总数
            onlineRate = new BigDecimal(uniqueDeviceIdCount).divide(new BigDecimal(resultCount.get(0)), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        resultCount.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
@@ -831,7 +1710,19 @@
    @Override
    public Result deptVideoAvailabilityRate(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("deviceId", "deviceName");
        Query query = MongoUtil.getQuery(params, "createTime", likeFileds, 1);
        SysDept sysDept = getSysDeptByLoginUser();
        AreaDeptEnum areaDeptEnum = null;
        Query query = null;
        if (sysDept !=null){
            areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null){
                query = MongoUtil.getQueryDataCenter(areaDeptEnum.getCode(),params,"createTime",likeFileds,null,"no");
            }else{
                query = MongoUtil.getQuery(params, "createTime", likeFileds, null);
            }
        }else {
            query = MongoUtil.getQuery(params, "createTime", likeFileds, null);
        }
        //下拉框录像情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("recordStatus").is(params.getOption()));
@@ -840,20 +1731,27 @@
        MongoUtil.setPage(query, params, "createTime");
        List<RecordMetaDSumResult> resultList = mongoTemplate.find(query, RecordMetaDSumResult.class);
        //翻译行政区域
        resultList.forEach(item->{
        resultList.forEach(item -> {
            String areaCode = item.getArealayername().substring(0, 6);
            AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromCode(areaCode);
            if(areaDeptEnum!=null) item.setArealayername(areaDeptEnum.getName());
            AreaDeptEnum areaDeptEnumInfo = AreaDeptEnum.fromCode(areaCode);
            if (areaDeptEnumInfo != null) item.setArealayername(areaDeptEnumInfo.getName());
        });
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("uy_record_meta_d_sum");
        List<Integer> status = Arrays.asList(1, 0, -1);
        AreaDeptEnum finalAreaDeptEnum = areaDeptEnum;
        List<String> resultCount = status.stream().map(item -> {
            List<Document> dList = new ArrayList<>(4);
            dList.add(new Document("deptTag", new Document("$eq", Boolean.TRUE)));
            dList.add(new Document("recordStatus", new Document("$eq", item)));
            setTag(params, dList);
            if (finalAreaDeptEnum != null){
                dList.add(new Document("$and", Arrays.asList(
//                    new Document("no", new Document("$in", noString)),
                        new Document("no", new Document("$regex", "^" + finalAreaDeptEnum.getCode()))
                )));
            }
            Document filter = new Document("$and", dList);
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -872,24 +1770,63 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getMinistryVideoAvailable)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getMinistryVideoAvailable).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        //计算部级录像可用率
        MongoDatabase database2 = mongoTemplate.getDb();
        MongoCollection<Document> collection2 = database2.getCollection("uy_record_meta_d_sum");
        double finalRecordingMinTime = getSySMinTime();
        List<Document> documentList = new ArrayList<>(4);
        documentList.add(new Document("deptTag", new Document("$eq", Boolean.TRUE)));
        setTag(params, documentList);
        Document recording = new Document("missDuration",new Document("$lte", finalRecordingMinTime));
        documentList.add(recording);
        if (finalAreaDeptEnum != null){
            documentList.add(new Document("$and", Arrays.asList(
//                    new Document("no", new Document("$in", noString)),
                    new Document("no", new Document("$regex", "^" + finalAreaDeptEnum.getCode()))
            )));
        }
        Document filter = new Document("$and", documentList);
        // 构建聚合管道
        List<Document> pipeline = Arrays.asList(
                new Document("$match", filter),
                // $group 去重
                new Document("$group", new Document("_id", "$deviceId")),
                new Document("$count", "uniqueDeviceIds")
        );
        AggregateIterable<Document> result = collection2.aggregate(pipeline);
        Integer uniqueDeviceIdCount = 0;
        for (Document doc : result) {
            uniqueDeviceIdCount = doc.getInteger("uniqueDeviceIds");
            break; // 不需要继续遍历,因为 $count 只会产生一个结果
        }
        log.error("部级录像可用率{}:",uniqueDeviceIdCount);
//        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
//                .select(CheckIndexVideo::getMinistryVideoAvailable)
//                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getMinistryVideoAvailable).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        //加一个总数
        int totalCount = 0;
        for (String s : resultCount) {
            totalCount += Integer.parseInt(s);
        }
        resultCount.add(0, totalCount + "");
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (!StringUtils.isEmpty(resultCount.get(0)) && !"0".equals(resultCount.get(0))) {
            onlineRate = new BigDecimal(uniqueDeviceIdCount).divide(new BigDecimal(resultCount.get(0)), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        resultCount.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", resultCount);
@@ -906,7 +1843,20 @@
    @Override
    public Result videoImportantPointAvailabilityRate(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("deviceId", "deviceName");
        Query query = MongoUtil.getQuery(params, "createTime", likeFileds, 3);
        SysDept sysDept = getSysDeptByLoginUser();
        AreaDeptEnum areaDeptEnum = null;
        Query query = null;
        if (sysDept !=null){
            areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null){
                query = MongoUtil.getQueryDataCenter(areaDeptEnum.getCode(),params,"createTime",likeFileds,null,"no");
            }else{
                query = MongoUtil.getQuery(params, "createTime", likeFileds, null);
            }
        }else {
            query = MongoUtil.getQuery(params, "createTime", likeFileds, null);
        }
        query.addCriteria(Criteria.where("importantTag").is(Boolean.TRUE));
        //下拉框录像情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("recordStatus").is(params.getOption()));
@@ -915,20 +1865,27 @@
        MongoUtil.setPage(query, params, "createTime");
        List<RecordMetaDSumResult> resultList = mongoTemplate.find(query, RecordMetaDSumResult.class);
        //翻译行政区域
        resultList.forEach(item->{
        resultList.forEach(item -> {
            String areaCode = item.getArealayername().substring(0, 6);
            AreaDeptEnum areaDeptEnum = AreaDeptEnum.fromCode(areaCode);
            if(areaDeptEnum!=null) item.setArealayername(areaDeptEnum.getName());
            AreaDeptEnum areaDeptEnumInfo = AreaDeptEnum.fromCode(areaCode);
            if (areaDeptEnumInfo != null) item.setArealayername(areaDeptEnumInfo.getName());
        });
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("uy_record_meta_d_sum");
        List<Integer> status = Arrays.asList(1, 0, -1);
        AreaDeptEnum finalAreaDeptEnum = areaDeptEnum;
        List<String> resultCount = status.stream().map(item -> {
            List<Document> dList = new ArrayList<>(4);
            dList.add(new Document("importantTag", new Document("$eq", Boolean.TRUE)));
            dList.add(new Document("recordStatus", new Document("$eq", item)));
            setTag(params, dList);
            if (finalAreaDeptEnum != null){
                dList.add(new Document("$and", Arrays.asList(
//                    new Document("no", new Document("$in", noString)),
                        new Document("no", new Document("$regex", "^" + finalAreaDeptEnum.getCode()))
                )));
            }
            Document filter = new Document("$and", dList);
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -947,24 +1904,60 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getKeyVideoAvailable)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getKeyVideoAvailable).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        //计算重点点位录像可用率
        MongoDatabase database2 = mongoTemplate.getDb();
        MongoCollection<Document> collection2 = database2.getCollection("uy_record_meta_d_sum");
        double finalRecordingMinTime = getSySMinTime();
        List<Document> documentList = new ArrayList<>(4);
        documentList.add(new Document("importantTag", new Document("$eq", Boolean.TRUE)));
        setTag(params, documentList);
        Document recording = new Document("missDuration",new Document("$lte", finalRecordingMinTime));
        documentList.add(recording);
        if (finalAreaDeptEnum != null){
            documentList.add(new Document("$and", Arrays.asList(
//                    new Document("no", new Document("$in", noString)),
                    new Document("no", new Document("$regex", "^" + finalAreaDeptEnum.getCode()))
            )));
        }
        Document filter = new Document("$and", documentList);
        // 构建聚合管道
        List<Document> pipeline = Arrays.asList(
                new Document("$match", filter),
                // $group 去重
                new Document("$group", new Document("_id", "$deviceId")),
                new Document("$count", "uniqueDeviceIds")
        );
        AggregateIterable<Document> result = collection2.aggregate(pipeline);
        Integer uniqueDeviceIdCount = 0;
        for (Document doc : result) {
            uniqueDeviceIdCount = doc.getInteger("uniqueDeviceIds");
            break; // 不需要继续遍历,因为 $count 只会产生一个结果
        }
        log.error("重点点位录像可用率{}:",uniqueDeviceIdCount);
//        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
//                .select(CheckIndexVideo::getKeyVideoAvailable)
//                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getKeyVideoAvailable).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        //加一个总数
        int totalCount = 0;
        for (String s : resultCount) {
            totalCount += Integer.parseInt(s);
        }
        resultCount.add(0, totalCount + "");
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (!StringUtils.isEmpty(resultCount.get(0)) && !"0".equals(resultCount.get(0))) {
            onlineRate = new BigDecimal(uniqueDeviceIdCount).divide(new BigDecimal(resultCount.get(0)), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        resultCount.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", resultCount);
@@ -985,12 +1978,32 @@
        long total = mongoTemplate.count(query, RecordMetaDSumResult.class);
        List<RecordMetaDSumResult> resultList = mongoTemplate.find(query, RecordMetaDSumResult.class);
        Query nonNetworkQuery;
        Query networkQuery;
        Query videoQuery;
        Query carQuery;
        Query faceQuery;
//        if (areaDeptEnum == null){
            nonNetworkQuery = new Query().addCriteria(Criteria.where("LWSX").is("0"));
            networkQuery = new Query().addCriteria(Criteria.where("LWSX").is("1"));
            videoQuery = new Query().addCriteria(Criteria.where("SXJGNLX").regex(".*1.*"));
            carQuery = new Query().addCriteria(Criteria.where("SXJGNLX").regex(".*2.*"));
            faceQuery = new Query().addCriteria(Criteria.where("SXJGNLX").regex(".*3.*"));
//        }
//        else {
//            nonNetworkQuery = new Query().addCriteria(Criteria.where("LWSX").is("0")).addCriteria(Criteria.where("no").regex("^" + Pattern.quote(areaDeptEnum.getCode())));
//            networkQuery = new Query().addCriteria(Criteria.where("LWSX").is("1")).addCriteria(Criteria.where("no").regex("^" + Pattern.quote(areaDeptEnum.getCode())));
//            videoQuery = new Query().addCriteria(Criteria.where("SXJGNLX").regex(".*1.*")).addCriteria(Criteria.where("no").regex("^" + Pattern.quote(areaDeptEnum.getCode())));
//            carQuery = new Query().addCriteria(Criteria.where("SXJGNLX").regex(".*2.*")).addCriteria(Criteria.where("no").regex("^" + Pattern.quote(areaDeptEnum.getCode())));
//            faceQuery = new Query().addCriteria(Criteria.where("SXJGNLX").regex(".*3.*")).addCriteria(Criteria.where("no").regex("^" + Pattern.quote(areaDeptEnum.getCode())));
//        }
        // 统计数
        long nonNetwork = mongoTemplate.count(new Query().addCriteria(Criteria.where("LWSX").is("0")), RecordMetaDSumResult.class);
        long network = mongoTemplate.count(new Query().addCriteria(Criteria.where("LWSX").is("1")), RecordMetaDSumResult.class);
        long video = mongoTemplate.count(new Query().addCriteria(Criteria.where("SXJGNLX").regex(".*1.*")), RecordMetaDSumResult.class);
        long car = mongoTemplate.count(new Query().addCriteria(Criteria.where("SXJGNLX").regex(".*2.*")), RecordMetaDSumResult.class);
        long face = mongoTemplate.count(new Query().addCriteria(Criteria.where("SXJGNLX").regex(".*3.*")), RecordMetaDSumResult.class);
        long nonNetwork = mongoTemplate.count(nonNetworkQuery, RecordMetaDSumResult.class);
        long network = mongoTemplate.count(networkQuery, RecordMetaDSumResult.class);
        long video = mongoTemplate.count(videoQuery, RecordMetaDSumResult.class);
        long car = mongoTemplate.count(carQuery, RecordMetaDSumResult.class);
        long face = mongoTemplate.count(faceQuery, RecordMetaDSumResult.class);
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(nonNetwork, network, video, car, face));
        map.put("list", resultList);
@@ -1006,14 +2019,28 @@
    @Override
    public Result videoImportantPointLabelingAccuracy(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("deviceNo", "osdName");
        List<Criteria> andCriteria = MongoUtil.getAndCriteria(params, "checkTime", likeFileds, null);
        SysDept sysDept = getSysDeptByLoginUser();
        List<Criteria> andCriteria;
        AreaDeptEnum areaDeptEnum = null;
        if (sysDept != null) {
            areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null) {
                andCriteria = MongoUtil.getAndCriteriaDateCenter(areaDeptEnum.getCode(),params, "checkTime", likeFileds, null);
            }else {
                andCriteria = MongoUtil.getAndCriteria(params, "checkTime", likeFileds, null);
            }
        }else {
            andCriteria = MongoUtil.getAndCriteria(params, "checkTime", likeFileds, null);
        }
        Query query = new Query();
        Criteria and = new Criteria();
        and.andOperator(andCriteria);
        query = Query.query(and);
        //下拉框标注正确查询条件
        query.addCriteria(Criteria.where("importantTag").is(Boolean.TRUE));
        // 下拉框标注正确查询条件
        if (params.getOption() != null) {
            if(params.getOption()==1) {
            if (params.getOption() == 1) {
                andCriteria.add(Criteria.where("osdNameCorrect").is(1));
                andCriteria.add(Criteria.where("osdTimeCorrect").is(1));
                andCriteria.add(Criteria.where("osdProvinceCorrect").is(1));
@@ -1022,7 +2049,7 @@
                Criteria and2 = new Criteria();
                and2.andOperator(andCriteria);
                query = Query.query(and2);
            }else if(params.getOption()==-1){
            } else if (params.getOption() == -1) {
                // 使用$or条件连接多个字段检查,每个字段检查是否等于-1
                Criteria c1 = Criteria.where("osdNameCorrect").is(-1);
                Criteria c2 = Criteria.where("osdTimeCorrect").is(-1);
@@ -1032,7 +2059,7 @@
                Criteria orOperator = new Criteria().orOperator(c1, c2, c3, c4, c5);
                orOperator.andOperator(andCriteria);
                query = Query.query(orOperator);
            }else {
            } else {
                Criteria c1 = Criteria.where("osdNameCorrect").is(0);
                Criteria c2 = Criteria.where("osdTimeCorrect").is(0);
                Criteria c3 = Criteria.where("osdProvinceCorrect").is(0);
@@ -1047,18 +2074,31 @@
        MongoUtil.setPage(query, params, "checkTime");
        List<OsdCheckResult> resultList = mongoTemplate.find(query, OsdCheckResult.class);
        for (OsdCheckResult osdCheckResult : resultList) {
            OsdCheckResult.getText(osdCheckResult);
            OsdCheckResult.getError(osdCheckResult);
        }
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("osd_check_result");
        //总数
        // 确保在统计查询中也应用相同的过滤条件
        Document areDocument = null;
        if (areaDeptEnum != null) {
            String areaCodePrefix = areaDeptEnum.getCode();
            areDocument = new Document("deviceNo", new Document("$regex", "^" + areaCodePrefix));
        }
        // 总数
        List<Document> dList = new ArrayList<>(2);
        if (areDocument != null){
            dList.add(areDocument);
        }
        dList.add(new Document("importantTag", Boolean.TRUE));
        setTag(params, dList);
        Document osdFilter = new Document("$and", dList);
        //正常数
        // 正常数
        List<Document> dList1 = new ArrayList<>(2);
        if (areDocument != null){
            dList1.add(areDocument);
        }
        dList1.add(new Document("importantTag", Boolean.TRUE));
        dList1.add(new Document("osdNameCorrect", new Document("$eq", 1)));
        dList1.add(new Document("osdTimeCorrect", new Document("$eq", 1)));
@@ -1066,10 +2106,14 @@
        dList1.add(new Document("osdCityCorrect", new Document("$eq", 1)));
        dList1.add(new Document("osdPartCorrect", new Document("$eq", 1)));
        setTag(params, dList1);
        Document osdCorrectFilter = new Document("$and", dList1);
        //异常数
        List<Document> dList2 = new ArrayList<>(2);
        setTag(params,dList2);
        if (areDocument != null){
            dList2.add(areDocument);
        }
        setTag(params, dList2);
        Document importantTagCondition = new Document("importantTag", Boolean.TRUE);
        dList2.add(importantTagCondition);
        List<Document> errorConditions = new ArrayList<>();
@@ -1080,10 +2124,15 @@
        errorConditions.add(new Document("osdPartCorrect", new Document("$eq", -1)));
        Document errorFilter = new Document("$or", errorConditions);
        dList2.add(errorFilter);
        Document osdErrorFilter = new Document("$and", dList2);
        //TODO:未知数  新增0的状态
        // 未知数
        List<Document> dList3 = new ArrayList<>(2);
        setTag(params,dList3);
        if (areDocument != null){
            dList3.add(areDocument);
        }
        setTag(params, dList3);
        dList3.add(importantTagCondition);
        List<Document> unknownConditions = new ArrayList<>();
        unknownConditions.add(new Document("osdNameCorrect", new Document("$eq", 0)));
@@ -1091,12 +2140,12 @@
        unknownConditions.add(new Document("osdProvinceCorrect", new Document("$eq", 0)));
        unknownConditions.add(new Document("osdCityCorrect", new Document("$eq", 0)));
        unknownConditions.add(new Document("osdPartCorrect", new Document("$eq", 0)));
        // 使用$or逻辑组合剩余的条件
        Document unknownFilter = new Document("$or", unknownConditions);
        dList3.add(unknownFilter);
        Document osdUnknownFilter = new Document("$and", dList3);
        List<Document> lists = Arrays.asList(osdFilter, osdCorrectFilter, osdErrorFilter,osdUnknownFilter);
        List<Document> lists = Arrays.asList(osdFilter, osdCorrectFilter, osdErrorFilter, osdUnknownFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -1115,17 +2164,9 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getKeyAnnotationAccuracy)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getKeyAnnotationAccuracy).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (!StringUtils.isEmpty(rList.get(0)) && !"0".equals(rList.get(0))) {
            onlineRate = new BigDecimal(rList.get(1)).divide(new BigDecimal(rList.get(0)), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
@@ -1134,8 +2175,68 @@
        return Result.ok().data(map).total(total);
    }
    @Override
    public void videoImportantPointLabelingAccuracyExport(HttpServletResponse response, DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("deviceNo", "osdName");
        List<Criteria> andCriteria = MongoUtil.getAndCriteria(params, "checkTime", likeFileds, null);
        Query query = new Query();
        Criteria and = new Criteria();
        and.andOperator(andCriteria);
        query = Query.query(and);
        //下拉框标注正确查询条件
        if (params.getOption() != null) {
            if (params.getOption() == 1) {
                andCriteria.add(Criteria.where("osdNameCorrect").is(1));
                andCriteria.add(Criteria.where("osdTimeCorrect").is(1));
                andCriteria.add(Criteria.where("osdProvinceCorrect").is(1));
                andCriteria.add(Criteria.where("osdCityCorrect").is(1));
                andCriteria.add(Criteria.where("osdPartCorrect").is(1));
                Criteria and2 = new Criteria();
                and2.andOperator(andCriteria);
                query = Query.query(and2);
            } else if (params.getOption() == -1) {
                // 使用$or条件连接多个字段检查,每个字段检查是否等于-1
                Criteria c1 = Criteria.where("osdNameCorrect").is(-1);
                Criteria c2 = Criteria.where("osdTimeCorrect").is(-1);
                Criteria c3 = Criteria.where("osdProvinceCorrect").is(-1);
                Criteria c4 = Criteria.where("osdCityCorrect").is(-1);
                Criteria c5 = Criteria.where("osdPartCorrect").is(-1);
                Criteria orOperator = new Criteria().orOperator(c1, c2, c3, c4, c5);
                orOperator.andOperator(andCriteria);
                query = Query.query(orOperator);
            } else {
                Criteria c1 = Criteria.where("osdNameCorrect").is(0);
                Criteria c2 = Criteria.where("osdTimeCorrect").is(0);
                Criteria c3 = Criteria.where("osdProvinceCorrect").is(0);
                Criteria c4 = Criteria.where("osdCityCorrect").is(0);
                Criteria c5 = Criteria.where("osdPartCorrect").is(0);
                Criteria orOperator = new Criteria().orOperator(c1, c2, c3, c4, c5);
                orOperator.andOperator(andCriteria);
                query = Query.query(orOperator);
            }
        }
        List<OsdCheckResult> resultList = mongoTemplate.find(query, OsdCheckResult.class);
        for (OsdCheckResult osdCheckResult : resultList) {
            OsdCheckResult.getError(osdCheckResult);
            StringBuilder tag = new StringBuilder("" +
                    (osdCheckResult.getProvinceTag() ? "省厅、" : "") +
                    (osdCheckResult.getImportantTag() ? "重点点位、" : "") +
                    (osdCheckResult.getImportantCommandImageTag() ? "重点指挥图像、" : "") +
                    (osdCheckResult.getDeptTag() ? "部级、" : ""));
            // 删除字符串末尾的"、"
            if (tag.toString().endsWith("、")) {
                tag = new StringBuilder(tag.substring(0, tag.length() - 1));
            }
            osdCheckResult.setTagStr(tag.toString());
        }
        ExcelUtil<OsdCheckResult> util = new ExcelUtil<>(OsdCheckResult.class);
        String sheetName = "OSD标注";
        util.exportExcel(response, resultList, sheetName);
    }
    /**
     * 视频:校时正确率
     * 视频:校时正确率(停用)
     *
     * @param params
     * @return
@@ -1169,14 +2270,32 @@
    @Override
    public Result videoImportantPointCheckTimeAccuracy(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("deviceNo", "osdName");
        Query query = MongoUtil.getQuery(params, "checkTime", likeFileds, 3);
        SysDept sysDept = getSysDeptByLoginUser();
        List<Criteria> andCriteria;
        AreaDeptEnum areaDeptEnum = null;
        if (sysDept != null) {
            areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null) {
                andCriteria = MongoUtil.getAndCriteriaDateCenter(areaDeptEnum.getCode(),params, "checkTime", likeFileds, null);
            }else {
                andCriteria = MongoUtil.getAndCriteria(params, "checkTime", likeFileds, null);
            }
        }else {
            andCriteria = MongoUtil.getAndCriteria(params, "checkTime", likeFileds, null);
        }
        Query query = new Query();
        Criteria and = new Criteria();
        and.andOperator(andCriteria);
        query = Query.query(and);
        query.addCriteria(Criteria.where("importantTag").is(Boolean.TRUE));
        //下拉框标注正确查询条件
        if (params.getOption() != null) {
            if(params.getOption()==1) {
               query.addCriteria(Criteria.where("osdTimeCorrect").is(1));
            }else if(params.getOption()==-1){
            if (params.getOption() == 1) {
                query.addCriteria(Criteria.where("osdTimeCorrect").is(1));
            } else if (params.getOption() == -1) {
                query.addCriteria(Criteria.where("osdTimeCorrect").is(-1));
            }else {
            } else {
                query.addCriteria(Criteria.where("osdTimeCorrect").is(0));
            }
        }
@@ -1184,15 +2303,23 @@
        long total = mongoTemplate.count(query, OsdCheckResult.class);
        MongoUtil.setPage(query, params, "checkTime");
        List<OsdCheckResult> resultList = mongoTemplate.find(query, OsdCheckResult.class);
        Document areDocument = null;
        if (areaDeptEnum != null) {
            String areaCodePrefix = areaDeptEnum.getCode();
            areDocument = new Document("deviceNo", new Document("$regex", "^" + areaCodePrefix));
        }
        for (OsdCheckResult osdCheckResult : resultList) {
            OsdCheckResult.getText(osdCheckResult);
            OsdCheckResult.getError(osdCheckResult);
        }
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("osd_check_result");
        //总数
        List<Document> dList = new ArrayList<>(2);
        List<Document> dList = new ArrayList<>(3);
        if (areDocument != null){
            dList.add(areDocument);
        }
        dList.add(new Document("importantTag", Boolean.TRUE));
        setTag(params, dList);
        Document osdFilter = new Document("$and", dList);
@@ -1204,11 +2331,17 @@
        dList1.add(new Document("osdProvinceCorrect", new Document("$eq", 1)));
        dList1.add(new Document("osdCityCorrect", new Document("$eq", 1)));
        dList1.add(new Document("osdPartCorrect", new Document("$eq", 1)));
        if (areDocument != null){
            dList1.add(areDocument);
        }
        setTag(params, dList1);
        Document osdCorrectFilter = new Document("$and", dList1);
        //异常数
        List<Document> dList2 = new ArrayList<>(2);
        setTag(params,dList2);
        if (areDocument != null){
            dList2.add(areDocument);
        }
        setTag(params, dList2);
        Document importantTagCondition = new Document("importantTag", Boolean.TRUE);
        dList2.add(importantTagCondition);
        List<Document> errorConditions = new ArrayList<>();
@@ -1220,9 +2353,12 @@
        Document errorFilter = new Document("$or", errorConditions);
        dList2.add(errorFilter);
        Document osdErrorFilter = new Document("$and", dList2);
        //TODO:未知数  新增0的状态
        //未知数
        List<Document> dList3 = new ArrayList<>(2);
        setTag(params,dList3);
        if (areDocument != null){
            dList3.add(areDocument);
        }
        setTag(params, dList3);
        dList3.add(importantTagCondition);
        List<Document> unknownConditions = new ArrayList<>();
        unknownConditions.add(new Document("osdNameCorrect", new Document("$eq", 0)));
@@ -1235,7 +2371,7 @@
        dList3.add(unknownFilter);
        Document osdUnknownFilter = new Document("$and", dList3);
        List<Document> lists = Arrays.asList(osdFilter, osdCorrectFilter, osdErrorFilter,osdUnknownFilter);
        List<Document> lists = Arrays.asList(osdFilter, osdCorrectFilter, osdErrorFilter, osdUnknownFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -1254,17 +2390,21 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
                .select(CheckIndexVideo::getKeyTimingAccuracy)
                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
//        List<CheckIndexVideo> videoList = new LambdaQueryChainWrapper<>(checkIndexVideoService.getBaseMapper())
//                .select(CheckIndexVideo::getKeyTimingAccuracy)
//                .eq(params.getDataType().equals(1), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexVideo::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexVideo::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getKeyTimingAccuracy).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexVideo::getKeyTimingAccuracy).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (!StringUtils.isEmpty(rList.get(0)) && !"0".equals(rList.get(0))) {
            onlineRate = new BigDecimal(rList.get(1)).divide(new BigDecimal(rList.get(0)), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
@@ -1283,40 +2423,80 @@
    @Override
    public Result vehicleViewDockStable(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        Query query = null;
        SysDept sysDept = getSysDeptByLoginUser();
        AreaDeptEnum areaDeptEnum = null;
        if (sysDept !=null){
            areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null){
                query = MongoUtil.getQueryDataCenter(areaDeptEnum.getCode(),params,TIME_FIELD,likeFileds,null,"no");
            }else{
                query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
            }
        }else {
            query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        }
        //加DataType为车辆
        query.addCriteria(Criteria.where("dataType").is(ApiConstants.HK_DataType_CAR));
        if(params.getOption()!=null){
            if(ApiConstants.HK_SnapCount_ResultType_Normal.equals(params.getOption())) {
        if (params.getOption() != null) {
            if (ApiConstants.HK_SnapCount_ResultType_Normal.equals(params.getOption())) {
                query.addCriteria(Criteria.where("resultType").is(ApiConstants.HK_SnapCount_ResultType_Normal));
            }else if(ApiConstants.HK_SnapCount_ResultType_Null.equals(params.getOption())){
            } else if (ApiConstants.HK_SnapCount_ResultType_Null.equals(params.getOption())) {
                query.addCriteria(Criteria.where("resultType").is(ApiConstants.HK_SnapCount_ResultType_Null));
            }else if(ApiConstants.HK_SnapCount_ResultType_Descent.equals(params.getOption())){
            } else if (ApiConstants.HK_SnapCount_ResultType_Descent.equals(params.getOption())) {
                query.addCriteria(Criteria.where("resultType").is(ApiConstants.HK_SnapCount_ResultType_Descent));
            }else if(ApiConstants.HK_SnapCount_ResultType_Low.equals(params.getOption())){
            } else if (ApiConstants.HK_SnapCount_ResultType_Low.equals(params.getOption())) {
                query.addCriteria(Criteria.where("resultType").is(ApiConstants.HK_SnapCount_ResultType_Low));
            }
        }
        long total = mongoTemplate.count(query, SnapshotDataMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<SnapshotDataMonitorResult> resultList = mongoTemplate.find(query, SnapshotDataMonitorResult.class);
        resultList.forEach(item ->item.setResultTypeText(item.getResultTypeText()));
        resultList.forEach(item -> item.setResultTypeText(item.getResultTypeText()));
        Document areDocument = null;
        if (areaDeptEnum != null) {
            String areaCodePrefix = areaDeptEnum.getCode();
            areDocument = new Document("deviceNo", new Document("$regex", "^" + areaCodePrefix));
        }
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_snapshot_data_monitor");
        List<Document> dList2 = new ArrayList<>(2);
        if (areDocument != null){
            dList2.add(areDocument);
        }
        dList2.add(new Document("resultType", new Document("$eq", 1)));
        dList2.add(new Document("dataType", new Document("$eq", ApiConstants.HK_DataType_CAR)));
        setTag(params, dList2);
        List<Document> dList3 = new ArrayList<>(2);
        if (areDocument != null){
            dList3.add(areDocument);
        }
        dList3.add(new Document("resultType", new Document("$eq", 2)));
        dList3.add(new Document("dataType", new Document("$eq", ApiConstants.HK_DataType_CAR)));
        setTag(params, dList3);
        Document noDataFilter = new Document("$and", dList2);
        Document trFilter = new Document("$and", dList3);
        List<Document> lists = Arrays.asList(noDataFilter, trFilter);
        List<Document> dList4 = new ArrayList<>(2);
        if (areDocument != null){
            dList4.add(areDocument);
        }
        dList4.add(new Document("resultType", new Document("$eq", 3)));
        dList4.add(new Document("dataType", new Document("$eq", ApiConstants.HK_DataType_CAR)));
        setTag(params, dList4);
        List<Document> dList5 = new ArrayList<>(2);
        if (areDocument != null){
            dList5.add(areDocument);
        }
        dList5.add(new Document("resultType", new Document("$eq", 4)));
        dList5.add(new Document("dataType", new Document("$eq", ApiConstants.HK_DataType_CAR)));
        setTag(params, dList5);
        Document normalFilter = new Document("$and", dList2);
        Document noDataFilter = new Document("$and", dList3);
        Document downFilter = new Document("$and", dList4);
        Document lessFilter = new Document("$and", dList5);
        List<Document> lists = Arrays.asList(normalFilter, noDataFilter,downFilter,lessFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -1349,24 +2529,51 @@
        for (Document doc : result) {
            dataCount = doc.getInteger("dataCount");
        }
        rList.add(0,dataCount+"");
        List<CheckIndexCar> carList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getViewConnectStability)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        rList.add(0, dataCount + "");
//        List<CheckIndexCar> carList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
//                .select(CheckIndexCar::getViewConnectStability)
//                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(carList)) {
//            BigDecimal sum = carList.stream().map(CheckIndexCar::getViewConnectStability).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(carList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        BigDecimal normal = new BigDecimal(rList.get(1));
        BigDecimal noData = new BigDecimal(rList.get(2));
        BigDecimal down = new BigDecimal(rList.get(3));
        BigDecimal less = new BigDecimal(rList.get(4));
        BigDecimal totalCount = normal.add(noData).add(down).add(less);
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(carList)) {
            BigDecimal sum = carList.stream().map(CheckIndexCar::getViewConnectStability).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(carList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (totalCount.compareTo(BigDecimal.ZERO)>0) {
            onlineRate = normal.divide(totalCount, 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", rList);
        map.put("list", resultList);
        return Result.ok().data(map).total(total);
    }
    public Query buildQuery(DataCenterQuery params,List<String> likeFileds,String fileName){
        Query query = null;
        SysDept sysDept = getSysDeptByLoginUser();
        AreaDeptEnum areaDeptEnum = null;
        if (sysDept !=null){
            areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null){
                query = MongoUtil.getQueryDataCenter(areaDeptEnum.getCode(),params,TIME_FIELD,likeFileds,null,"no");
            }else{
                query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
            }
        }else {
            query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        }
        return query;
    }
    /**
@@ -1378,15 +2585,32 @@
    @Override
    public Result vehiclePointOnlineRate(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("name", "no", "ip");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        Query query = null;
        SysDept sysDept = getSysDeptByLoginUser();
        AreaDeptEnum areaDeptEnum = null;
        if (sysDept !=null){
            areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null){
                query = MongoUtil.getQueryDataCenter(areaDeptEnum.getCode(),params,TIME_FIELD,likeFileds,null,"no");
            }else{
                query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
            }
        }else {
            query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        }
        //查车辆设备
        query.addCriteria(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Car + ".*"));
        //下拉框在线情况查询条件
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("online").is(params.getOption()));
        }
        Sort sort = Sort.by(
                Sort.Order.asc("pingOnline"), // 首先按照 pingOnline 升序排序
                Sort.Order.desc("offLineCount") // 首先按照 pingOnline 升序排序
        );
        // 通过pingOnline字段排序,为false的排在前面
        query.with(Sort.by(Sort.Order.asc("pingOnline")));
        query.with(sort);
        //分页数量
        long total = mongoTemplate.count(query, TMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
@@ -1409,6 +2633,17 @@
            } else {
                item.setOnlineStr("未知");
            }
            List<String> offLineTime = item.getOffLineTimeStr();
            if (!CollectionUtils.isEmpty(offLineTime)) {
                //后续可以改成配置的离线次数(提取前n次,n为配置的离线次数)
                if (offLineTime.size() > 1) {
                    offLineTime = offLineTime.subList(0, 2);
                }
                item.setOffLineTimeStr(offLineTime);
            }
            //添加动态数据
            List<DynamicColumnVO> list = dynamicColumnMapper.getDynamicColumnByTable(TableNameConstants.COLUMN_NAME_CAR_POINT,item.getNo());
            item.setDynamicColumnList(list);
        });
        // 统计设备数量
@@ -1419,6 +2654,9 @@
        int unknownCount = 0;
        //构建条件
        List<Criteria> criteriaList = new ArrayList<>();
        if (areaDeptEnum != null){
            criteriaList.add(Criteria.where("no").regex("^" +areaDeptEnum.getCode()));
        }
        // 添加固定条件
        criteriaList.add(Criteria.where("monitorType").regex(".*" + CheckConstants.Rule_Category_Car + ".*"));
        criteriaList.add(Criteria.where("mongoCreateTime").gte(params.getStartTime()).lte(params.getEndTime()));
@@ -1447,17 +2685,21 @@
            totalCount = offlineCount + unknownCount + onlineCount;
        }
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getSiteOnline)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
//        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
//                .select(CheckIndexCar::getSiteOnline)
//                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexCar::getSiteOnline).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexCar::getSiteOnline).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (totalCount!=0) {
            onlineRate = new BigDecimal(onlineCount).divide(new BigDecimal(totalCount), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(totalCount + "", onlineCount + "", offlineCount + "", unknownCount + "", this.remove0(onlineRate)));
@@ -1474,16 +2716,28 @@
    @Override
    public Result vehicleNetDeviceDirectoryConsistency(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("ip.showValue", "name.showValue", "serialNumber.showValue");
        List<Criteria> andCriteria = MongoUtil.getAndCriteria(params, TIME_FIELD, likeFileds, null);
        SysDept sysDept = getSysDeptByLoginUser();
        List<Criteria> andCriteria;
        AreaDeptEnum areaDeptEnum = null;
        if (sysDept != null) {
            areaDeptEnum = AreaDeptEnum.fromDept(Math.toIntExact(sysDept.getDeptId()));
            if (areaDeptEnum != null) {
                andCriteria = MongoUtil.getAndCriteriaDateCenter(areaDeptEnum.getCode(),params, "checkTime", likeFileds, null);
            }else {
                andCriteria = MongoUtil.getAndCriteria(params, "checkTime", likeFileds, null);
            }
        }else {
            andCriteria = MongoUtil.getAndCriteria(params, "checkTime", likeFileds, null);
        }
        // 1/2/3 视频/车辆/人脸
        Pattern pattern = Pattern.compile(".*2.*");
        andCriteria.add(Criteria.where("sxjgnlx.value").regex(pattern));
        Query query = new Query();
        Criteria and = new Criteria();
        if(params.getOption()!=null){
            if(params.getOption() ==1){
        if (params.getOption() != null) {
            if (params.getOption() == 1) {
                andCriteria.add(Criteria.where("newDevice").is(Boolean.TRUE));
            }else if(params.getOption() ==-1){
            } else if (params.getOption() == -1) {
                andCriteria.add(Criteria.where("newDevice").is(Boolean.FALSE));
            }
        }
@@ -1500,17 +2754,29 @@
        //统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("uy_monitor_qualify");
        Document areDocument = null;
        if (areaDeptEnum != null) {
            String areaCodePrefix = areaDeptEnum.getCode();
            areDocument = new Document("no", new Document("$regex", "^" + areaCodePrefix));
        }
        //总数
        List<Document> dList1 = new ArrayList<>(2);
        if (areDocument != null){
            dList1.add(areDocument);
        }
        setTag(params, dList1);
        dList1.add(new Document("sxjgnlx.value", new Document("$regex", ".*2.*")));
        Document totalFilter = new Document("$and",dList1);
        Document totalFilter = new Document("$and", dList1);
        //新设备数
        List<Document> dList2 = new ArrayList<>(2);
        if (areDocument != null){
            dList2.add(areDocument);
        }
        setTag(params, dList2);
        dList2.add(new Document("sxjgnlx.value", new Document("$regex", ".*2.*")));
        dList2.add(new Document("newDevice",Boolean.TRUE));
        Document newFilter = new Document("$and",dList2);
        dList2.add(new Document("newDevice", Boolean.TRUE));
        Document newFilter = new Document("$and", dList2);
        List<Document> lists = Arrays.asList(totalFilter, newFilter);
        List<String> rList = lists.stream().map(filter -> {
@@ -1531,17 +2797,21 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getDeviceDirectoryConsistent)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
//        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
//                .select(CheckIndexCar::getDeviceDirectoryConsistent)
//                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexCar::getDeviceDirectoryConsistent).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexCar::getDeviceDirectoryConsistent).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (!StringUtils.isEmpty(rList.get(0)) && !"0".equals(rList.get(0))) {
            onlineRate = new BigDecimal(rList.get(0)).subtract(new BigDecimal(rList.get(1))).divide(new BigDecimal(rList.get(0)), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
@@ -1564,11 +2834,11 @@
        Criteria and = new Criteria();
        and.andOperator(andCriteria);
        query = Query.query(and);
        if(params.getOption()!=null){
            if(params.getOption() ==1){
        if (params.getOption() != null) {
            if (params.getOption() == 1) {
                query.addCriteria(Criteria.where("lalType").is(ApiConstants.HK_Info_LayType_Normal));
                query.addCriteria(Criteria.where("gbCodeType").is(ApiConstants.HK_Info_GbCodeType_Normal));
            }else if(params.getOption() ==-1){
            } else if (params.getOption() == -1) {
                Criteria lalType = Criteria.where("lalType").ne(ApiConstants.HK_Info_LayType_Normal);
                Criteria gbCodeType = Criteria.where("gbCodeType").ne(ApiConstants.HK_Info_GbCodeType_Normal);
                Criteria orOperator = new Criteria().orOperator(lalType, gbCodeType);
@@ -1594,9 +2864,9 @@
        List<Document> dList3 = new ArrayList<>(2);
        setTag(params, dList3);
        List<Document> errorConditions = new ArrayList<>();
        errorConditions.add(new Document("lalType",new Document("$ne",1)));
        errorConditions.add(new Document("gbCodeType",new Document("$ne",1)));
        Document errorDoc = new Document("$or",errorConditions);
        errorConditions.add(new Document("lalType", new Document("$ne", 1)));
        errorConditions.add(new Document("gbCodeType", new Document("$ne", 1)));
        Document errorDoc = new Document("$or", errorConditions);
        dList3.add(errorDoc);
        Document totalFilter = new Document("$and", dList1);
        Document correctFilter = new Document("$and", dList2);
@@ -1621,17 +2891,21 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getVehicleInformationCollectionAccuracy)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
//        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
//                .select(CheckIndexCar::getVehicleInformationCollectionAccuracy)
//                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexCar::getVehicleInformationCollectionAccuracy).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexCar::getVehicleInformationCollectionAccuracy).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (!StringUtils.isEmpty(rList.get(0)) && !"0".equals(rList.get(0))) {
            onlineRate = new BigDecimal(rList.get(1)).divide(new BigDecimal(rList.get(0)), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
@@ -1650,11 +2924,11 @@
    public Result vehicleCollectionDataIntegrity(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        if(params.getOption()!=null){
        if (params.getOption() != null) {
            //主要属性不完整
            if(params.getOption()==1){
                 query.addCriteria(Criteria.where("noIntegrityCount").gt(0));
            }else if(params.getOption()==-1){
            if (params.getOption() == 1) {
                query.addCriteria(Criteria.where("noIntegrityCount").gt(0));
            } else if (params.getOption() == -1) {
                //属性不完整
                query.addCriteria(Criteria.where("mainNoIntegrityCount").gt(0));
            }
@@ -1689,22 +2963,26 @@
            mainNoIntegrityCount = doc.getInteger("mainNoIntegrityCount");
        }
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getVehicleCaptureIntegrity)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexCar::getVehicleCaptureIntegrity).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
//        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
//                .select(CheckIndexCar::getVehicleCaptureIntegrity)
//                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexCar::getVehicleCaptureIntegrity).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        List<String> countList = new ArrayList<>();
        countList.add(dataCount+"");
        countList.add(noIntegrityCount+"");
        countList.add(mainNoIntegrityCount+"");
        countList.add(dataCount + "");
        countList.add(noIntegrityCount + "");
        countList.add(mainNoIntegrityCount + "");
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (dataCount!=0) {
            onlineRate = new BigDecimal(dataCount-noIntegrityCount).divide(new BigDecimal(dataCount), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        countList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", countList);
@@ -1722,11 +3000,11 @@
    public Result vehicleCollectionDataCaptured(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        if(params.getOption()!=null){
        if (params.getOption() != null) {
            //主要属性不一致
            if(params.getOption()==1){
            if (params.getOption() == 1) {
                query.addCriteria(Criteria.where("majorDiffCount").gt(0));
            }else if(params.getOption()==-1){
            } else if (params.getOption() == -1) {
                //重要属性不一致
                query.addCriteria(Criteria.where("importantDiffCount").gt(0));
            }
@@ -1760,23 +3038,27 @@
            importantDiffCount = doc.getInteger("importantDiffCount");
        }
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getVehicleCaptureAccuracy)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexCar::getVehicleCaptureAccuracy).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
//        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
//                .select(CheckIndexCar::getVehicleCaptureAccuracy)
//                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexCar::getVehicleCaptureAccuracy).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        List<String> countList = new ArrayList<>();
        countList.add(sampleCount+"");
        countList.add(majorDiffCount+"");
        countList.add(importantDiffCount+"");
        countList.add(sampleCount + "");
        countList.add(majorDiffCount + "");
        countList.add(importantDiffCount + "");
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (sampleCount!=0) {
            onlineRate = new BigDecimal(sampleCount-majorDiffCount).divide(new BigDecimal(sampleCount), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        countList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", countList);
@@ -1794,11 +3076,11 @@
    public Result vehicleClockAccuracy(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        if(params.getOption()!=null){
        if (params.getOption() != null) {
            //当日时钟异常
            if(params.getOption()==1){
            if (params.getOption() == 1) {
                query.addCriteria(Criteria.where("majorDiffCount").gt(0));
            }else if(params.getOption()==-1){
            } else if (params.getOption() == -1) {
                //全部时钟异常
                query.addCriteria(Criteria.where("importantDiffCount").gt(0));
            }
@@ -1807,7 +3089,7 @@
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<VehicleDeviceInspectionResult> resultList = mongoTemplate.find(query, VehicleDeviceInspectionResult.class);
        List<SnapClockVO> resultVos = new ArrayList<>();
        resultList.forEach(item->{
        resultList.forEach(item -> {
            SnapClockVO vo = VehicleDeviceInspectionResult.getVO(item);
            resultVos.add(vo);
        });
@@ -1833,7 +3115,7 @@
        Document allFilter = new Document("$and", dList3);
        Document allErrFilter = new Document("$and", dList4);
        List<Document> lists = Arrays.asList(todayFilter, todayErrFilter, allFilter,allErrFilter);
        List<Document> lists = Arrays.asList(todayFilter, todayErrFilter, allFilter, allErrFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -1852,17 +3134,24 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getVehicleTimingAccuracy)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
//        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
//                .select(CheckIndexCar::getVehicleTimingAccuracy)
//                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexCar::getVehicleTimingAccuracy).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexCar::getVehicleTimingAccuracy).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        BigDecimal normal = new BigDecimal(rList.get(0));
        BigDecimal abnormal = new BigDecimal(rList.get(1));
        BigDecimal totalCount = normal.add(abnormal);
        if (totalCount.compareTo(BigDecimal.ZERO)>0) {
            onlineRate = normal.divide(totalCount, 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
@@ -1882,11 +3171,11 @@
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        query.addCriteria(Criteria.where("dataType").is(ApiConstants.HK_DataType_CAR));
        if(params.getOption()!=null){
        if (params.getOption() != null) {
            //正常
            if(params.getOption()==1){
            if (params.getOption() == 1) {
                query.addCriteria(Criteria.where("delayCount").is(0));
            }else if(params.getOption()==-1){
            } else if (params.getOption() == -1) {
                //延迟
                query.addCriteria(Criteria.where("delayCount").gt(0));
            }
@@ -1900,15 +3189,15 @@
        List<Document> dList1 = new ArrayList<>(2);
        setTag(params, dList1);
        dList1.add(new Document("dataType" ,new Document("$eq",ApiConstants.HK_DataType_CAR)));
        dList1.add(new Document("dataType", new Document("$eq", ApiConstants.HK_DataType_CAR)));
        Document allFilter = new Document("$and", dList1);
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("dataType" ,new Document("$eq",ApiConstants.HK_DataType_CAR)));
        dList2.add(new Document("dataType", new Document("$eq", ApiConstants.HK_DataType_CAR)));
        dList2.add(new Document("delayCount", new Document("$gt", 0)));
        setTag(params, dList2);
        Document delayFilter = new Document("$and", dList2);
        List<Document> lists = Arrays.asList(allFilter,delayFilter);
        List<Document> lists = Arrays.asList(allFilter, delayFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -1928,17 +3217,21 @@
        }).collect(Collectors.toList());
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getVehicleUploadTimeliness)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
//        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
//                .select(CheckIndexCar::getVehicleUploadTimeliness)
//                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexCar::getVehicleUploadTimeliness).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexCar::getVehicleUploadTimeliness).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (!StringUtils.isEmpty(rList.get(0)) && !"0".equals(rList.get(0))) {
            onlineRate = new BigDecimal(rList.get(0)).subtract(new BigDecimal(rList.get(1))).divide(new BigDecimal(rList.get(0)), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
@@ -1957,10 +3250,10 @@
    public Result vehicleUrlAccuracy(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        if(params.getOption()!=null){
            if(params.getOption()==1){
        if (params.getOption() != null) {
            if (params.getOption() == 1) {
                query.addCriteria(Criteria.where("expCount").is(0));
            }else if(params.getOption()==-1){
            } else if (params.getOption() == -1) {
                query.addCriteria(Criteria.where("expCount").gt(0));
            }
        }
@@ -2003,8 +3296,8 @@
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        List<String> rList = new ArrayList<>();
        rList.add(sampleCount+"");
        rList.add(expCount+"");
        rList.add(sampleCount + "");
        rList.add(expCount + "");
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
@@ -2023,10 +3316,10 @@
    public Result vehicleBigImgAccuracy(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        if(params.getOption()!=null){
            if(params.getOption()==1){
        if (params.getOption() != null) {
            if (params.getOption() == 1) {
                query.addCriteria(Criteria.where("bigUseful.bigPicExpCount").is(0));
            }else if(params.getOption()==-1){
            } else if (params.getOption() == -1) {
                query.addCriteria(Criteria.where("bigUseful.bigPicExpCount").gt(0));
            }
        }
@@ -2035,7 +3328,7 @@
        query.with(Sort.by(Sort.Order.desc("bigUseful.bigPicExpCount")));
        List<VehicleDeviceSamplingResult> resultList = mongoTemplate.find(query, VehicleDeviceSamplingResult.class);
        List<BigPicUsefulVO> voList = new ArrayList<>();
        resultList.forEach(item->{
        resultList.forEach(item -> {
            BigPicUsefulVO picVO = VehicleDeviceSamplingResult.getPicVO(item);
            voList.add(picVO);
        });
@@ -2060,20 +3353,24 @@
            expCount = doc.getInteger("expCount");
        }
        List<String> countList = new ArrayList<>();
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getVehiclePictureAvailability)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
//        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
//                .select(CheckIndexCar::getVehiclePictureAvailability)
//                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexCar::getVehiclePictureAvailability).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        countList.add(sampleCount + "");
        countList.add(expCount + "");
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexCar::getVehiclePictureAvailability).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (sampleCount!=0) {
            onlineRate = new BigDecimal(sampleCount-expCount).divide(new BigDecimal(sampleCount), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        countList.add(sampleCount+"");
        countList.add(expCount+"");
        countList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", countList);
@@ -2093,21 +3390,21 @@
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        //加DataType为车辆
        query.addCriteria(Criteria.where("dataType").is(ApiConstants.HK_DataType_FACE));
        if(params.getOption()!=null){
            if(ApiConstants.HK_SnapCount_ResultType_Normal.equals(params.getOption())) {
        if (params.getOption() != null) {
            if (ApiConstants.HK_SnapCount_ResultType_Normal.equals(params.getOption())) {
                query.addCriteria(Criteria.where("resultType").is(ApiConstants.HK_SnapCount_ResultType_Normal));
            }else if(ApiConstants.HK_SnapCount_ResultType_Null.equals(params.getOption())){
            } else if (ApiConstants.HK_SnapCount_ResultType_Null.equals(params.getOption())) {
                query.addCriteria(Criteria.where("resultType").is(ApiConstants.HK_SnapCount_ResultType_Null));
            }else if(ApiConstants.HK_SnapCount_ResultType_Descent.equals(params.getOption())){
            } else if (ApiConstants.HK_SnapCount_ResultType_Descent.equals(params.getOption())) {
                query.addCriteria(Criteria.where("resultType").is(ApiConstants.HK_SnapCount_ResultType_Descent));
            }else if(ApiConstants.HK_SnapCount_ResultType_Low.equals(params.getOption())){
            } else if (ApiConstants.HK_SnapCount_ResultType_Low.equals(params.getOption())) {
                query.addCriteria(Criteria.where("resultType").is(ApiConstants.HK_SnapCount_ResultType_Low));
            }
        }
        long total = mongoTemplate.count(query, SnapshotDataMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<SnapshotDataMonitorResult> resultList = mongoTemplate.find(query, SnapshotDataMonitorResult.class);
        resultList.forEach(item ->item.setResultTypeText(item.getResultTypeText()));
        resultList.forEach(item -> item.setResultTypeText(item.getResultTypeText()));
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_snapshot_data_monitor");
@@ -2121,9 +3418,19 @@
        dList3.add(new Document("dataType", new Document("$eq", ApiConstants.HK_DataType_CAR)));
        setTag(params, dList3);
        Document noDataFilter = new Document("$and", dList2);
        Document trFilter = new Document("$and", dList3);
        List<Document> lists = Arrays.asList(noDataFilter, trFilter);
        List<Document> dList4 = new ArrayList<>(2);
        dList4.add(new Document("resultType", new Document("$eq", 3)));
        dList4.add(new Document("dataType", new Document("$eq", ApiConstants.HK_DataType_CAR)));
        setTag(params, dList4);
        List<Document> dList5 = new ArrayList<>(2);
        dList5.add(new Document("resultType", new Document("$eq", 4)));
        dList5.add(new Document("dataType", new Document("$eq", ApiConstants.HK_DataType_CAR)));
        setTag(params, dList5);
        Document normalFilter = new Document("$and", dList2);
        Document noDataFilter = new Document("$and", dList3);
        Document downFilter = new Document("$and", dList4);
        Document lessFilter = new Document("$and", dList5);
        List<Document> lists = Arrays.asList(normalFilter, noDataFilter,downFilter,lessFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -2157,18 +3464,27 @@
        for (Document doc : result) {
            dataCount = doc.getInteger("dataCount");
        }
        rList.add(0,dataCount+"");
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getViewConnectStability)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
        rList.add(0, dataCount + "");
//        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
//                .select(CheckIndexFace::getViewConnectStability)
//                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexFace::getViewConnectStability).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        BigDecimal normal = new BigDecimal(rList.get(1));
        BigDecimal noData = new BigDecimal(rList.get(2));
        BigDecimal down = new BigDecimal(rList.get(3));
        BigDecimal less = new BigDecimal(rList.get(4));
        BigDecimal totalCount = normal.add(noData).add(down).add(less);
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexFace::getViewConnectStability).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (totalCount.compareTo(BigDecimal.ZERO)>0) {
            onlineRate = normal.divide(totalCount, 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
@@ -2193,8 +3509,12 @@
        if (params.getOption() != null) {
            query.addCriteria(Criteria.where("online").is(params.getOption()));
        }
        Sort sort = Sort.by(
                Sort.Order.asc("pingOnline"), // 首先按照 pingOnline 升序排序
                Sort.Order.desc("offLineCount") // 首先按照 pingOnline 升序排序
        );
        // 通过pingOnline字段排序,为false的排在前面
        query.with(Sort.by(Sort.Order.asc("pingOnline")));
        query.with(sort);
        //分页数量
        long total = mongoTemplate.count(query, TMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
@@ -2214,11 +3534,22 @@
            } else {
                item.setOnlineStr("未知");
            }
            List<String> offLineTime = item.getOffLineTimeStr();
            if (!CollectionUtils.isEmpty(offLineTime)) {
                //后续可以改成配置的离线次数(提取前n次,n为配置的离线次数)
                if (offLineTime.size() > 1) {
                    offLineTime = offLineTime.subList(0, 2);
                }
                item.setOffLineTimeStr(offLineTime);
            }
            //添加动态数据
            List<DynamicColumnVO> list = dynamicColumnMapper.getDynamicColumnByTable(TableNameConstants.COLUMN_NAME_FACE_POINT,item.getNo());
            item.setDynamicColumnList(list);
        });
        params.setDeptTag(-1);
        params.setDeviceType(3);
// 统计设备数量
        // 统计设备数量
        //卡片统计
        int totalCount = 0;
        int onlineCount = 0;
@@ -2253,19 +3584,22 @@
            onlineCount = (Integer) result.getOrDefault("onlineCount", 0L);
            totalCount = offlineCount + unknownCount + onlineCount;
        }
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getSiteOnline)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexFace::getCreateTime, params.getStartTime(), params.getEndTime())
                .list();
//        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
//                .select(CheckIndexFace::getSiteOnline)
//                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexFace::getCreateTime, params.getStartTime(), params.getEndTime())
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexFace::getSiteOnline).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexFace::getSiteOnline).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (totalCount!=0) {
            onlineRate = new BigDecimal(onlineCount).divide(new BigDecimal(totalCount), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(totalCount + "", onlineCount + "", offlineCount + "", unknownCount + "", this.remove0(onlineRate)));
        map.put("list", resultList);
@@ -2287,10 +3621,10 @@
        andCriteria.add(Criteria.where("sxjgnlx.value").regex(pattern));
        Query query = new Query();
        Criteria and = new Criteria();
        if(params.getOption()!=null){
            if(params.getOption() ==1){
        if (params.getOption() != null) {
            if (params.getOption() == 1) {
                andCriteria.add(Criteria.where("newDevice").is(Boolean.TRUE));
            }else if(params.getOption() ==-1){
            } else if (params.getOption() == -1) {
                andCriteria.add(Criteria.where("newDevice").is(Boolean.FALSE));
            }
        }
@@ -2311,13 +3645,13 @@
        List<Document> dList1 = new ArrayList<>(2);
        setTag(params, dList1);
        dList1.add(new Document("sxjgnlx.value", new Document("$regex", ".*3.*")));
        Document totalFilter = new Document("$and",dList1);
        Document totalFilter = new Document("$and", dList1);
        //新设备数
        List<Document> dList2 = new ArrayList<>(2);
        setTag(params, dList2);
        dList2.add(new Document("sxjgnlx.value", new Document("$regex", ".*3.*")));
        dList2.add(new Document("newDevice",Boolean.TRUE));
        Document newFilter = new Document("$and",dList2);
        dList2.add(new Document("newDevice", Boolean.TRUE));
        Document newFilter = new Document("$and", dList2);
        List<Document> lists = Arrays.asList(totalFilter, newFilter);
        List<String> rList = lists.stream().map(filter -> {
@@ -2338,17 +3672,21 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getDeviceDirectoryConsistent)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
//        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
//                .select(CheckIndexFace::getDeviceDirectoryConsistent)
//                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexFace::getDeviceDirectoryConsistent).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexFace::getDeviceDirectoryConsistent).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (!StringUtils.isEmpty(rList.get(0)) && !"0".equals(rList.get(0))) {
            onlineRate = new BigDecimal(rList.get(0)).subtract(new BigDecimal(rList.get(1))).divide(new BigDecimal(rList.get(0)), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
@@ -2371,11 +3709,11 @@
        Criteria and = new Criteria();
        and.andOperator(andCriteria);
        query = Query.query(and);
        if(params.getOption()!=null){
            if(params.getOption() ==1){
        if (params.getOption() != null) {
            if (params.getOption() == 1) {
                query.addCriteria(Criteria.where("lalType").is(ApiConstants.HK_Info_LayType_Normal));
                query.addCriteria(Criteria.where("gbCodeType").is(ApiConstants.HK_Info_GbCodeType_Normal));
            }else if(params.getOption() ==-1){
            } else if (params.getOption() == -1) {
                Criteria lalType = Criteria.where("lalType").ne(ApiConstants.HK_Info_LayType_Normal);
                Criteria gbCodeType = Criteria.where("gbCodeType").ne(ApiConstants.HK_Info_GbCodeType_Normal);
                Criteria orOperator = new Criteria().orOperator(lalType, gbCodeType);
@@ -2401,9 +3739,9 @@
        List<Document> dList3 = new ArrayList<>(2);
        setTag(params, dList3);
        List<Document> errorConditions = new ArrayList<>();
        errorConditions.add(new Document("lalType",new Document("$ne",1)));
        errorConditions.add(new Document("gbCodeType",new Document("$ne",1)));
        Document errorDoc = new Document("$or",errorConditions);
        errorConditions.add(new Document("lalType", new Document("$ne", 1)));
        errorConditions.add(new Document("gbCodeType", new Document("$ne", 1)));
        Document errorDoc = new Document("$or", errorConditions);
        dList3.add(errorDoc);
        Document totalFilter = new Document("$and", dList1);
        Document correctFilter = new Document("$and", dList2);
@@ -2428,17 +3766,21 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getFaceInformationCollectionAccuracy)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
//        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
//                .select(CheckIndexFace::getFaceInformationCollectionAccuracy)
//                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexFace::getFaceInformationCollectionAccuracy).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexFace::getFaceInformationCollectionAccuracy).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (!StringUtils.isEmpty(rList.get(0)) && !"0".equals(rList.get(0))) {
            onlineRate = new BigDecimal(rList.get(1)).divide(new BigDecimal(rList.get(0)), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
@@ -2457,10 +3799,10 @@
    public Result faceImgQualification(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "cameraName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        if(params.getOption()!=null){
            if(params.getOption()==1){
        if (params.getOption() != null) {
            if (params.getOption() == 1) {
                query.addCriteria(Criteria.where("faceEligibility.unfaceEligCount").is(0));
            }else if(params.getOption()==-1){
            } else if (params.getOption() == -1) {
                query.addCriteria(Criteria.where("faceEligibility.unfaceEligCount").gt(0));
            }
        }
@@ -2469,7 +3811,7 @@
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<FaceDeviceSamplingResult> resultList = mongoTemplate.find(query, FaceDeviceSamplingResult.class);
        List<BigPicUsefulVO> voList = new ArrayList<>();
        resultList.forEach(item->{
        resultList.forEach(item -> {
            BigPicUsefulVO picVO = FaceDeviceSamplingResult.getEligeVO(item);
            voList.add(picVO);
        });
@@ -2496,20 +3838,24 @@
        }
        List<String> countList = new ArrayList<>();
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getFacePictureQualification)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
//        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
//                .select(CheckIndexFace::getFacePictureQualification)
//                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexFace::getFacePictureQualification).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        countList.add(sampleCount + "");
        countList.add(expCount + "");
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexFace::getFacePictureQualification).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (sampleCount!=0) {
            onlineRate = new BigDecimal(sampleCount-expCount).divide(new BigDecimal(sampleCount), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        countList.add(sampleCount+"");
        countList.add(expCount+"");
        countList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", countList);
@@ -2527,11 +3873,11 @@
    public Result faceCapturesImagesAccuracy(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        if(params.getOption()!=null){
        if (params.getOption() != null) {
            //当日时钟异常
            if(params.getOption()==1){
            if (params.getOption() == 1) {
                query.addCriteria(Criteria.where("majorDiffCount").gt(0));
            }else if(params.getOption()==-1){
            } else if (params.getOption() == -1) {
                //全部时钟异常
                query.addCriteria(Criteria.where("importantDiffCount").gt(0));
            }
@@ -2540,7 +3886,7 @@
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<FaceDeviceInspectionResult> resultList = mongoTemplate.find(query, FaceDeviceInspectionResult.class);
        List<SnapClockVO> resultVos = new ArrayList<>();
        resultList.forEach(item->{
        resultList.forEach(item -> {
            SnapClockVO vo = FaceDeviceInspectionResult.getVO(item);
            resultVos.add(vo);
        });
@@ -2567,7 +3913,7 @@
        Document allErrFilter = new Document("$and", dList4);
        List<Document> lists = Arrays.asList(todayFilter, todayErrFilter, allFilter,allErrFilter);
        List<Document> lists = Arrays.asList(todayFilter, todayErrFilter, allFilter, allErrFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -2586,17 +3932,24 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getFaceTimingAccuracy)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
//        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
//                .select(CheckIndexFace::getFaceTimingAccuracy)
//                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexFace::getFaceTimingAccuracy).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexFace::getFaceTimingAccuracy).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        BigDecimal normal = new BigDecimal(rList.get(0));
        BigDecimal abnormal = new BigDecimal(rList.get(1));
        BigDecimal totalCount = normal.add(abnormal);
        if (totalCount.compareTo(BigDecimal.ZERO)>0) {
            onlineRate = normal.divide(totalCount, 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
@@ -2616,11 +3969,11 @@
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        query.addCriteria(Criteria.where("dataType").is(ApiConstants.HK_DataType_FACE));
        if(params.getOption()!=null){
        if (params.getOption() != null) {
            //正常
            if(params.getOption()==1){
            if (params.getOption() == 1) {
                query.addCriteria(Criteria.where("delayCount").is(0));
            }else if(params.getOption()==-1){
            } else if (params.getOption() == -1) {
                //延迟
                query.addCriteria(Criteria.where("delayCount").gt(0));
            }
@@ -2634,15 +3987,15 @@
        List<Document> dList1 = new ArrayList<>(2);
        setTag(params, dList1);
        dList1.add(new Document("dataType" ,new Document("$eq",ApiConstants.HK_DataType_FACE)));
        dList1.add(new Document("dataType", new Document("$eq", ApiConstants.HK_DataType_FACE)));
        Document allFilter = new Document("$and", dList1);
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("dataType" ,new Document("$eq",ApiConstants.HK_DataType_FACE)));
        dList2.add(new Document("dataType", new Document("$eq", ApiConstants.HK_DataType_FACE)));
        dList2.add(new Document("delayCount", new Document("$gt", 0)));
        setTag(params, dList2);
        Document delayFilter = new Document("$and", dList2);
        List<Document> lists = Arrays.asList(allFilter,delayFilter);
        List<Document> lists = Arrays.asList(allFilter, delayFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -2662,17 +4015,21 @@
        }).collect(Collectors.toList());
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getFaceUploadTimeliness)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
//        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
//                .select(CheckIndexFace::getFaceUploadTimeliness)
//                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexFace::getFaceUploadTimeliness).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexFace::getFaceUploadTimeliness).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (!StringUtils.isEmpty(rList.get(0)) && !"0".equals(rList.get(0))) {
            onlineRate = new BigDecimal(rList.get(0)).subtract(new BigDecimal(rList.get(1))).divide(new BigDecimal(rList.get(0)), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
@@ -2691,10 +4048,10 @@
    public Result faceAvailabilityOfLargeImg(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        if(params.getOption()!=null){
            if(params.getOption()==1){
        if (params.getOption() != null) {
            if (params.getOption() == 1) {
                query.addCriteria(Criteria.where("bigUseful.bigPicExpCount").is(0));
            }else if(params.getOption()==-1){
            } else if (params.getOption() == -1) {
                query.addCriteria(Criteria.where("bigUseful.bigPicExpCount").gt(0));
            }
        }
@@ -2703,7 +4060,7 @@
        query.with(Sort.by(Sort.Order.desc("bigUseful.bigPicExpCount")));
        List<FaceDeviceSamplingResult> resultList = mongoTemplate.find(query, FaceDeviceSamplingResult.class);
        List<BigPicUsefulVO> voList = new ArrayList<>();
        resultList.forEach(item->{
        resultList.forEach(item -> {
            BigPicUsefulVO picVO = FaceDeviceSamplingResult.getPicVO(item);
            voList.add(picVO);
        });
@@ -2727,24 +4084,34 @@
            sampleCount = doc.getInteger("sampleCount");
            expCount = doc.getInteger("expCount");
        }
        //新构建聚合查询离线时间
        List<String> countList = new ArrayList<>();
        // 统计数
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getFacePictureAvailability)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
                .list();
//        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
//                .select(CheckIndexFace::getFacePictureAvailability)
//                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
//                .eq(params.getDataType().equals(2), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Dept)
//                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(params.getStartTime()), DateUtils.getDayEnd(params.getEndTime()))
//                .list();
//        BigDecimal onlineRate = BigDecimal.ZERO;
//        if (CollectionUtils.isNotEmpty(videoList)) {
//            BigDecimal sum = videoList.stream().map(CheckIndexFace::getFacePictureAvailability).reduce(BigDecimal.ZERO, BigDecimal::add);
//            BigDecimal count = BigDecimal.valueOf(videoList.size());
//            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
//        }
        countList.add(sampleCount + "");
        countList.add(expCount + "");
        BigDecimal onlineRate = BigDecimal.ZERO;
        if (CollectionUtils.isNotEmpty(videoList)) {
            BigDecimal sum = videoList.stream().map(CheckIndexFace::getFacePictureAvailability).reduce(BigDecimal.ZERO, BigDecimal::add);
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        if (sampleCount!=0) {
            onlineRate = new BigDecimal(sampleCount-expCount).divide(new BigDecimal(sampleCount), 3,RoundingMode.DOWN).multiply(new BigDecimal("100"));
        }
        countList.add(sampleCount+"");
        countList.add(expCount+"");
        countList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", countList);
        map.put("list", voList);
@@ -2794,8 +4161,8 @@
            dList.add(new Document("deptTag", new Document("$eq", Boolean.TRUE)));
        }
        Document mongoCreateTimeRange = new Document();
        if (params.getStartTime()!=null) mongoCreateTimeRange.append("$gte", params.getStartTime());
        if (params.getEndTime()!=null) mongoCreateTimeRange .append("$lt", params.getEndTime());
        if (params.getStartTime() != null) mongoCreateTimeRange.append("$gte", params.getStartTime());
        if (params.getEndTime() != null) mongoCreateTimeRange.append("$lt", params.getEndTime());
        dList.add(new Document("mongoCreateTime", mongoCreateTimeRange));
    }
}