fuliqi
2024-09-14 a776ca9959e0c4696db0ab96cb59efcfe4061201
运行监控展示数据重构
16个文件已修改
484 ■■■■ 已修改文件
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/FaceDeviceSamplingResult.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/VehicleDeviceSamplingResult.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/MonitorQualifyResult.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/OsdCheckResult.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/TMonitorVO.java 97 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/CarDeviceSampleCalculation.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/FaceSnapshotDataCalculation.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/MonitorQualifyCalculation.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/VideoOsdCalculation.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/calculate/VideoUsabilityCalculation.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java 228 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/application-dev.yml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/FaceDeviceSamplingResult.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;
/**
 * 人脸设备抽检指标监测结果:人脸(人脸卡口信息采集准确率、人脸卡口设备抓拍数据大图可用性)
 *
@@ -90,6 +93,18 @@
         * OSD标注异常数据量
         */
        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
ycl-pojo/src/main/java/com/ycl/platform/domain/result/HK/VehicleDeviceSamplingResult.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;
/**
 * 车辆设备抽检指标监测结果:车辆(车辆卡口设备抓拍数据大图可用性)
 *
@@ -79,6 +82,18 @@
         * OSD标注异常数据量
         */
        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
@@ -128,4 +143,6 @@
         */
        private Float importantConPercent;
    }
}
ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/MonitorQualifyResult.java
@@ -82,4 +82,26 @@
        @TextIndexed
        private String value;
    }
    //全对返ture
    public static boolean correct(MonitorQualifyResult result) {
        return  checkError(result.getName()) &&
                checkError(result.getCivilCode()) &&
                checkError(result.getIp()) &&
                checkError(result.getSerialNumber()) &&
                checkError(result.getMacdz()) &&
                checkError(result.getLatitude()) &&
                checkError(result.getLongitude()) &&
                checkError(result.getSbzt()) &&
                checkError(result.getSxjcjqy()) &&
                checkError(result.getSxjgnlx()) &&
                checkError(result.getJkdwlx()) &&
                checkError(result.getIntegrated_device())
                ;
    }
    //检查指标,正常返回true
    public static boolean checkError(MonitorQualifyResult.QualifyResult result) {
        return  result.getError() != null && !result.getError();
    }
}
ycl-pojo/src/main/java/com/ycl/platform/domain/result/UY/OsdCheckResult.java
@@ -2,6 +2,7 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ycl.platform.domain.result.BaseResult;
import constant.ApiConstants;
import lombok.Data;
import org.springframework.data.mongodb.core.index.TextIndexed;
import org.springframework.data.mongodb.core.mapping.Document;
@@ -107,5 +108,15 @@
    private Integer osdLbCorrect;
    public static Boolean checkOsd(OsdCheckResult result) {
        return ApiConstants.OSD_Correct.equals(result.getOsdTimeCorrect()) &&
                ApiConstants.OSD_Correct.equals(result.getOsdNameCorrect()) &&
                ApiConstants.OSD_Correct.equals(result.getOsdProvinceCorrect()) &&
                ApiConstants.OSD_Correct.equals(result.getOsdCityCorrect()) &&
                ApiConstants.OSD_Correct.equals(result.getOsdPartCorrect());
    }
    public static Boolean checkTime(OsdCheckResult result) {
        return ApiConstants.OSD_Correct.equals(result.getOsdTimeCorrect());
    }
}
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/TMonitorVO.java
@@ -5,6 +5,7 @@
import com.ycl.system.entity.BaseEntity;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
@@ -226,46 +227,105 @@
    private String area;
    private String error;
    private String unitName;
    private LocalDate mongoCreateTime;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date mongoCreateTime;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date startTime;
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date endTime;
    //异常恢复监控字段
    /** 异常恢复监控时间天数 */
    private String time;
    /**
     * 当日接收到的当日抓拍量
     * 工单号
     */
    private Integer dataCount;
    private String workOrderNo;
    /**
     * 联系人
     */
    private String unitContact;
    /**
     * 联系电话
     */
    private String unitContactPhone;
    /**
     * 运维人员名称
     */
    private String ywPeopleName;
    /**
     * 故障类型
     */
    private String errorType;
    //视频车辆人脸监控字段
    /**
     * 一机一档合格状态
     */
    private Boolean monitorQualify;
    /**
     * 是否为未注册设备
     */
    private Boolean newMonitor;
    //视频mongo信息
    /**
     * 录像完整状态 1:完整,0:间歇,-1:异常
     */
    private Integer videoComplete;
    /**
     * 录像缺失时长
     */
    private Double videoLoseTime;
    /**
     * OSD
     */
    private Boolean OSD;
    /**
     * OSD时间
     */
    private Boolean OSDTime;
    //车辆、人脸mongo信息
    /**
     * 抓拍数据量监测 1:正常 2:无数据 4:数据量少
     */
    private Integer snapResult;
    /**
     * 当日抓拍量
     */
    private Integer snapCount;
    /**
     * 时钟准确率
     */
    private Float clockPercent;
    /**
     * 上传及时率
     */
    private Float uploadPercent;
    /**
     * 大图可用率
     */
    private Float bigUsefulPercent;
    /**
     * 主要属性一致率
     * url可用率
     */
    private Float majorConPercent;
    private BigDecimal urlPercent;
    //车辆
    /**
     * 重要属性一致率
     * 主要属性一致率
     */
    private Float importantConPercent;
    /**
     * 重要属性一致率
     */
    private Float majorConPercent;
    //人脸
    /**
     * 人脸合格率
     */
    private Float faceEligPercent;
    private Float facePercent;
    /**
     * 关键帧时延
     * 建模失败
     */
    private Integer ifmDelay;
    /**
     * 信令时延
     */
    private Integer sipDelay;
    /**
     * 视频流时延
     */
    private Integer videoDelay;
    private Float failPercent;
    /**
     * 动态列
     */
@@ -275,5 +335,4 @@
     * 设备厂商: 0海康  1大华  2宇视
     */
    private Integer deviceType;
}
ycl-pojo/src/main/java/com/ycl/platform/domain/vo/WorkOrderVO.java
@@ -34,6 +34,8 @@
    /** 运维单位 */
    private Integer unitId;
    private String unitName;
    private String unitContact;
    private String unitContactPhone;
    /** 工单来源/设备名称 */
    private String source;
ycl-server/src/main/java/com/ycl/calculate/CarDeviceSampleCalculation.java
@@ -90,15 +90,9 @@
        if (bigUseful.getBigUsefulPercent() >= 0.9) {
            stats.picUsabilitySites++;
        }
        if (bigUseful.getSampleCount() != 0) {
            //图片访问正常量 = 抽检量-异常量
            BigDecimal picNormalCount = new BigDecimal(bigUseful.getSampleCount() - bigUseful.getBigPicExpCount());
            //图片抽检量
            BigDecimal sampleCount = new BigDecimal(bigUseful.getSampleCount());
            //图片访问率>=90% 视为合格
            if (picNormalCount.divide(sampleCount, 4, RoundingMode.HALF_UP).compareTo(new BigDecimal("0.9")) >= 0) {
                stats.urlUsabilitySites++;
            }
        //图片访问率>=90% 视为合格
        if (VehicleDeviceSamplingResult.BigUsefulness.calUrl(bigUseful).compareTo(new BigDecimal("0.9")) >= 0) {
            stats.urlUsabilitySites++;
        }
    }
ycl-server/src/main/java/com/ycl/calculate/FaceSnapshotDataCalculation.java
@@ -31,7 +31,7 @@
import java.util.stream.Collectors;
/**
 * 计算人脸点位在线率、视图库对接稳定性
 * 计算视图库对接稳定性
 * 抓拍数据量监测结果接口数据
 * 获取分省厅、区域的map<k,v> k为deptId或者Province_deptId
 * 循环map计算点位在线率
ycl-server/src/main/java/com/ycl/calculate/MonitorQualifyCalculation.java
@@ -66,30 +66,9 @@
        //返回对象的引用,如果不存在会放入新的key,value
        AreaStats stats = areaStatsMap.computeIfAbsent(key, k -> new AreaStats());
        stats.totalMonitors++;
        if (result != null && correct(result)){
        if (result != null && MonitorQualifyResult.correct(result)){
            stats.qualifyMonitor++;
        }
    }
    //全对返ture
    private boolean correct(MonitorQualifyResult result) {
        return  checkError(result.getName()) &&
                checkError(result.getCivilCode()) &&
                checkError(result.getIp()) &&
                checkError(result.getSerialNumber()) &&
                checkError(result.getMacdz()) &&
                checkError(result.getLatitude()) &&
                checkError(result.getLongitude()) &&
                checkError(result.getSbzt()) &&
                checkError(result.getSxjcjqy()) &&
                checkError(result.getSxjgnlx()) &&
                checkError(result.getJkdwlx()) &&
                checkError(result.getIntegrated_device())
                ;
    }
    //检查指标,正常返回true
    private boolean checkError(MonitorQualifyResult.QualifyResult result) {
        return  result.getError() != null && !result.getError();
    }
    /**
ycl-server/src/main/java/com/ycl/calculate/VideoOsdCalculation.java
@@ -70,25 +70,13 @@
        //重点点位
        if (result.getImportantTag()) {
            stats.importantTotalSites++;
            if (checkOsd(result)) {
            if (OsdCheckResult.checkOsd(result)) {
                stats.importantOsdAccuracySites++;
            }
            if (checkTime(result)) {
            if (OsdCheckResult.checkTime(result)) {
                stats.importantTimeAccuracySites++;
            }
        }
    }
    private Boolean checkOsd(OsdCheckResult result) {
        return ApiConstants.OSD_Correct.equals(result.getOsdTimeCorrect()) &&
                ApiConstants.OSD_Correct.equals(result.getOsdNameCorrect()) &&
                ApiConstants.OSD_Correct.equals(result.getOsdProvinceCorrect()) &&
                ApiConstants.OSD_Correct.equals(result.getOsdCityCorrect()) &&
                ApiConstants.OSD_Correct.equals(result.getOsdPartCorrect());
    }
    private Boolean checkTime(OsdCheckResult result) {
        return ApiConstants.OSD_Correct.equals(result.getOsdTimeCorrect());
    }
    /**
ycl-server/src/main/java/com/ycl/calculate/VideoUsabilityCalculation.java
@@ -34,7 +34,7 @@
    @Autowired
    private ICheckIndexVideoService checkIndexVideoService;
    //区域视频在线率的内部类
    //区域录像可用率的内部类
    protected static class AreaStats {
        int totalSites = 0;
        int usabilitySites = 0;
@@ -91,7 +91,7 @@
    }
    /**
     * 视频点位在线率
     * 视频录像可用率
     */
    private CheckIndexVideo createOrUpdateCheckIndexVideo(String key, AreaStats stats, List<CheckIndexVideo> checkIndexVideoList) {
        CheckIndexVideo checkIndexVideo = getCheckIndex(key, checkIndexVideoList, CheckIndexVideo.class);
ycl-server/src/main/java/com/ycl/platform/mapper/WorkOrderMapper.java
@@ -101,4 +101,11 @@
     * @return
     */
    WorkOrderDetailVO detailByNo(@Param("workOrderNo") String workOrderNo);
    /**
     * 补充异常恢复监控信息
     * @param orders
     * @return
     */
    List<WorkOrderVO> getRecoveryInfo(List<String> orders);
}
ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java
@@ -11,15 +11,20 @@
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.UY.VideoOnlineResult;
import com.ycl.platform.domain.result.UY.MonitorQualifyResult;
import com.ycl.platform.domain.result.UY.OsdCheckResult;
import com.ycl.platform.domain.result.UY.RecordMetaDSumResult;
import com.ycl.platform.domain.vo.TMonitorVO;
import com.ycl.platform.domain.vo.WorkOrderVO;
import com.ycl.platform.domain.vo.screen.MonitorRateVO;
import com.ycl.platform.domain.vo.screen.MonitorTotalVO;
import com.ycl.platform.mapper.TMonitorMapper;
import com.ycl.platform.mapper.WorkOrderMapper;
import com.ycl.platform.service.ITMonitorService;
import com.ycl.system.Result;
import com.ycl.system.page.PageUtil;
import com.ycl.system.service.ISysConfigService;
import com.ycl.utils.DateUtils;
import com.ycl.utils.StringUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -27,9 +32,11 @@
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
/**
 * 设备资产Service业务层处理
@@ -38,15 +45,15 @@
 * @date 2024-03-04
 */
@Service
public class TMonitorServiceImpl extends ServiceImpl<TMonitorMapper, TMonitor> implements ITMonitorService
{
public class TMonitorServiceImpl extends ServiceImpl<TMonitorMapper, TMonitor> implements ITMonitorService {
    @Autowired
    private TMonitorMapper tMonitorMapper;
    @Autowired
    private ISysConfigService configService;
    @Autowired
    private MongoTemplate mongoTemplate;
    @Autowired
    private WorkOrderMapper workOrderMapper;
    /**
     * 查询设备资产
     *
@@ -54,19 +61,19 @@
     * @return 设备资产
     */
    @Override
    public TMonitor selectTMonitorById(Long id)
    {
    public TMonitor selectTMonitorById(Long id) {
        return tMonitorMapper.selectTMonitorById(id);
    }
    /**
     * 查询设备资产列表
     * 异常恢复监控、车辆、人脸、视频通用接口
     *
     * @param tMonitor 设备资产
     * @return 设备资产
     */
    @Override
    @DataScope(deptAlias = "d",userAlias = "u")
    @DataScope(deptAlias = "d", userAlias = "u")
    public List<TMonitorVO> selectTMonitorList(TMonitorVO tMonitor) {
        // 异常恢复监控
        if (Objects.equals(tMonitor.getRecovery(), 1L)) {
@@ -77,66 +84,167 @@
            tMonitor.setTime(time);
        }
        List<TMonitorVO> monitors = tMonitorMapper.selectTMonitorList(tMonitor);
        // 异常恢复监控
        if(Objects.equals(tMonitor.getRecovery(), 1L)){
            //工单号
            List<String> orders = monitors.stream().map(TMonitorVO::getWorkOrderNo).collect(Collectors.toList());
            if(CollectionUtils.isEmpty(orders)){
                return monitors;
            }
            List<WorkOrderVO> voList = workOrderMapper.getRecoveryInfo(orders);
            for (TMonitorVO monitor : monitors) {
                if(!CollectionUtils.isEmpty(voList)){
                    for (WorkOrderVO workOrderVO : voList) {
                        if(monitor.getWorkOrderNo().equals(workOrderVO.getWorkOrderNo())){
                            monitor.setUnitContact(workOrderVO.getUnitContact());
                            monitor.setUnitContactPhone(workOrderVO.getUnitContactPhone());
                            monitor.setYwPeopleName(workOrderVO.getYwPeopleName());
                            monitor.setErrorType(workOrderVO.getErrorType());
                        }
                    }
                }
            }
            return monitors;
        }
        //设备编号
        List<String> numbers = monitors.stream().map(TMonitorVO::getSerialNumber).collect(Collectors.toList());
        Query query = new Query();
        //TODO:本地测试
        // Date now = new Date()
        Date now = DateUtils.getDay(2024, 7, 13);
        query.addCriteria(Criteria.where("no").in(numbers)
                .and("mongoCreateTime").gte(DateUtils.getDayStart(now)).lt(DateUtils.getDayEnd(now))
        );
        //一机一档信息
        List<MonitorQualifyResult> monitorQualifyResults = mongoTemplate.find(query, MonitorQualifyResult.class);
        // 视频监控设备
        if (Objects.equals(tMonitor.getCameraFunType(), "1")) {
            monitors.forEach(monitor -> {
                Query query = new Query();
                query.addCriteria(Criteria.where("deviceId").is(monitor.getSerialNumber())
                         .and("mongoCreateTime").is(LocalDate.now())
                );
                VideoOnlineResult one = mongoTemplate.findOne(query, VideoOnlineResult.class);
                if (one != null) {
                    monitor.setIfmDelay(one.getIfmDelay());
                    monitor.setSipDelay(one.getSipDelay());
                    monitor.setVideoDelay(one.getVideoDelay());
                    monitor.setMongoCreateTime(one.getMongoCreateTime());
            //OSD信息
            List<OsdCheckResult> osdCheckResults = mongoTemplate.find(query, OsdCheckResult.class);
            //录像可用信息
            List<RecordMetaDSumResult> videoResults = mongoTemplate.find(query, RecordMetaDSumResult.class);
            for (TMonitorVO monitor : monitors) {
                monitor.setMongoCreateTime(now);
                //一机一档
                setOneFile(monitorQualifyResults, monitor);
                //录像
                if (!CollectionUtils.isEmpty(videoResults)) {
                    for (RecordMetaDSumResult videoResult : videoResults) {
                        if (monitor.getSerialNumber().equals(videoResult.getNo())) {
                            monitor.setVideoComplete(videoResult.getRecordStatus());
                            monitor.setVideoLoseTime(videoResult.getMissDuration());
                        }
                    }
                }
            });
                //OSD
                if (!CollectionUtils.isEmpty(osdCheckResults)) {
                    for (OsdCheckResult osdCheckResult : osdCheckResults) {
                        if (monitor.getSerialNumber().equals(osdCheckResult.getNo())) {
                            monitor.setOSD(OsdCheckResult.checkOsd(osdCheckResult));
                            monitor.setOSDTime(OsdCheckResult.checkTime(osdCheckResult));
                        }
                    }
                }
            }
        }
        // 车辆监控设备
        if (Objects.equals(tMonitor.getCameraFunType(), "2")) {
            monitors.forEach(monitor -> {
                Query query = new Query();
                query.addCriteria(Criteria.where("externalIndexCode").is(monitor.getSerialNumber())
                         .and("mongoCreateTime").is(LocalDate.now())
                );
                VehicleDeviceInspectionResult one = mongoTemplate.findOne(query, VehicleDeviceInspectionResult.class);
                VehicleDeviceSamplingResult two = mongoTemplate.findOne(query, VehicleDeviceSamplingResult.class);
                if (one != null) {
                    monitor.setDataCount(one.getDataCount());
                    monitor.setClockPercent(Objects.nonNull(one.getSnapClock()) ? one.getSnapClock().getClockPercent() : null);
                    monitor.setMongoCreateTime(one.getMongoCreateTime());
            //属性一致率、大图、url
            List<VehicleDeviceSamplingResult> sampleResults = mongoTemplate.find(query, VehicleDeviceSamplingResult.class);
            //抓拍量、时钟、上传
            List<VehicleDeviceInspectionResult> inspectResults = mongoTemplate.find(query, VehicleDeviceInspectionResult.class);
            for (TMonitorVO monitor : monitors) {
                monitor.setMongoCreateTime(now);
                //一机一档
                setOneFile(monitorQualifyResults, monitor);
                //属性一致率、大图、url
                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());
                                monitor.setMajorConPercent(sampleResult.getVehDiff().getMajorConPercent());
                            }
                        }
                    }
                }
                if (two != null) {
                    monitor.setBigUsefulPercent(Objects.nonNull(two.getBigUseful()) ? two.getBigUseful().getBigUsefulPercent() : null);
                    monitor.setMajorConPercent(Objects.nonNull(two.getVehDiff()) ? two.getVehDiff().getMajorConPercent() : null);
                    monitor.setImportantConPercent(Objects.nonNull(two.getVehDiff()) ? two.getVehDiff().getImportantConPercent() : null);
                    monitor.setMongoCreateTime(two.getMongoCreateTime());
                //抓拍量、时钟、上传
                if (!CollectionUtils.isEmpty(inspectResults)) {
                    for (VehicleDeviceInspectionResult inspectResult : inspectResults) {
                        if (monitor.getSerialNumber().equals(inspectResult.getNo())) {
                            monitor.setSnapResult(inspectResult.getSnapResult());
                            monitor.setSnapCount(inspectResult.getDataCount());
                            if (inspectResult.getSnapClock() != null)
                                monitor.setClockPercent(inspectResult.getSnapClock().getClockPercent());
                            if (inspectResult.getSnapTimely() != null)
                                monitor.setUploadPercent(inspectResult.getSnapTimely().getTimelyPercent());
                        }
                    }
                }
            });
            }
        }
        // 人脸监控设备
        if (Objects.equals(tMonitor.getCameraFunType(), "3")) {
            monitors.forEach(monitor -> {
                Query query = new Query();
                query.addCriteria(Criteria.where("externalIndexCode").is(monitor.getSerialNumber())
                         .and("mongoCreateTime").is(LocalDate.now())
                );
                FaceDeviceInspectionResult one = mongoTemplate.findOne(query, FaceDeviceInspectionResult.class);
                FaceDeviceSamplingResult two = mongoTemplate.findOne(query, FaceDeviceSamplingResult.class);
                if (one != null) {
                    monitor.setDataCount(one.getDataCount());
                    monitor.setClockPercent(Objects.nonNull(one.getSnapClock()) ? one.getSnapClock().getClockPercent() : null);
                    monitor.setMongoCreateTime(one.getMongoCreateTime());
            //人脸合格、大图、url访问异常
            List<FaceDeviceSamplingResult> sampleResults = mongoTemplate.find(query, FaceDeviceSamplingResult.class);
            //抓拍量、时钟、上传
            List<FaceDeviceInspectionResult> inspectResults = mongoTemplate.find(query, FaceDeviceInspectionResult.class);
            for (TMonitorVO monitor : monitors) {
                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());
                        }
                    }
                }
                if (two != null) {
                    monitor.setBigUsefulPercent(Objects.nonNull(two.getBigUseful())? two.getBigUseful().getBigUsefulPercent() : null);
                    monitor.setFaceEligPercent(Objects.nonNull(two.getFaceEligibility()) ? two.getFaceEligibility().getFaceEligPercent() : null);
                    monitor.setMongoCreateTime(two.getMongoCreateTime());
                //抓拍量、时钟、上传、建模失败率
                if (!CollectionUtils.isEmpty(inspectResults)) {
                    for (FaceDeviceInspectionResult inspectResult : inspectResults) {
                        if (monitor.getSerialNumber().equals(inspectResult.getNo())) {
                            monitor.setSnapResult(inspectResult.getSnapResult());
                            monitor.setSnapCount(inspectResult.getDataCount());
                            if (inspectResult.getSnapClock() != null)
                                monitor.setClockPercent(inspectResult.getSnapClock().getClockPercent());
                            if (inspectResult.getSnapTimely() != null)
                                monitor.setUploadPercent(inspectResult.getSnapTimely().getTimelyPercent());
                            if (inspectResult.getSnapValidity() != null)
                                monitor.setFailPercent(inspectResult.getSnapValidity().getFailPercent());
                        }
                    }
                }
            });
            }
        }
        return monitors;
    }
    /**
     * 补充一机一档信息
     *
     * @param monitorQualifyResults
     * @param monitor
     */
    private void setOneFile(List<MonitorQualifyResult> monitorQualifyResults, TMonitorVO monitor) {
        if (!CollectionUtils.isEmpty(monitorQualifyResults)) {
            for (MonitorQualifyResult oneFile : monitorQualifyResults) {
                if (monitor.getSerialNumber().equals(oneFile.getNo())) {
                    monitor.setMonitorQualify(MonitorQualifyResult.correct(oneFile));
                    monitor.setNewMonitor(oneFile.getNewDevice());
                }
            }
        }
    }
    /**
@@ -146,8 +254,7 @@
     * @return 结果
     */
    @Override
    public int insertTMonitor(TMonitor tMonitor)
    {
    public int insertTMonitor(TMonitor tMonitor) {
        return tMonitorMapper.insertTMonitor(tMonitor);
    }
@@ -158,8 +265,7 @@
     * @return 结果
     */
    @Override
    public int updateTMonitor(TMonitor tMonitor)
    {
    public int updateTMonitor(TMonitor tMonitor) {
        return tMonitorMapper.updateTMonitor(tMonitor);
    }
@@ -170,8 +276,7 @@
     * @return 结果
     */
    @Override
    public int deleteTMonitorByIds(Long[] ids)
    {
    public int deleteTMonitorByIds(Long[] ids) {
        return tMonitorMapper.deleteTMonitorByIds(ids);
    }
@@ -182,19 +287,18 @@
     * @return 结果
     */
    @Override
    public int deleteTMonitorById(Long id)
    {
    public int deleteTMonitorById(Long id) {
        return tMonitorMapper.deleteTMonitorById(id);
    }
    @Override
    @DataScope(deptAlias = "d",userAlias = "u")
    @DataScope(deptAlias = "d", userAlias = "u")
    public Map<String, String> getVideoCount(TMonitorVO tMonitor) {
        return tMonitorMapper.getVideoCount(tMonitor);
    }
    @Override
    @DataScope(deptAlias = "d",userAlias = "u")
    @DataScope(deptAlias = "d", userAlias = "u")
    public Map<String, String> recoveryException(TMonitorVO monitor) {
//        String time = configService.selectConfigByKey("abnormal.equipment.continuous.attention.time");
//        monitor.setTime(time);
ycl-server/src/main/resources/application-dev.yml
@@ -126,7 +126,8 @@
spring:
  data:
    mongodb:
      uri: mongodb://root1:yunwei%402024@192.168.3.88:27017/zgyw?authSource=admin
#      uri: mongodb://root1:yunwei%402024@192.168.3.88:27017/zgyw?authSource=admin
       uri: mongodb://localhost:27017/zgyw
# 拉取数据请求配置
request:
ycl-server/src/main/resources/mapper/zgyw/TMonitorMapper.xml
@@ -99,7 +99,7 @@
    <select id="selectTMonitorList" resultType="com.ycl.platform.domain.vo.TMonitorVO">
        select m.id, m.serial_number, name, site_type, mac_addr, ip, camera_fun_type, longitude, latitude,
        camera_capture_area, p.online as onState, civil_code, d.dept_id, d.dept_name, d.area, p.province_tag,
        IF(COUNT(w.id) OVER() > 0, '是', '否') AS error, u.unit_name, p.recovery_time,p.reason  from t_monitor m
        IF(COUNT(w.id) OVER() > 0, '是', '否') AS error, u.unit_name,p.recovery_time,p.reason,p.start_time,p.end_time,w.work_order_no  from t_monitor m
        left join t_yw_point p on m.serial_number = p.serial_number and p.deleted = 0
        left join sys_dept d on p.dept_id = d.dept_id and d.del_flag = 0
        left join (
ycl-server/src/main/resources/mapper/zgyw/WorkOrderMapper.xml
@@ -316,4 +316,27 @@
              INNER JOIN t_monitor m ON m.serial_number = wo.serial_number
              LEFT JOIN t_yw_unit yw ON yw.id = wo.unit_id AND yw.deleted = 0
    </select>
    <select id="getRecoveryInfo" resultType="com.ycl.platform.domain.vo.WorkOrderVO">
        SELECT
        wo.work_order_no,
        u.unit_name,
        u.unit_contact,
        u.unit_contact_phone,
        p.yw_person_name,
        GROUP_CONCAT(DISTINCT da.dict_label ORDER BY da.dict_label SEPARATOR ',') AS errorType
        FROM
        t_work_order wo
        INNER JOIN t_work_order_error_type et ON wo.work_order_no = et.work_order_no
        INNER JOIN t_yw_unit u ON wo.unit_id = u.id AND u.deleted = 0
        INNER JOIN sys_dict_data da ON da.dict_value = et.error_name AND da.dict_type = 'error_type'
        LEFT JOIN t_yw_people p ON wo.yw_people_id = p.id AND p.deleted = 0
        WHERE
        wo.deleted = 0
        GROUP BY
        wo.work_order_no,
        u.unit_name,
        u.unit_contact,
        u.unit_contact_phone,
        p.yw_person_name
    </select>
</mapper>