From 2ffe3cee215354349596f743382059ecbd2dea53 Mon Sep 17 00:00:00 2001 From: xueqingkun <xueqingkun@126.com> Date: Thu, 7 Nov 2024 15:28:04 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E5=8F=98=E6=9B=B4=E6=A1=88=E4=BB=B6?= =?UTF-8?q?=E6=8C=87=E5=BC=95=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dto/caseScore/CaseScoreDetailBuilder.java | 96 +++++++++++++++---- 1 file changed, 80 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/supervision/police/dto/caseScore/CaseScoreDetailBuilder.java b/src/main/java/com/supervision/police/dto/caseScore/CaseScoreDetailBuilder.java index 8af13d9..21743a7 100644 --- a/src/main/java/com/supervision/police/dto/caseScore/CaseScoreDetailBuilder.java +++ b/src/main/java/com/supervision/police/dto/caseScore/CaseScoreDetailBuilder.java @@ -12,6 +12,7 @@ import com.supervision.police.dto.EvidenceDirectoryDTO; import com.supervision.police.mapper.*; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import org.jetbrains.annotations.NotNull; import org.springframework.ai.ollama.OllamaChatClient; import java.time.LocalDateTime; @@ -221,10 +222,32 @@ public class CaseScoreDetailBuilder { }).filter(result->StrUtil.isNotEmpty(result.getAtomicId())).filter(distinctPredicate(AtomicResult::getAtomicId)).count() ); - List<String> unusedCategoryIds = this.getUnusedCategoryIds(); - caseScoreDetailDTO.setMissAtomicIndexCount((long) unusedCategoryIds.size()); - caseScoreDetailDTO.setMissCategoryNameList(this.getUnusedCategoryNames(unusedCategoryIds)); - caseScoreDetailDTO.setGuideDesc(this.buildGuideDesc(unusedCategoryIds, rootEvidenceCategory)); + + // 结构化推理分类id 只过滤不得分的指标 + List<String> structureCategoryList = this.indexResultList.stream().filter(indexResult -> indexResult.getActualScore() == 0) + .flatMap(indexResult -> indexResult.getAtomicResults().stream()) + .filter(atomicResult -> StrUtil.equals(IndexRuleConstants.OPERAND_TYPE_STRUCTURE, atomicResult.getIndexSource())) + .map(AtomicResult::getCategoryId) + .filter(id -> StrUtil.isNotEmpty(id) && !this.evidenceDirectoryDTO.categoryHasFile(id)).distinct().toList(); + + // 数据库查询分类id 只过滤不得分的指标 + Set<String> filter = new HashSet<>(); + List<AtomicResult> dbAtomicResultList = this.indexResultList.stream().filter(indexResult -> indexResult.getActualScore() == 0) + .flatMap(indexResult -> indexResult.getAtomicResults().stream()) + .filter(r -> { + if (StrUtil.isEmpty(r.getCategoryId()) || !StrUtil.equals(IndexRuleConstants.OPERAND_TYPE_DB, r.getIndexSource())){ + return false; + } + if (filter.contains(r.getCategoryId())){ + return false; + }else { + filter.add(r.getCategoryId()); + return !r.resultIsTrue() && StrUtil.isAllNotEmpty(r.getAtomicName(),r.getCategoryId()); + } + }).filter(ar->StrUtil.isAllNotEmpty(ar.getAtomicName(),ar.getCategoryId())).toList(); + + String guideDesc = buildGuideDesc(structureCategoryList, dbAtomicResultList, rootEvidenceCategory); + caseScoreDetailDTO.setGuideDesc(guideDesc); return caseScoreDetailDTO; } @@ -286,29 +309,42 @@ public class CaseScoreDetailBuilder { public List<String> getUnusedCategoryNames(List<String> unusedCategoryIds) { return unusedCategoryIds.stream().map(id -> rootEvidenceCategory.findCategoryById(id)).map(EvidenceCategoryDTO::getCategoryName).toList(); } + public String buildGuideDesc(List<String> structureCategoryList,List<AtomicResult> dbAtomicResultList, EvidenceCategoryDTO rootCategory) { - /** - * 构建引导描述 - * @param categoryIds 分类id - * @param rootCategory 根分类信息 - * @return - */ - public String buildGuideDesc(List<String> categoryIds, EvidenceCategoryDTO rootCategory) { - - if (CollUtil.isEmpty(categoryIds)) { + if (CollUtil.isEmpty(structureCategoryList) && CollUtil.isEmpty(dbAtomicResultList)) { return "案件证据均已成功上传,系统已基于现有证据链进行分析和案件预测评分。如果对结果存在疑问或偏差,可核实证据信息是否完整和准确。如有需要,您可以补充更多相关证据以进一步支持案件分析。"; } - List<List<String>> pathIds = categoryIds.stream().map(rootCategory::listCategoryIdPath).toList(); + List<List<String>> structurePathIds = structureCategoryList.stream().map(rootCategory::listCategoryIdPath).collect(Collectors.toList()); + + // 不考虑文件在二级目录的场景 + List<List<String>> directCategoryList = dbAtomicResultList.stream().map(ra -> { + List<String> categoryIdPath = rootCategory.listCategoryIdPath(ra.getCategoryId()); + if (CollUtil.isEmpty(categoryIdPath)) { + return null; + } + return List.of(CollUtil.getFirst(categoryIdPath), ra.getAtomicName()); + }).toList(); + + structurePathIds.addAll(directCategoryList); // 二级目录 - Map<String, List<String>> categoryIdGroup = pathIds.stream().filter(list -> list.size() == 2) + Map<String, List<String>> categoryIdGroup = structurePathIds.stream().filter(list -> list.size() == 2) .collect(Collectors.groupingBy(list -> list.get(0), Collectors.mapping(list -> list.get(1), Collectors.toList()))); // 只包含一级目录 - List<String> categoryLevelOneIds = pathIds.stream().filter(list -> list.size() == 1) + List<String> categoryLevelOneIds = structurePathIds.stream().filter(list -> list.size() == 1) .flatMap(Collection::stream).filter(id -> !categoryIdGroup.containsKey(id)).distinct().toList(); + + return builderGuideDesc(rootCategory, categoryIdGroup, categoryLevelOneIds); + + + } + + @NotNull + private static String builderGuideDesc(EvidenceCategoryDTO rootCategory, Map<String, List<String>> categoryIdGroup, + List<String> categoryLevelOneIds) { StringBuilder builder = new StringBuilder("为了提升司法定性的准确性,建议您补充以下相关证据:包括但不限于"); for (Map.Entry<String, List<String>> entry : categoryIdGroup.entrySet()) { String oneLevel = entry.getKey(); @@ -319,6 +355,8 @@ public class CaseScoreDetailBuilder { EvidenceCategoryDTO secondLevelCategory = rootCategory.findCategoryById(secondCategoryId); if (secondLevelCategory != null) { builder.append(secondLevelCategory.getCategoryName()).append("、"); + }else { + builder.append(secondCategoryId).append("、"); } } builder.deleteCharAt(builder.length() - 1).append("),"); @@ -336,6 +374,32 @@ public class CaseScoreDetailBuilder { return builder.toString(); } + + /** + * 构建引导描述 + * @param categoryIds 分类id + * @param rootCategory 根分类信息 + * @return + */ + public String buildGuideDesc(List<String> categoryIds, EvidenceCategoryDTO rootCategory) { + + if (CollUtil.isEmpty(categoryIds)) { + return "案件证据均已成功上传,系统已基于现有证据链进行分析和案件预测评分。如果对结果存在疑问或偏差,可核实证据信息是否完整和准确。如有需要,您可以补充更多相关证据以进一步支持案件分析。"; + } + + List<List<String>> pathIds = categoryIds.stream().map(rootCategory::listCategoryIdPath).toList(); + + // 二级目录 + Map<String, List<String>> categoryIdGroup = pathIds.stream().filter(list -> list.size() == 2) + .collect(Collectors.groupingBy(list -> list.get(0), Collectors.mapping(list -> list.get(1), Collectors.toList()))); + + // 只包含一级目录 + List<String> categoryLevelOneIds = pathIds.stream().filter(list -> list.size() == 1) + .flatMap(Collection::stream).filter(id -> !categoryIdGroup.containsKey(id)).distinct().toList(); + + return builderGuideDesc(rootCategory, categoryIdGroup, categoryLevelOneIds); + } + /** * 获取共性指标 * @return