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