小组团队项目团队博客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();
}
批量导入:





浙公网安备 33010602011771号