fuliqi
2024-09-17 e13b129c300d3eff2ba555d0c41bbccbaab1014a
ycl-server/src/main/java/com/ycl/platform/service/impl/TMonitorServiceImpl.java
@@ -11,27 +11,33 @@
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 enumeration.general.AreaDeptEnum;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
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.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
/**
 * 设备资产Service业务层处理
@@ -40,14 +46,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;
    /**
     * 查询设备资产
@@ -56,90 +63,190 @@
     * @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) {
        List<TMonitorVO> monitors = tMonitorMapper.selectTMonitorList(tMonitor);
        // 异常设备
        // 异常恢复监控
        if (Objects.equals(tMonitor.getRecovery(), 1L)) {
            String time = configService.selectConfigByKey("abnormal.equipment.continuous.attention.time");
            if (StringUtils.isBlank(time)) {
                throw new RuntimeException("请配置异常设备连续关注时间");
            }
            List<TMonitorVO> recoveryMonitors = tMonitorMapper.selectRecoveryMonitor(time);
            monitors.addAll(recoveryMonitors);
            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());
                }
            }
        }
    }
    /**
@@ -149,8 +256,7 @@
     * @return 结果
     */
    @Override
    public int insertTMonitor(TMonitor tMonitor)
    {
    public int insertTMonitor(TMonitor tMonitor) {
        return tMonitorMapper.insertTMonitor(tMonitor);
    }
@@ -161,8 +267,7 @@
     * @return 结果
     */
    @Override
    public int updateTMonitor(TMonitor tMonitor)
    {
    public int updateTMonitor(TMonitor tMonitor) {
        return tMonitorMapper.updateTMonitor(tMonitor);
    }
@@ -173,8 +278,7 @@
     * @return 结果
     */
    @Override
    public int deleteTMonitorByIds(Long[] ids)
    {
    public int deleteTMonitorByIds(Long[] ids) {
        return tMonitorMapper.deleteTMonitorByIds(ids);
    }
@@ -185,21 +289,22 @@
     * @return 结果
     */
    @Override
    public int deleteTMonitorById(Long id)
    {
    public int deleteTMonitorById(Long id) {
        return tMonitorMapper.deleteTMonitorById(id);
    }
    @Override
    @DataScope(deptAlias = "d",userAlias = "u")
    public Map<String, String> getVideoCount(TMonitor tMonitor) {
    @DataScope(deptAlias = "d", userAlias = "u")
    public Map<String, String> getVideoCount(TMonitorVO tMonitor) {
        return tMonitorMapper.getVideoCount(tMonitor);
    }
    @Override
    public Map<String, String> recoveryException() {
        String time = configService.selectConfigByKey("abnormal.equipment.continuous.attention.time");
        return tMonitorMapper.recoveryException(time);
    @DataScope(deptAlias = "d", userAlias = "u")
    public Map<String, String> recoveryException(TMonitorVO monitor) {
//        String time = configService.selectConfigByKey("abnormal.equipment.continuous.attention.time");
//        monitor.setTime(time);
        return tMonitorMapper.recoveryException(monitor);
    }
    @Override
@@ -221,12 +326,37 @@
    }
    @Override
    public List<MonitorTotalVO> monitorTotal(DashboardQuery dashboardQuery) {
        return baseMapper.monitorTotal(dashboardQuery);
    public Map<String, List<Map<String, Object>>> monitorTotal(DashboardQuery dashboardQuery) {
        List<MonitorTotalVO> monitorTotalVOS = baseMapper.monitorTotal(dashboardQuery);
        /** facilityData: {
         * video:[
         * {value: 4589,title: '设备总数'},
         * {value: 4294,title: '设备正常数'},
         * {value: 295,title: '设备异常数'}
         * ]} */
        Map<String, List<Map<String, Object>>> resultMap = new HashMap<>();
        for (MonitorTotalVO vo : monitorTotalVOS) {
            List<Map<String, Object>> list = new ArrayList();
            Map<String, Object> total = new HashMap<>();
            total.put("value", vo.getTotalNum());
            total.put("title", "设备总数");
            Map<String, Object> normal = new HashMap<>();
            normal.put("value", vo.getNormalNum());
            normal.put("title", "设备正常数");
            Map<String, Object> error = new HashMap<>();
            error.put("value", vo.getErrorNum());
            error.put("title", "设备异常数");
            list.add(total);
            list.add(normal);
            list.add(error);
            resultMap.put(vo.getType(), list);
        }
        return resultMap;
    }
    @Override
    public List<MonitorRateVO> monitorRate(DashboardQuery dashboardQuery) {
        //TODO:新增dept AreaCode字段
        return baseMapper.monitorRate(dashboardQuery);
    }