小组团队项目团队博客4.0

我们今天继续完善风险项目管理表的功能。我们分别去做了“支持录入安全风险项点过程中,自动判断风险库中是否有相似内容,如有相似内容给出合并提示字样,如“本次录入内容与风险库第 15、18 项内容相似或接近,建议进行合并! ”等字样”和“安全风险项点批量导入”的功能,目前已经实现批量导入功能,查找相似项的功能虽没报错但仍未实现。

相似:@Value("${risk.similarity.threshold:0.7}")
private double similarityThreshold;

// 检查相似风险
public RiskSimilarityCheckResult checkSimilarity(RiskMangement currentRisk) {
    RiskSimilarityCheckResult result = new RiskSimilarityCheckResult();

    // 获取所有风险项(排除当前项)
    List<RiskMangement> allRisks = riskMapper.findAllExceptCurrent(currentRisk.getId());

    // 计算相似度
    List<SimilarRiskDTO> similarRisks = new ArrayList<>();
    for (RiskMangement risk : allRisks) {
        double score = calculateSimilarity(currentRisk, risk);
        if (score >= similarityThreshold) {
            SimilarRiskDTO dto = new SimilarRiskDTO();
            dto.setId(risk.getId());
            dto.setRiskPoint(risk.getRiskPoint());
            dto.setControlMeasures(risk.getControlMeasures());
            dto.setSimilarityScore(score);
            similarRisks.add(dto);

            // 保存相似性记录
            riskMapper.saveSimilarity(currentRisk.getId(), risk.getId(), score);
        }
    }

    result.setHasSimilar(!similarRisks.isEmpty());
    result.setSimilarRisks(similarRisks);

    if (!similarRisks.isEmpty()) {
        String ids = similarRisks.stream()
                .map(SimilarRiskDTO::getId)
                .collect(Collectors.joining("、"));
        result.setMessage(String.format("本次录入内容与风险库第 %s 项内容相似或接近,建议进行合并!", ids));
    }

    return result;
}

// 计算相似度(简化版,实际可以使用更复杂的算法)
private double calculateSimilarity(RiskMangement risk1, RiskMangement risk2) {
    String text1 = risk1.getRiskPoint() + " " + risk1.getControlMeasures();
    String text2 = risk2.getRiskPoint() + " " + risk2.getControlMeasures();

    // 使用Jaccard相似度
    Set<String> words1 = new HashSet<>(Arrays.asList(text1.split("\\s+")));
    Set<String> words2 = new HashSet<>(Arrays.asList(text2.split("\\s+")));

    Set<String> intersection = new HashSet<>(words1);
    intersection.retainAll(words2);

    Set<String> union = new HashSet<>(words1);
    union.addAll(words2);

    return union.isEmpty() ? 0 : (double) intersection.size() / union.size();
}

批量导入:


posted @ 2025-04-21 22:24  鱼一直摸  阅读(13)  评论(0)    收藏  举报