zxl
2025-06-05 0ba453c66cd5d20b970c894358031c9c06df7071
ycl-server/src/main/java/com/ycl/task/ContractTask.java
@@ -24,6 +24,7 @@
import enumeration.general.WorkOrderStatusEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
@@ -365,65 +366,87 @@
     * 海康取人脸车辆
     */
    public void randomDeductPic() {
        log.info("开始抽查图片完整状态");
        //这个月随机抽取一天
        Date date = getRandomDate();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        //准备批量打分的集合
        List<ContractScore> contractScoreList = new ArrayList<>();
        //查询报备列表
        List<String> reportNumbers = reportMapper.selectNumberList(AuditStatus_Pass, DateUtils.getDate());
        //查图片完整性规则 获取key为合同id,value为规则的map
        Map<Integer, List<CalculateRuleVO>> contractMap = contractMapper.getCalculateRule(new Date()).stream()
                .filter(calculateRuleVO -> ContractRule.CONTRACT_RULE_PicComplete.getName().equals(calculateRuleVO.getRuleName()))
                .collect(Collectors.groupingBy(CalculateRuleVO::getContractId));
        try {
            log.info("开始抽查图片完整状态");
            //这个月随机抽取一天
//        Date date = getRandomDate();
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.MONTH, -1); // 上个月
            calendar.set(Calendar.DAY_OF_MONTH, 1); // 设置为1号
        //判断车辆、人脸图片是否可用
        Query query = new Query(Criteria
                .where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date)));
        List<PicAccessResult> picAccessResults = mongoTemplate.find(query, PicAccessResult.class);
        List<String> serialNumbers = picAccessResults.stream().map(PicAccessResult::getExternalIndexCode).collect(Collectors.toList());
        QueryWrapper<YwPoint> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("serial_number", serialNumbers);
        //获取公司所运维的设备集合,key为unitId value为设备国标码集合
        Map<Long, List<String>> unitMonitorMap = ywPointMapper.selectList(queryWrapper).stream()
                .filter(ywPoint -> ywPoint.getUnitId() != null).collect(Collectors.groupingBy(YwPoint::getUnitId,
                        Collectors.mapping(
                                YwPoint::getSerialNumber,
                                Collectors.toList())));
        if (!CollectionUtils.isEmpty(contractMap)) {
            contractMap.forEach((contractId, ruleList) -> {
                boolean deduct = false;
                String serialNumber = null;
                //此规则对应的unitId均相等
                CalculateRuleVO ruleVO = ruleList.get(0);
                Integer unitId = ruleVO.getUnitId();
                List<String> monitorList = unitMonitorMap.get(Long.parseLong(unitId + ""));
                for (PicAccessResult picAccessResult : picAccessResults) {
                    //判断是否报备过
                    if (!CollectionUtils.isEmpty(reportNumbers)) {
                        if (reportNumbers.contains(picAccessResult.getExternalIndexCode())) continue;
                    }
                    //判断是否是该公司运维
                    if (monitorList.contains(picAccessResult.getExternalIndexCode())) {
                        //存在图片访问异常数据量,需要扣减
                        if (picAccessResult.getExpCount() > 0) {
                            deduct = true;
                            serialNumber = picAccessResult.getExternalIndexCode();
                            break;
            int lastDay = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
            Random random = new Random();
            int randomDay = random.nextInt(lastDay) + 1;
            calendar.set(Calendar.DAY_OF_MONTH, randomDay);
            Date date = calendar.getTime();
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            //准备批量打分的集合
            List<ContractScore> contractScoreList = new ArrayList<>();
            //查询报备列表 通过审核并且创建时间在当前日期的报备id列表
            List<String> reportNumbers = reportMapper.selectNumberList(AuditStatus_Pass, DateUtils.getDate());
            //查图片完整性规则 获取key为合同id,value为规则的map
            Map<Integer, List<CalculateRuleVO>> contractMap = contractMapper.getCalculateRule(new Date()).stream()
                    .filter(calculateRuleVO -> ContractRule.CONTRACT_RULE_PicComplete.getName().equals(calculateRuleVO.getRuleName()))
                    .collect(Collectors.groupingBy(CalculateRuleVO::getContractId));
            //判断车辆、人脸图片是否可用
            Query query = new Query(Criteria
                    .where("mongoCreateTime").gte(DateUtils.getDayStart(date)).lt(DateUtils.getDayEnd(date)));
            List<PicAccessResult> picAccessResults = mongoTemplate.find(query, PicAccessResult.class);
            List<String> serialNumbers = picAccessResults.stream().map(PicAccessResult::getExternalIndexCode).collect(Collectors.toList());
            QueryWrapper<YwPoint> queryWrapper = new QueryWrapper<>();
            queryWrapper.in("serial_number", serialNumbers);
            //获取公司所运维的设备集合,key为unitId value为设备国标码集合
            Map<Long, List<String>> unitMonitorMap = ywPointMapper.selectList(queryWrapper).stream()
                    .filter(ywPoint -> ywPoint.getUnitId() != null).collect(Collectors.groupingBy(YwPoint::getUnitId,
                            Collectors.mapping(
                                    YwPoint::getSerialNumber,
                                    Collectors.toList())));
            if (!CollectionUtils.isEmpty(contractMap)) {
                contractMap.forEach((contractId, ruleList) -> {
                    boolean deduct = false;
                    String serialNumber = null;
                    //此规则对应的unitId均相等
                    CalculateRuleVO ruleVO = ruleList.get(0);
                    Integer unitId = ruleVO.getUnitId();
                    List<String> monitorList = unitMonitorMap.get(Long.parseLong(unitId + ""));
                    for (PicAccessResult picAccessResult : picAccessResults) {
                        //判断是否报备过
                        if (!CollectionUtils.isEmpty(reportNumbers)) {
                            if (reportNumbers.contains(picAccessResult.getExternalIndexCode())) continue;
                        }
                        //判断是否是该公司运维
                        if (monitorList.contains(picAccessResult.getExternalIndexCode())) {
                            //存在图片访问异常数据量,需要扣减
                            if (picAccessResult.getExpCount() > 0) {
                                deduct = true;
                                serialNumber = picAccessResult.getExternalIndexCode();
                                break;
                            }
                        }
                    }
                }
                if (deduct) {
                    //需要扣除的分数,此规则只有一条不需要判断范围
                    Double deductScore = ruleVO.getCalcFraction();
                    ContractScore contractScore = getContractScore(ruleVO, deductScore, "1", Remark + "国标码为:" + serialNumber + "时间:" + format.format(date) + "存在大图不可用数据");
                    contractScoreList.add(contractScore);
                }
            });
                    if (deduct) {
                        //需要扣除的分数,此规则只有一条不需要判断范围
                        Double deductScore = ruleVO.getCalcFraction();
                        ContractScore contractScore = getContractScore(ruleVO, deductScore, "1", Remark + "国标码为:" + serialNumber + "时间:" + format.format(date) + "存在大图不可用数据");
                        contractScoreList.add(contractScore);
                    }
                });
            }
            contractScoreService.saveBatch(contractScoreList);
            log.info("结束抽查图片完整状态");
        }catch (NullPointerException e) {
            log.error("空指针异常,抽查图片完整状态失败: {}", e.getMessage(), e);
        } catch (DataAccessException e) {
            log.error("数据库访问异常,抽查图片完整状态失败: {}", e.getMessage(), e);
        } catch (IllegalArgumentException e) {
            log.error("参数不合法异常,抽查图片完整状态失败: {}", e.getMessage(), e);
        } catch (Exception e) {
            log.error("未知异常,抽查图片完整状态失败: ", e); // 注意这里使用逗号而不是+,可以打印完整堆栈
            // 如果需要可以抛出运行时异常
            throw new RuntimeException("抽查图片完整状态失败", e);
        }
        contractScoreService.saveBatch(contractScoreList);
        log.info("结束抽查图片完整状态");
    }
@@ -432,6 +455,7 @@
     * 优云取录像
     */
    public void randomDeductVideo() {
        try{
        log.info("开始抽查录像完整状态");
        //这个月随机抽取一天
        Date date = getRandomDate();
@@ -503,6 +527,17 @@
            });
        }
        contractScoreService.saveBatch(contractScoreList);
    }catch (NullPointerException e) {
            log.error("空指针异常,抽查图片完整状态失败: {}", e.getMessage(), e);
        } catch (DataAccessException e) {
            log.error("数据库访问异常,抽查图片完整状态失败: {}", e.getMessage(), e);
        } catch (IllegalArgumentException e) {
            log.error("参数不合法异常,抽查图片完整状态失败: {}", e.getMessage(), e);
        } catch (Exception e) {
            log.error("未知异常,抽查图片完整状态失败: ", e); // 注意这里使用逗号而不是+,可以打印完整堆栈
            // 如果需要可以抛出运行时异常
            throw new RuntimeException("抽查图片完整状态失败", e);
        }
    }
    private Date getRandomDate() {