fuliqi
2024-11-01 72dd95fdcde21b4641162d418d6fe8423bb74507
数据中心优化完成、车辆url算法优化、大图可用算法优化
12个文件已修改
3个文件已添加
1017 ■■■■ 已修改文件
ycl-common/src/main/java/constant/CalculationStrategyConstants.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/FaceDeviceInspectionResult.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/FaceDeviceSamplingResult.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/PicAccessResult.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/VehicleDeviceInspectionResult.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/VehicleDeviceSamplingResult.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/DataCenter/BigPicUsefulVO.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/DataCenter/SnapClockVO.java 114 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/CarDeviceSampleCalculation.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/CarUrlCalculation.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/FaceDeviceSampleCalculation.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java 550 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/task/CarTask.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/constant/CalculationStrategyConstants.java
@@ -13,9 +13,13 @@
     */
    public static final String Car_ViewStability = "carViewStability";
    /**
     * 车辆抓拍数据准确性、url、大图可用性
     * 车辆抓拍数据准确性、大图可用性
     */
    public static final String Car_DataAccuracy_Url_PicUsability = "carDataAccuracyUrlPicUsability";
    public static final String Car_DataAccuracy_PicUsability = "carDataAccuracyPicUsability";
    /**
     * 车辆抓拍数据准确性、大图可用性
     */
    public static final String Car_Url = "carUrl";
    /**
     * 车辆卡口属性监测结果
     */
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/FaceDeviceInspectionResult.java
@@ -1,7 +1,9 @@
package com.ycl.platform.domain.result.HK;
import com.ycl.platform.domain.result.BaseResult;
import com.ycl.platform.domain.vo.DataCenter.SnapClockVO;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import org.springframework.data.mongodb.core.index.TextIndexed;
import org.springframework.data.mongodb.core.mapping.Document;
@@ -308,4 +310,17 @@
         */
        private Integer nouniqueCount;
    }
    public static SnapClockVO getVO(FaceDeviceInspectionResult result){
        SnapClockVO snapClockVO = new SnapClockVO();
        BeanUtils.copyProperties(result,snapClockVO);
        snapClockVO.setClockPercent(result.getSnapClock().getClockPercent());
        snapClockVO.setTodayClockCount(result.getSnapClock().getTodayClockCount());
        snapClockVO.setTodayClockResult(result.getSnapClock().getTodayClockResult());
        snapClockVO.setAllClockCount(result.getSnapClock().getAllClockCount());
        snapClockVO.setAllClockResult(result.getSnapClock().getAllClockResult());
        snapClockVO.setAllClockResultText(result.getSnapClock().getAllClockResultText());
        snapClockVO.setTodayClockResultText(result.getSnapClock().getTodayClockResultText());
        return snapClockVO;
    }
}
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/FaceDeviceSamplingResult.java
@@ -1,7 +1,9 @@
package com.ycl.platform.domain.result.HK;
import com.ycl.platform.domain.result.BaseResult;
import com.ycl.platform.domain.vo.DataCenter.BigPicUsefulVO;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import org.springframework.data.mongodb.core.index.TextIndexed;
import org.springframework.data.mongodb.core.mapping.Document;
@@ -94,17 +96,6 @@
         */
        private Integer osdExpCount;
        public static BigDecimal calUrl(BigUsefulness bigUseful) {
            BigDecimal url = BigDecimal.ZERO;
            if (bigUseful.getSampleCount() != 0) {
                //图片访问正常量 = 抽检量-异常量
                BigDecimal picNormalCount = new BigDecimal(bigUseful.getSampleCount() - bigUseful.getBigPicExpCount());
                //图片抽检量
                BigDecimal sampleCount = new BigDecimal(bigUseful.getSampleCount());
                url = picNormalCount.divide(sampleCount, 4, RoundingMode.HALF_UP);
            }
            return url;
        }
    }
    @Data
@@ -124,4 +115,23 @@
         */
        private Integer unfaceEligCount;
    }
    public static BigPicUsefulVO getPicVO(FaceDeviceSamplingResult result){
        BigPicUsefulVO vo = new BigPicUsefulVO();
        BeanUtils.copyProperties(result,vo);
        vo.setBigPicExpCount(result.getBigUseful().getBigPicExpCount());
        vo.setBigUsefulPercent(result.getBigUseful().getBigUsefulPercent());
        vo.setSampleCount(result.getBigUseful().getSampleCount());
        vo.setOsdExpCount(result.getBigUseful().getOsdExpCount());
        vo.setImgDiffCount(result.getBigUseful().getImgDiffCount());
        return vo;
    }
    public static BigPicUsefulVO getEligeVO(FaceDeviceSamplingResult result){
        BigPicUsefulVO vo = new BigPicUsefulVO();
        BeanUtils.copyProperties(result,vo);
        vo.setSampleCount(result.getFaceEligibility().getSampleCount());
        vo.setUnfaceEligCount(result.getFaceEligibility().getUnfaceEligCount());
        vo.setFaceEligPercent(result.getFaceEligibility().getFaceEligPercent());
        return vo;
    }
}
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/PicAccessResult.java
@@ -5,6 +5,9 @@
import org.springframework.data.mongodb.core.index.TextIndexed;
import org.springframework.data.mongodb.core.mapping.Document;
import java.math.BigDecimal;
import java.math.RoundingMode;
/**
 * 图片访问监测结果
 *
@@ -12,8 +15,10 @@
 */
@Data
@Document(collection = "hk_pic_access")
//只存了车辆的
public class PicAccessResult extends BaseResult {
    private Integer dataType;
    /**
     * 数据类型为1时表示卡口内码,数据类型为2或11时表示人脸采集设备内码
     */
@@ -78,4 +83,15 @@
     */
    private int bigDisableCount;
    public static BigDecimal calUrl(PicAccessResult result) {
        BigDecimal url = BigDecimal.ZERO;
        if (result.getSampleCount() != 0) {
            //图片访问正常量 = 抽检量-异常量
            BigDecimal picNormalCount = new BigDecimal(result.getSampleCount() - result.getExpCount());
            //图片抽检量
            BigDecimal sampleCount = new BigDecimal(result.getSampleCount());
            url = picNormalCount.divide(sampleCount, 4, RoundingMode.HALF_UP);
        }
        return url;
    }
}
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/VehicleDeviceInspectionResult.java
@@ -1,7 +1,9 @@
package com.ycl.platform.domain.result.HK;
import com.ycl.platform.domain.result.BaseResult;
import com.ycl.platform.domain.vo.DataCenter.SnapClockVO;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import org.springframework.data.mongodb.core.index.TextIndexed;
import org.springframework.data.mongodb.core.mapping.Document;
@@ -354,4 +356,17 @@
         */
        private Integer noIntegrityCount;
    }
    public static SnapClockVO getVO(VehicleDeviceInspectionResult result){
        SnapClockVO snapClockVO = new SnapClockVO();
        BeanUtils.copyProperties(result,snapClockVO);
        snapClockVO.setClockPercent(result.getSnapClock().getClockPercent());
        snapClockVO.setTodayClockCount(result.getSnapClock().getTodayClockCount());
        snapClockVO.setTodayClockResult(result.getSnapClock().getTodayClockResult());
        snapClockVO.setAllClockCount(result.getSnapClock().getAllClockCount());
        snapClockVO.setAllClockResult(result.getSnapClock().getAllClockResult());
        snapClockVO.setAllClockResultText(result.getSnapClock().getAllClockResultText());
        snapClockVO.setTodayClockResultText(result.getSnapClock().getTodayClockResultText());
        return snapClockVO;
    }
}
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/VehicleDeviceSamplingResult.java
@@ -1,7 +1,9 @@
package com.ycl.platform.domain.result.HK;
import com.ycl.platform.domain.result.BaseResult;
import com.ycl.platform.domain.vo.DataCenter.BigPicUsefulVO;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import org.springframework.data.mongodb.core.index.TextIndexed;
import org.springframework.data.mongodb.core.mapping.Document;
@@ -83,17 +85,7 @@
         */
        private Integer osdExpCount;
        public static BigDecimal calUrl(BigUsefulness bigUseful) {
            BigDecimal url = BigDecimal.ZERO;
            if (bigUseful.getSampleCount() != 0) {
                //图片访问正常量 = 抽检量-异常量
                BigDecimal picNormalCount = new BigDecimal(bigUseful.getSampleCount() - bigUseful.getBigPicExpCount());
                //图片抽检量
                BigDecimal sampleCount = new BigDecimal(bigUseful.getSampleCount());
                url = picNormalCount.divide(sampleCount, 4, RoundingMode.HALF_UP);
            }
            return url;
        }
    }
    @Data
@@ -144,5 +136,13 @@
        private Float importantConPercent;
    }
    public static BigPicUsefulVO getPicVO(VehicleDeviceSamplingResult result){
        BigPicUsefulVO vo = new BigPicUsefulVO();
        BeanUtils.copyProperties(result,vo);
        vo.setBigPicExpCount(result.getBigUseful().getBigPicExpCount());
        vo.setBigUsefulPercent(result.getBigUseful().getBigUsefulPercent());
        vo.setSampleCount(result.getBigUseful().getSampleCount());
        vo.setOsdExpCount(result.getBigUseful().getOsdExpCount());
        return vo;
    }
}
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/DataCenter/BigPicUsefulVO.java
New file
@@ -0,0 +1,67 @@
package com.ycl.platform.domain.vo.DataCenter;
import lombok.Data;
import org.springframework.data.mongodb.core.index.TextIndexed;
@Data
public class BigPicUsefulVO {
    /**
     * 卡口内码或采集设备内码,dataType为1时表示卡口内码,dataType为11时表示采集设备内码
     */
    private String indexCode;
    /**
     * 设备或卡口国标编码
     */
    private String externalIndexCode;
    /**
     * 设备或卡口名称
     */
    private String deviceName;
    /**
     * 组织编号
     */
    private String orgCode;
    /**
     * 组织名称
     */
    private String orgName;
    /**
     * 大图可用性数据抽检量/人脸合格性抽检
     */
    private Integer sampleCount;
    /**
     * 大图可用率
     */
    private Float bigUsefulPercent;
    /**
     * 大图访问异常数据量
     */
    private Integer bigPicExpCount;
    /**
     * OSD标注异常数据量
     */
    private Integer osdExpCount;
    /**
     * 人脸大小图不一致数据量:小图不在大图中
     */
    private Integer imgDiffCount;
    /**
     * 人脸合格率
     */
    private Float faceEligPercent;
    /**
     * 人脸不唯一量
     */
    private Integer unfaceEligCount;
}
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/DataCenter/SnapClockVO.java
New file
@@ -0,0 +1,114 @@
package com.ycl.platform.domain.vo.DataCenter;
import com.ycl.platform.domain.result.BaseResult;
import lombok.Data;
import org.springframework.data.mongodb.core.index.TextIndexed;
import org.springframework.data.mongodb.core.mapping.Document;
/**
 * 车辆设备全检指标监测结果:车辆(车辆卡口设备时钟准确性、)
 *
 * @author gonghl
 */
@Data
public class SnapClockVO extends BaseResult {
    /**
     * 设备编号,dataType为1时表示卡口内码,dataType为11时表示采集设备内码
     */
    @TextIndexed
    private String externalIndexCode;
    /**
     * 设备名称
     */
    @TextIndexed
    private String deviceName;
    /**
     * 卡口内码或采集设备内码
     */
    @TextIndexed
    private String indexCode;
    /**
     * 组织编号
     */
    @TextIndexed
    private String orgCode;
    /**
     * 组织名称
     */
    @TextIndexed
    private String orgName;
    /**
     * 当日接收到的当日抓拍量
     */
    private Integer dataCount;
    /**
     * 当日接收到的白天抓拍量
     */
    private Integer daySnapCount;
    /**
     * 当日接收到的非当日抓拍量
     */
    private Integer noTodayCount;
    /**
     * 持续无数据天数
     */
    private Integer continueNoDataCount;
    /**
     * 抓拍数据量监测结果,1:正常 2:无数据 4:数据量少
     */
    private Integer snapResult;
    /**
     * 抓拍数据量监测结果,1:正常 2:无数据 4:数据量少
     */
    private String snapResultText;
    // 以下为嵌套对象的字段
    /**
     * 时钟准确率:1 == 100%
     */
    private Float clockPercent;
    /**
     * 当日接收的当日抓拍数据时钟准确数据量
     */
    private Integer todayClockCount;
    /**
     * 当日接收的当日抓拍数据时钟准确性判定结果:1是合格,0是不合格
     */
    private Integer todayClockResult;
    /**
     * 当日接收的当日抓拍数据时钟准确性判定结果:1是合格,0是不合格
     */
    private String todayClockResultText;
    /**
     * 当日接收的全部抓拍数据时钟准确数据量
     */
    private Integer allClockCount;
    /**
     * 当日接收的全部抓拍数据时钟准确性判定结果:1是合格,0是不合格
     */
    private Integer allClockResult;
    /**
     * 当日接收的全部抓拍数据时钟准确性判定结果:1是合格,0是不合格
     */
    private String allClockResultText;
}
ycl-server/src/main/java/com/ycl/calculate/CarDeviceSampleCalculation.java
@@ -38,10 +38,10 @@
        int accuracySites = 0;
        //属性识别准确的重点点位数
        int importantAccuracySites = 0;
        //url可访问的点位数
        int urlUsabilitySites = 0;
        //图片可用的点位数
        int picUsabilitySites = 0;
        //图片总点位数
        int picSites = 0;
    }
    @Override
@@ -86,25 +86,24 @@
                stats.importantAccuracySites++;
            }
        }
        //大图可用率大于90%视为合格
        if (bigUseful.getBigUsefulPercent() >= 0.9) {
            stats.picUsabilitySites++;
        }
        //图片访问率>=90% 视为合格
        if (VehicleDeviceSamplingResult.BigUsefulness.calUrl(bigUseful).compareTo(new BigDecimal("0.9")) >= 0) {
            stats.urlUsabilitySites++;
        //只计算抽检的
        if(bigUseful.getSampleCount() !=0){
            stats.picSites++;
            //大图可用率大于90%视为合格,
            if (bigUseful.getBigUsefulPercent() >= 0.9) {
                stats.picUsabilitySites++;
            }
        }
    }
    /**
     * 车辆抓拍数据准确性、url可用性、大图可用性
     * 车辆抓拍数据准确性、大图可用性
     */
    private CheckIndexCar createOrUpdateCheckIndexCar(String key, AreaStats stats, List<CheckIndexCar> checkIndexCarList) {
        CheckIndexCar checkIndexCar = getCheckIndex(key, checkIndexCarList, CheckIndexCar.class);
        if (checkIndexCar == null) {
            return null;
        }
        log.info("key:{},车辆抓拍数据准确性:totalSites:{},importantTotalSites:{},accuracySites:{},importantAccuracySites:{}", key, stats.totalSites, stats.importantTotalSites, stats.accuracySites, stats.importantAccuracySites);
        //调用车辆抓拍数据准确性计算方法
        Map<String, Object> accuracyParam = new HashMap<>();
        accuracyParam.put("totalSites", stats.totalSites);
@@ -113,17 +112,9 @@
        accuracyParam.put("importantAccuracySites", stats.importantAccuracySites);
        BigDecimal dataAccuracy = dataAccuracy(accuracyParam);
        checkIndexCar.setVehicleCaptureAccuracy(dataAccuracy);
        log.info("url可用性: totalSites:{},urlQualifySites:{}", stats.totalSites, stats.urlUsabilitySites);
        //调用url可用性计算方法
        Map<String, Object> urlParam = new HashMap<>();
        urlParam.put("totalSites", stats.totalSites);
        urlParam.put("urlQualifySites", stats.urlUsabilitySites);
        BigDecimal urlUsability = urlUsability(urlParam);
        checkIndexCar.setVehicleUrlAvailability(urlUsability);
        log.info("大图可用性: totalSites:{},picUsabilitySites:{}", stats.totalSites, stats.picUsabilitySites);
        //调用大图可用性计算方法
        Map<String, Object> usabilityParam = new HashMap<>();
        usabilityParam.put("totalSites", stats.totalSites);
        usabilityParam.put("totalSites", stats.picSites);
        usabilityParam.put("picUsabilitySites", stats.picUsabilitySites);
        BigDecimal picUsability = picUsability(usabilityParam);
        checkIndexCar.setVehiclePictureAvailability(picUsability);
ycl-server/src/main/java/com/ycl/calculate/CarUrlCalculation.java
New file
@@ -0,0 +1,93 @@
package com.ycl.calculate;
import com.ycl.platform.domain.entity.CheckIndexCar;
import com.ycl.platform.domain.result.HK.PicAccessResult;
import com.ycl.platform.domain.result.HK.VehicleDeviceSamplingResult;
import com.ycl.platform.mapper.CheckIndexCarMapper;
import com.ycl.platform.service.ICheckIndexCarService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import utils.DateUtils;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 计算车辆抓拍数据准确性、url可用性、大图可用性
 * 车辆数据抽检接口
 * 获取分省厅、区域的map<k,v> k为deptId或者Province_deptId
 * 更新或新增
 */
@Component
@Slf4j
public class CarUrlCalculation extends IndexCalculationServe<PicAccessResult, CarUrlCalculation.AreaStats> implements CalculationStrategy<PicAccessResult> {
    @Autowired
    private CheckIndexCarMapper checkIndexCarMapper;
    @Autowired
    private ICheckIndexCarService checkIndexCarService;
    //区域车辆抽检指标
    protected static class AreaStats {
        int totalSites = 0;
        //url可访问的点位数
        int urlUsabilitySites = 0;
    }
    @Override
    public void calculate(List<PicAccessResult> list) {
        //获取分区域的指标数量
        Map<String, CarUrlCalculation.AreaStats> areaStatsMap = getAreaStatsMap(list,Boolean.FALSE);
        if (areaStatsMap == null) return;
        // 查询是否index表已经存在今日数据
        List<CheckIndexCar> checkIndexCarList = checkIndexCarMapper.selectToday(DateUtils.getDate());
        List<CheckIndexCar> checkIndexCars = new ArrayList<>();
        areaStatsMap.forEach((deptId, stats) -> {
            if (stats.totalSites > 0) {
                CheckIndexCar checkIndexCar = createOrUpdateCheckIndexCar(deptId, stats, checkIndexCarList);
                if (checkIndexCar != null) {
                    checkIndexCars.add(checkIndexCar);
                }
            }
        });
        checkIndexCarService.saveOrUpdateBatch(checkIndexCars);
    }
    /**
     * 累计抓拍数据准确设备数和设备总数,区分重点点位
     */
    @Override
    public void updateAreaStats(Map<String, AreaStats> areaStatsMap, String key, PicAccessResult result) {
        //返回对象的引用,如果不存在会放入新的key,value
        AreaStats stats = areaStatsMap.computeIfAbsent(key, k -> new AreaStats());
        stats.totalSites++;
        //图片访问率>=90% 视为合格
        if (PicAccessResult.calUrl(result).compareTo(new BigDecimal("0.9")) >= 0) {
            stats.urlUsabilitySites++;
        }
    }
    /**
     * 车辆url可用性
     */
    private CheckIndexCar createOrUpdateCheckIndexCar(String key, AreaStats stats, List<CheckIndexCar> checkIndexCarList) {
        CheckIndexCar checkIndexCar = getCheckIndex(key, checkIndexCarList, CheckIndexCar.class);
        if (checkIndexCar == null) {
            return null;
        }
        //调用url可用性计算方法
        Map<String, Object> urlParam = new HashMap<>();
        urlParam.put("totalSites", stats.totalSites);
        urlParam.put("urlQualifySites", stats.urlUsabilitySites);
        BigDecimal urlUsability = urlUsability(urlParam);
        checkIndexCar.setVehicleUrlAvailability(urlUsability);
        return checkIndexCar;
    }
}
ycl-server/src/main/java/com/ycl/calculate/FaceDeviceSampleCalculation.java
@@ -42,6 +42,8 @@
        int picQualifySites = 0;
        //图片可用的点位数
        int picUsabilitySites = 0;
        //图片总点位数
        int picSites = 0;
    }
    @Override
@@ -81,8 +83,10 @@
                stats.picQualifySites++;
            }
        }
        //大图可用率大于90%视为合格
        if (bigUseful != null) {
        //只计算抽检的
        if(bigUseful.getSampleCount() !=0){
            stats.picSites++;
            //大图可用率大于90%视为合格,
            if (bigUseful.getBigUsefulPercent() >= 0.9) {
                stats.picUsabilitySites++;
            }
@@ -105,7 +109,7 @@
        checkIndexFace.setFacePictureQualification(dataQualify);
        //调用大图可用性计算方法
        Map<String, Object> usabilityParam = new HashMap<>();
        usabilityParam.put("totalSites", stats.totalSites);
        usabilityParam.put("totalSites", stats.picSites);
        usabilityParam.put("picUsabilitySites", stats.picUsabilitySites);
        BigDecimal picUsability = picUsability(usabilityParam);
        checkIndexFace.setFacePictureAvailability(picUsability);
ycl-server/src/main/java/com/ycl/factory/IndexCalculationFactory.java
@@ -27,7 +27,9 @@
        //车辆数据抓拍完整性
        calculatorClasses.put(CalculationStrategyConstants.Car_DataIntegrity, CarDataIntegrityCalculation.class);
        //车辆数据抓拍准确性、url、大图可用
        calculatorClasses.put(CalculationStrategyConstants.Car_DataAccuracy_Url_PicUsability, CarDeviceSampleCalculation.class);
        calculatorClasses.put(CalculationStrategyConstants.Car_DataAccuracy_PicUsability, CarDeviceSampleCalculation.class);
        //车辆url
        calculatorClasses.put(CalculationStrategyConstants.Car_Url, CarUrlCalculation.class);
        //车辆时钟准确性
        calculatorClasses.put(CalculationStrategyConstants.Car_ClockAccuracy, CarClockAccuracyCalculation.class);
        //车辆目录一致
ycl-server/src/main/java/com/ycl/platform/service/impl/DataCenterServiceImpl.java
@@ -13,7 +13,9 @@
import com.ycl.platform.domain.result.HK.*;
import com.ycl.platform.domain.result.SYS.TMonitorResult;
import com.ycl.platform.domain.result.UY.*;
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.mapper.ImageResourceSecurityDetailMapper;
@@ -1566,8 +1568,12 @@
            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);
                orOperator.andOperator(andCriteria);
                query = Query.query(orOperator);
            }
        }
@@ -1588,8 +1594,8 @@
        List<Document> dList3 = new ArrayList<>(2);
        setTag(params, dList3);
        List<Document> errorConditions = new ArrayList<>();
        errorConditions.add(new Document("lalType",new Document("$eq",-1)));
        errorConditions.add(new Document("gbCodeType",new Document("$eq",-1)));
        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);
@@ -1644,7 +1650,15 @@
    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()==1){
                 query.addCriteria(Criteria.where("noIntegrityCount").gt(0));
            }else if(params.getOption()==-1){
                //属性不完整
                query.addCriteria(Criteria.where("mainNoIntegrityCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, DataIntegrityMonitoringResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<DataIntegrityMonitoringResult> resultList = mongoTemplate.find(query, DataIntegrityMonitoringResult.class);
@@ -1653,11 +1667,33 @@
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_data_integrity_monitoring");
        Date now = new Date();
        //抓拍量求和
        // 构建基本的$match条件
        List<Document> matchConditions = new ArrayList<>();
        setTag(params, matchConditions);
        List<Document> pipeline = Arrays.asList(
                new Document("$match", new Document("$and", matchConditions)),
                new Document("$group", new Document("_id", "$mongoCreateTime")
                        .append("dataCount", new Document("$sum", "$dataCount"))
                        .append("noIntegrityCount", new Document("$sum", "$noIntegrityCount"))
                        .append("mainNoIntegrityCount", new Document("$sum", "$mainNoIntegrityCount"))
                ));
        // 执行聚合查询并获取结果
        AggregateIterable<Document> result = collection.aggregate(pipeline);
        int dataCount = 0;
        int noIntegrityCount = 0;
        int mainNoIntegrityCount = 0;
        for (Document doc : result) {
            dataCount = doc.getInteger("dataCount");
            noIntegrityCount = doc.getInteger("noIntegrityCount");
            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)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .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)) {
@@ -1665,9 +1701,13 @@
            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(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(this.remove0(onlineRate)));
        map.put("count", countList);
        map.put("list", resultList);
        return Result.ok().data(map).total(total);
    }
@@ -1682,16 +1722,49 @@
    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()==1){
                query.addCriteria(Criteria.where("majorDiffCount").gt(0));
            }else if(params.getOption()==-1){
                //重要属性不一致
                query.addCriteria(Criteria.where("importantDiffCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, AttrRecognitionMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<AttrRecognitionMonitorResult> resultList = mongoTemplate.find(query, AttrRecognitionMonitorResult.class);
        Date now = new Date();
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_attr_recognition_monitor");
        // 构建基本的$match条件
        List<Document> matchConditions = new ArrayList<>();
        setTag(params, matchConditions);
        List<Document> pipeline = Arrays.asList(
                new Document("$match", new Document("$and", matchConditions)),
                new Document("$group", new Document("_id", "$mongoCreateTime")
                        .append("sampleCount", new Document("$sum", "$sampleCount"))
                        .append("majorDiffCount", new Document("$sum", "$majorDiffCount"))
                        .append("importantDiffCount", new Document("$sum", "$importantDiffCount"))
                ));
        // 执行聚合查询并获取结果
        AggregateIterable<Document> result = collection.aggregate(pipeline);
        int sampleCount = 0;
        int majorDiffCount = 0;
        int importantDiffCount = 0;
        for (Document doc : result) {
            sampleCount = doc.getInteger("sampleCount");
            majorDiffCount = doc.getInteger("majorDiffCount");
            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)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .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)) {
@@ -1699,8 +1772,14 @@
            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(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(this.remove0(onlineRate)));
        map.put("count", countList);
        map.put("list", resultList);
        return Result.ok().data(map).total(total);
    }
@@ -1715,30 +1794,46 @@
    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()==1){
                query.addCriteria(Criteria.where("majorDiffCount").gt(0));
            }else if(params.getOption()==-1){
                //全部时钟异常
                query.addCriteria(Criteria.where("importantDiffCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, VehicleDeviceInspectionResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<VehicleDeviceInspectionResult> resultList = mongoTemplate.find(query, VehicleDeviceInspectionResult.class);
        List<SnapClockVO> resultVos = new ArrayList<>();
        resultList.forEach(item->{
            SnapClockVO vo = VehicleDeviceInspectionResult.getVO(item);
            resultVos.add(vo);
        });
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_vehicle_device_inspection");
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("snapResult", new Document("$eq", 1)));
        dList1.add(new Document("snapClock.todayClockResult", new Document("$eq", 1)));
        setTag(params, dList1);
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("snapResult", new Document("$eq", 2)));
        dList2.add(new Document("snapClock.todayClockResult", new Document("$eq", 0)));
        setTag(params, dList2);
        List<Document> dList3 = new ArrayList<>(2);
        dList3.add(new Document("snapResult", new Document("$eq", 4)));
        dList3.add(new Document("snapClock.allClockResult", new Document("$eq", 1)));
        setTag(params, dList3);
        Document ipErrFilter = new Document("$and", dList1);
        Document macdzErrFilter = new Document("$and", dList2);
        Document longitudeErrFilter = new Document("$and", dList3);
        List<Document> dList4 = new ArrayList<>(2);
        dList4.add(new Document("snapClock.allClockResult", new Document("$eq", 0)));
        setTag(params, dList4);
        Document todayFilter = new Document("$and", dList1);
        Document todayErrFilter = new Document("$and", dList2);
        Document allFilter = new Document("$and", dList3);
        Document allErrFilter = new Document("$and", dList4);
        List<Document> lists = Arrays.asList(ipErrFilter, macdzErrFilter, longitudeErrFilter);
        List<Document> lists = Arrays.asList(todayFilter, todayErrFilter, allFilter,allErrFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -1757,11 +1852,11 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getVehicleTimingAccuracy)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .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)) {
@@ -1772,7 +1867,7 @@
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", rList);
        map.put("list", resultList);
        map.put("list", resultVos);
        return Result.ok().data(map).total(total);
    }
@@ -1786,17 +1881,58 @@
    public Result vehicleTimelyUploadAccuracy(DataCenterQuery params) {
        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()==1){
                query.addCriteria(Criteria.where("delayCount").is(0));
            }else if(params.getOption()==-1){
                //延迟
                query.addCriteria(Criteria.where("delayCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, SnapshotDelayMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<SnapshotDelayMonitorResult> resultList = mongoTemplate.find(query, SnapshotDelayMonitorResult.class);
        // 统计数
        Date now = new Date();
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_snapshop_delay_monitor");
        List<Document> dList1 = new ArrayList<>(2);
        setTag(params, dList1);
        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("delayCount", new Document("$gt", 0)));
        setTag(params, dList2);
        Document delayFilter = new Document("$and", dList2);
        List<Document> lists = Arrays.asList(allFilter,delayFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
                    new Document("$match", filter),
                    // $group 去重
                    new Document("$group", new Document("_id", "$externalIndexCode")),
                    new Document("$count", "uniqueDeviceIds")
            );
            // 执行聚合查询并获取结果
            AggregateIterable<Document> result = collection.aggregate(pipeline);
            Integer uniqueDeviceIdCount = 0;
            for (Document doc : result) {
                uniqueDeviceIdCount = doc.getInteger("uniqueDeviceIds");
                break; // 不需要继续遍历,因为 $count 只会产生一个结果
            }
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getVehicleUploadTimeliness)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .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)) {
@@ -1804,8 +1940,9 @@
            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", Arrays.asList(this.remove0(onlineRate)));
        map.put("count", rList);
        map.put("list", resultList);
        return Result.ok().data(map).total(total);
    }
@@ -1820,17 +1957,44 @@
    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){
                query.addCriteria(Criteria.where("expCount").is(0));
            }else if(params.getOption()==-1){
                query.addCriteria(Criteria.where("expCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, PicAccessResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        query.with(Sort.by(Sort.Order.desc("expCount")));
        List<PicAccessResult> resultList = mongoTemplate.find(query, PicAccessResult.class);
        // 统计数
        Date now = new Date();
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_pic_access");
        // 构建基本的$match条件
        List<Document> matchConditions = new ArrayList<>();
        setTag(params, matchConditions);
        List<Document> pipeline = Arrays.asList(
                new Document("$match", new Document("$and", matchConditions)),
                new Document("$group", new Document("_id", "$mongoCreateTime")
                        .append("sampleCount", new Document("$sum", "$sampleCount"))
                        .append("expCount", new Document("$sum", "$expCount"))
                ));
        // 执行聚合查询并获取结果
        AggregateIterable<Document> result = collection.aggregate(pipeline);
        int sampleCount = 0;
        int expCount = 0;
        for (Document doc : result) {
            sampleCount = doc.getInteger("sampleCount");
            expCount = doc.getInteger("expCount");
        }
        List<CheckIndexCar> videoList = new LambdaQueryChainWrapper<>(checkIndexCarService.getBaseMapper())
                .select(CheckIndexCar::getVehicleUrlAvailability)
                .eq(params.getDataType().equals(1), CheckIndexCar::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .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)) {
@@ -1838,8 +2002,13 @@
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            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(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(this.remove0(onlineRate)));
        map.put("count", rList);
        map.put("list", resultList);
        return Result.ok().data(map).total(total);
    }
@@ -1854,17 +2023,48 @@
    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){
                query.addCriteria(Criteria.where("bigUseful.bigPicExpCount").is(0));
            }else if(params.getOption()==-1){
                query.addCriteria(Criteria.where("bigUseful.bigPicExpCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, VehicleDeviceSamplingResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        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->{
            BigPicUsefulVO picVO = VehicleDeviceSamplingResult.getPicVO(item);
            voList.add(picVO);
        });
        // 统计数
        Date now = new Date();
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_vehicle_device_sampling");
        // 构建基本的$match条件
        List<Document> matchConditions = new ArrayList<>();
        setTag(params, matchConditions);
        List<Document> pipeline = Arrays.asList(
                new Document("$match", new Document("$and", matchConditions)),
                new Document("$group", new Document("_id", "$mongoCreateTime")
                        .append("sampleCount", new Document("$sum", "$bigUseful.sampleCount"))
                        .append("expCount", new Document("$sum", "$bigUseful.bigPicExpCount"))
                ));
        // 执行聚合查询并获取结果
        AggregateIterable<Document> result = collection.aggregate(pipeline);
        int sampleCount = 0;
        int expCount = 0;
        for (Document doc : result) {
            sampleCount = doc.getInteger("sampleCount");
            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)
                .between(CheckIndexCar::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .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)) {
@@ -1872,9 +2072,12 @@
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        countList.add(sampleCount+"");
        countList.add(expCount+"");
        countList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(this.remove0(onlineRate)));
        map.put("list", resultList);
        map.put("count", countList);
        map.put("list", voList);
        return Result.ok().data(map).total(total);
    }
@@ -1938,6 +2141,7 @@
            }
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        //抓拍量求和
        // 构建基本的$match条件
        List<Document> matchConditions = new ArrayList<>();
        setTag(params, matchConditions);
@@ -2162,33 +2366,50 @@
    @Override
    public Result faceCollectionConsistency(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "crossName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        List<Criteria> 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){
                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){
                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);
                orOperator.andOperator(andCriteria);
                query = Query.query(orOperator);
            }
        }
        long total = mongoTemplate.count(query, CrossDetailResult.class);
        long total = mongoTemplate.count(query, MonitoringDetailResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<CrossDetailResult> resultList = mongoTemplate.find(query, CrossDetailResult.class);
        List<MonitoringDetailResult> resultList = mongoTemplate.find(query, MonitoringDetailResult.class);
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_cross_detail");
        MongoCollection<Document> collection = database.getCollection("hk_monitoring_detail");
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("lalType", new Document("$eq", 1)));
        setTag(params, dList1);
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("lalType", new Document("$eq", 2)));
        dList2.add(new Document("lalType", new Document("$eq", 1)));
        dList2.add(new Document("gbCodeType", new Document("$eq", 1)));
        setTag(params, dList2);
        List<Document> dList3 = new ArrayList<>(2);
        dList3.add(new Document("lalType", new Document("$eq", 3)));
        setTag(params, dList3);
        List<Document> dList4 = new ArrayList<>(2);
        dList4.add(new Document("lalType", new Document("$eq", 4)));
        setTag(params, dList4);
        Document ipErrFilter = new Document("$and", dList1);
        Document macdzErrFilter = new Document("$and", dList2);
        Document latitudeErrFilter = new Document("$and", dList3);
        Document longitudeErrFilter = new Document("$and", dList4);
        List<Document> lists = Arrays.asList(ipErrFilter, macdzErrFilter, latitudeErrFilter, longitudeErrFilter);
        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);
        dList3.add(errorDoc);
        Document totalFilter = new Document("$and", dList1);
        Document correctFilter = new Document("$and", dList2);
        Document errorFilter = new Document("$and", dList3);
        List<Document> lists = Arrays.asList(totalFilter, correctFilter, errorFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -2207,11 +2428,11 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getFaceInformationCollectionAccuracy)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .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)) {
@@ -2236,56 +2457,50 @@
    public Result faceImgQualification(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "cameraName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        long total = mongoTemplate.count(query, MonitoringDetailResult.class);
        if(params.getOption()!=null){
            if(params.getOption()==1){
                query.addCriteria(Criteria.where("faceEligibility.unfaceEligCount").is(0));
            }else if(params.getOption()==-1){
                query.addCriteria(Criteria.where("faceEligibility.unfaceEligCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, FaceDeviceSamplingResult.class);
        query.with(Sort.by(Sort.Order.desc("faceEligibility.unfaceEligCount")));
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<MonitoringDetailResult> resultList = mongoTemplate.find(query, MonitoringDetailResult.class);
        List<FaceDeviceSamplingResult> resultList = mongoTemplate.find(query, FaceDeviceSamplingResult.class);
        List<BigPicUsefulVO> voList = new ArrayList<>();
        resultList.forEach(item->{
            BigPicUsefulVO picVO = FaceDeviceSamplingResult.getEligeVO(item);
            voList.add(picVO);
        });
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_monitoring_detail");
        MongoCollection<Document> collection = database.getCollection("hk_face_device_sampling");
        // 构建基本的$match条件
        List<Document> matchConditions = new ArrayList<>();
        setTag(params, matchConditions);
        List<Document> pipeline = Arrays.asList(
                new Document("$match", new Document("$and", matchConditions)),
                new Document("$group", new Document("_id", "$mongoCreateTime")
                        .append("sampleCount", new Document("$sum", "$faceEligibility.sampleCount"))
                        .append("expCount", new Document("$sum", "$faceEligibility.unfaceEligCount"))
                ));
        // 执行聚合查询并获取结果
        AggregateIterable<Document> result = collection.aggregate(pipeline);
        int sampleCount = 0;
        int expCount = 0;
        for (Document doc : result) {
            sampleCount = doc.getInteger("sampleCount");
            expCount = doc.getInteger("expCount");
        }
        List<String> countList = new ArrayList<>();
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("lalType", new Document("$eq", 1)));
        setTag(params, dList1);
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("lalType", new Document("$eq", 2)));
        setTag(params, dList2);
        List<Document> dList3 = new ArrayList<>(2);
        dList3.add(new Document("lalType", new Document("$eq", 3)));
        setTag(params, dList3);
        List<Document> dList4 = new ArrayList<>(2);
        dList4.add(new Document("lalType", new Document("$eq", 4)));
        setTag(params, dList4);
        Document ipErrFilter = new Document("$and", dList1);
        Document macdzErrFilter = new Document("$and", dList2);
        Document latitudeErrFilter = new Document("$and", dList3);
        Document longitudeErrFilter = new Document("$and", dList4);
        List<Document> lists = Arrays.asList(ipErrFilter, macdzErrFilter, latitudeErrFilter, longitudeErrFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
                    new Document("$match", filter),
                    // $group 去重
                    new Document("$group", new Document("_id", "$externalIndexCode")),
                    new Document("$count", "uniqueDeviceIds")
            );
            // 执行聚合查询并获取结果
            AggregateIterable<Document> result = collection.aggregate(pipeline);
            Integer uniqueDeviceIdCount = 0;
            for (Document doc : result) {
                uniqueDeviceIdCount = doc.getInteger("uniqueDeviceIds");
                break; // 不需要继续遍历,因为 $count 只会产生一个结果
            }
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getFacePictureQualification)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .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)) {
@@ -2293,10 +2508,12 @@
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        rList.add(this.remove0(onlineRate));
        countList.add(sampleCount+"");
        countList.add(expCount+"");
        countList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", rList);
        map.put("list", resultList);
        map.put("count", countList);
        map.put("list", voList);
        return Result.ok().data(map).total(total);
    }
@@ -2310,29 +2527,47 @@
    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()==1){
                query.addCriteria(Criteria.where("majorDiffCount").gt(0));
            }else if(params.getOption()==-1){
                //全部时钟异常
                query.addCriteria(Criteria.where("importantDiffCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, FaceDeviceInspectionResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<FaceDeviceInspectionResult> resultList = mongoTemplate.find(query, FaceDeviceInspectionResult.class);
        List<SnapClockVO> resultVos = new ArrayList<>();
        resultList.forEach(item->{
            SnapClockVO vo = FaceDeviceInspectionResult.getVO(item);
            resultVos.add(vo);
        });
        // 统计数量
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_vehicle_device_inspection");
        MongoCollection<Document> collection = database.getCollection("hk_face_device_inspection");
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("snapResult", new Document("$eq", 1)));
        dList1.add(new Document("snapClock.todayClockResult", new Document("$eq", 1)));
        setTag(params, dList1);
        List<Document> dList2 = new ArrayList<>(2);
        dList2.add(new Document("snapResult", new Document("$eq", 2)));
        dList2.add(new Document("snapClock.todayClockResult", new Document("$eq", 0)));
        setTag(params, dList2);
        List<Document> dList3 = new ArrayList<>(2);
        dList3.add(new Document("snapResult", new Document("$eq", 4)));
        dList3.add(new Document("snapClock.allClockResult", new Document("$eq", 1)));
        setTag(params, dList3);
        Document ipErrFilter = new Document("$and", dList1);
        Document macdzErrFilter = new Document("$and", dList2);
        Document longitudeErrFilter = new Document("$and", dList3);
        List<Document> dList4 = new ArrayList<>(2);
        dList4.add(new Document("snapClock.allClockResult", new Document("$eq", 0)));
        setTag(params, dList4);
        Document todayFilter = new Document("$and", dList1);
        Document todayErrFilter = new Document("$and", dList2);
        Document allFilter = new Document("$and", dList3);
        Document allErrFilter = new Document("$and", dList4);
        List<Document> lists = Arrays.asList(ipErrFilter, macdzErrFilter, longitudeErrFilter);
        List<Document> lists = Arrays.asList(todayFilter, todayErrFilter, allFilter,allErrFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -2351,11 +2586,11 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getFaceTimingAccuracy)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .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)) {
@@ -2366,7 +2601,7 @@
        rList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", rList);
        map.put("list", resultList);
        map.put("list", resultVos);
        return Result.ok().data(map).total(total);
    }
@@ -2380,29 +2615,34 @@
    public Result faceTimelyUpload(DataCenterQuery params) {
        List<String> likeFileds = Arrays.asList("externalIndexCode", "deviceName");
        Query query = MongoUtil.getQuery(params, TIME_FIELD, likeFileds, null);
        long total = mongoTemplate.count(query, FaceDeviceInspectionResult.class);
        query.addCriteria(Criteria.where("dataType").is(ApiConstants.HK_DataType_FACE));
        if(params.getOption()!=null){
            //正常
            if(params.getOption()==1){
                query.addCriteria(Criteria.where("delayCount").is(0));
            }else if(params.getOption()==-1){
                //延迟
                query.addCriteria(Criteria.where("delayCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, SnapshotDelayMonitorResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        List<FaceDeviceInspectionResult> resultList = mongoTemplate.find(query, FaceDeviceInspectionResult.class);
        // 统计数量
        List<SnapshotDelayMonitorResult> resultList = mongoTemplate.find(query, SnapshotDelayMonitorResult.class);
        // 统计数
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_vehicle_device_inspection");
        MongoCollection<Document> collection = database.getCollection("hk_snapshop_delay_monitor");
        List<Document> dList1 = new ArrayList<>(2);
        dList1.add(new Document("snapResult", new Document("$eq", 1)));
        setTag(params, dList1);
        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("snapResult", new Document("$eq", 2)));
        dList2.add(new Document("dataType" ,new Document("$eq",ApiConstants.HK_DataType_FACE)));
        dList2.add(new Document("delayCount", new Document("$gt", 0)));
        setTag(params, dList2);
        List<Document> dList3 = new ArrayList<>(2);
        dList3.add(new Document("snapResult", new Document("$eq", 4)));
        setTag(params, dList3);
        Document ipErrFilter = new Document("$and", dList1);
        Document macdzErrFilter = new Document("$and", dList2);
        Document longitudeErrFilter = new Document("$and", dList3);
        Document delayFilter = new Document("$and", dList2);
        List<Document> lists = Arrays.asList(ipErrFilter, macdzErrFilter, longitudeErrFilter);
        List<Document> lists = Arrays.asList(allFilter,delayFilter);
        List<String> rList = lists.stream().map(filter -> {
            // 构建聚合管道
            List<Document> pipeline = Arrays.asList(
@@ -2421,11 +2661,12 @@
            return uniqueDeviceIdCount + "";
        }).collect(Collectors.toList());
        Date now = new Date();
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getFaceUploadTimeliness)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .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)) {
@@ -2450,17 +2691,50 @@
    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){
                query.addCriteria(Criteria.where("bigUseful.bigPicExpCount").is(0));
            }else if(params.getOption()==-1){
                query.addCriteria(Criteria.where("bigUseful.bigPicExpCount").gt(0));
            }
        }
        long total = mongoTemplate.count(query, FaceDeviceSamplingResult.class);
        MongoUtil.setPage(query, params, TIME_FIELD);
        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->{
            BigPicUsefulVO picVO = FaceDeviceSamplingResult.getPicVO(item);
            voList.add(picVO);
        });
        // 统计数
        MongoDatabase database = mongoTemplate.getDb();
        MongoCollection<Document> collection = database.getCollection("hk_face_device_sampling");
        // 构建基本的$match条件
        List<Document> matchConditions = new ArrayList<>();
        setTag(params, matchConditions);
        List<Document> pipeline = Arrays.asList(
                new Document("$match", new Document("$and", matchConditions)),
                new Document("$group", new Document("_id", "$mongoCreateTime")
                        .append("sampleCount", new Document("$sum", "$bigUseful.sampleCount"))
                        .append("expCount", new Document("$sum", "$bigUseful.bigPicExpCount"))
                ));
        // 执行聚合查询并获取结果
        AggregateIterable<Document> result = collection.aggregate(pipeline);
        int sampleCount = 0;
        int expCount = 0;
        for (Document doc : result) {
            sampleCount = doc.getInteger("sampleCount");
            expCount = doc.getInteger("expCount");
        }
        List<String> countList = new ArrayList<>();
        // 统计数
        Date now = new Date();
        List<CheckIndexFace> videoList = new LambdaQueryChainWrapper<>(checkIndexFaceService.getBaseMapper())
                .select(CheckIndexFace::getFacePictureAvailability)
                .eq(params.getDataType().equals(1), CheckIndexFace::getExamineTag, CheckConstants.Examine_Tag_Province)
                .between(CheckIndexFace::getCreateTime, DateUtils.getDayStart(now), DateUtils.getDayEnd(now))
                .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)) {
@@ -2468,10 +2742,12 @@
            BigDecimal count = BigDecimal.valueOf(videoList.size());
            onlineRate = sum.divide(count, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100));
        }
        countList.add(sampleCount+"");
        countList.add(expCount+"");
        countList.add(this.remove0(onlineRate));
        HashMap<String, Object> map = new HashMap<>();
        map.put("count", Arrays.asList(this.remove0(onlineRate)));
        map.put("list", resultList);
        map.put("count", countList);
        map.put("list", voList);
        return Result.ok().data(map).total(total);
    }
ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java
@@ -14,10 +14,7 @@
import com.ycl.platform.domain.query.DataCenterQuery;
import com.ycl.platform.domain.query.HomeQuery;
import com.ycl.platform.domain.result.BaseResult;
import com.ycl.platform.domain.result.HK.FaceDeviceInspectionResult;
import com.ycl.platform.domain.result.HK.FaceDeviceSamplingResult;
import com.ycl.platform.domain.result.HK.VehicleDeviceInspectionResult;
import com.ycl.platform.domain.result.HK.VehicleDeviceSamplingResult;
import com.ycl.platform.domain.result.HK.*;
import com.ycl.platform.domain.result.SYS.TMonitorResult;
import com.ycl.platform.domain.result.UY.MonitorQualifyResult;
import com.ycl.platform.domain.result.UY.OsdCheckResult;
@@ -189,21 +186,30 @@
        }
        // 车辆监控设备
        if (Objects.equals(tMonitor.getCameraFunType(), "2")) {
            //属性一致率、大图、url
            //属性一致率、大图
            List<VehicleDeviceSamplingResult> sampleResults = mongoTemplate.find(query, VehicleDeviceSamplingResult.class);
            List<PicAccessResult> picAccessResults = mongoTemplate.find(query, PicAccessResult.class);
            //抓拍量、时钟、上传
            List<VehicleDeviceInspectionResult> inspectResults = mongoTemplate.find(query, VehicleDeviceInspectionResult.class);
            for (TMonitorVO monitor : monitors) {
                monitor.setMongoCreateTime(now);
                //一机一档
                setOneFile(monitorQualifyResults, monitor);
                //属性一致率、大图、url
                //url
                if (!CollectionUtils.isEmpty(sampleResults)) {
                    for (PicAccessResult picAccessResult : picAccessResults) {
                        if (monitor.getSerialNumber().equals(picAccessResult.getNo())) {
                            BigDecimal bigDecimal = PicAccessResult.calUrl(picAccessResult);
                            monitor.setUrlPercent(bigDecimal);
                        }
                    }
                }
                //属性一致率、大图
                if (!CollectionUtils.isEmpty(sampleResults)) {
                    for (VehicleDeviceSamplingResult sampleResult : sampleResults) {
                        if (monitor.getSerialNumber().equals(sampleResult.getNo())) {
                            if (sampleResult.getBigUseful() != null) {
                                monitor.setBigUsefulPercent(sampleResult.getBigUseful().getBigUsefulPercent());
                                monitor.setUrlPercent(VehicleDeviceSamplingResult.BigUsefulness.calUrl(sampleResult.getBigUseful()));
                            }
                            if (sampleResult.getVehDiff() != null) {
                                monitor.setImportantConPercent(sampleResult.getVehDiff().getImportantConPercent());
@@ -237,13 +243,12 @@
                monitor.setMongoCreateTime(now);
                //一机一档
                setOneFile(monitorQualifyResults, monitor);
                //人脸合格、大图、url访问异常
                //人脸合格、大图
                if (!CollectionUtils.isEmpty(sampleResults)) {
                    for (FaceDeviceSamplingResult sampleResult : sampleResults) {
                        if (monitor.getSerialNumber().equals(sampleResult.getNo())) {
                            if (sampleResult.getBigUseful() != null) {
                                monitor.setBigUsefulPercent(sampleResult.getBigUseful().getBigUsefulPercent());
                                monitor.setUrlPercent(FaceDeviceSamplingResult.BigUsefulness.calUrl(sampleResult.getBigUseful()));
                            }
                            if (sampleResult.getFaceEligibility() != null)
                                monitor.setFacePercent(sampleResult.getFaceEligibility().getFaceEligPercent());
ycl-server/src/main/java/com/ycl/task/CarTask.java
@@ -78,11 +78,22 @@
        query.addCriteria(Criteria
                .where("mongoCreateTime").gte(DateUtils.getDayStart(yesterday)).lt(DateUtils.getDayEnd(yesterday)));
        List<VehicleDeviceSamplingResult> results = mongoTemplate.find(query, VehicleDeviceSamplingResult.class);
        CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Car_DataAccuracy_Url_PicUsability);
        CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Car_DataAccuracy_PicUsability);
        calculator.calculate(results);
        log.info("结束计算车辆卡口设备数据识别准确性、url可用性、大图可用性");
    }
    public void carUrlTask() {
        log.info("开始计算车辆url可用性");
        Date yesterday = DateUtils.addDays(new Date(), -1);
        //计算车辆卡口设备数据识别准确性、url可用性、大图可用性
        Query query = new Query();
        query.addCriteria(Criteria
                .where("mongoCreateTime").gte(DateUtils.getDayStart(yesterday)).lt(DateUtils.getDayEnd(yesterday)));
        List<PicAccessResult> results = mongoTemplate.find(query, PicAccessResult.class);
        CalculationStrategy calculator = IndexCalculationFactory.getCalculator(CalculationStrategyConstants.Car_Url);
        calculator.calculate(results);
        log.info("结束计算url可用性");
    }
    public void infoAccuracyTask() {
        log.info("开始计算车辆卡口信息采集准确率");
        Date yesterday = DateUtils.addDays(new Date(), -1);