diff --git a/src/main/java/com/supervision/police/controller/ModelController.java b/src/main/java/com/supervision/police/controller/ModelController.java index dd01bbe..9c6faa1 100644 --- a/src/main/java/com/supervision/police/controller/ModelController.java +++ b/src/main/java/com/supervision/police/controller/ModelController.java @@ -3,6 +3,7 @@ package com.supervision.police.controller; import com.supervision.common.domain.R; import com.supervision.police.dto.AnalyseCaseDTO; import com.supervision.police.dto.CaseStatus; +import com.supervision.police.dto.caseScore.CaseScoreDetailDTO; import com.supervision.police.service.ModelService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -35,9 +36,9 @@ public class ModelController { */ @GetMapping("/caseScoreDetail") @Operation(summary = "案件得分详情功能") - public R caseScoreDetail( @RequestParam @Parameter(name = "caseId",description = "案件id") String caseId) { + public R caseScoreDetail( @RequestParam @Parameter(name = "caseId",description = "案件id") String caseId) { - String detail = modelService.caseScoreDetail(caseId); + CaseScoreDetailDTO detail = modelService.caseScoreDetail(caseId); return R.ok(detail); } diff --git a/src/main/java/com/supervision/police/dto/caseScore/AtomicResult.java b/src/main/java/com/supervision/police/dto/caseScore/AtomicResult.java index 41958fd..1d365e0 100644 --- a/src/main/java/com/supervision/police/dto/caseScore/AtomicResult.java +++ b/src/main/java/com/supervision/police/dto/caseScore/AtomicResult.java @@ -1,9 +1,11 @@ package com.supervision.police.dto.caseScore; +import cn.hutool.core.util.StrUtil; import com.supervision.police.domain.ModelAtomicIndex; import com.supervision.police.domain.ModelAtomicResult; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import org.springframework.ai.chat.ChatClient; import java.util.Objects; @@ -32,6 +34,10 @@ public class AtomicResult { public AtomicResult() { } + public boolean resultIsTrue() { + return StrUtil.equals("1",this.judgeResult) || StrUtil.equals("3",this.judgeResult); + } + public AtomicResult(String indexId,ModelAtomicIndex modelAtomicIndex, ModelAtomicResult atomicResult) { if (Objects.isNull(atomicResult) || Objects.isNull(modelAtomicIndex)){ return; @@ -42,4 +48,29 @@ public class AtomicResult { this.indexSource = modelAtomicIndex.getIndexSource(); this.judgeResult = atomicResult.getAtomicResult(); } + + public String buildDesc(ChatClient chatClient) { + // 人工定义 + if (StrUtil.equals("1",this.indexSource)){ + + return null; + } + + // 数据库查询 + if (StrUtil.equals("2",this.indexSource)){ + return null; + } + + // 图谱生成 + if (StrUtil.equals("3",this.indexSource)){ + return null; + } + + // 大模型 + if (StrUtil.equals("4",this.indexSource)){ + return null; + } + + return null; + } } 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 bdc3ccf..36cf94e 100644 --- a/src/main/java/com/supervision/police/dto/caseScore/CaseScoreDetailBuilder.java +++ b/src/main/java/com/supervision/police/dto/caseScore/CaseScoreDetailBuilder.java @@ -2,8 +2,10 @@ package com.supervision.police.dto.caseScore; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.supervision.constant.ScoreEnum; import com.supervision.police.domain.*; +import com.supervision.police.mapper.*; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import org.springframework.ai.ollama.OllamaChatClient; @@ -37,6 +39,33 @@ public class CaseScoreDetailBuilder { */ private OllamaChatClient chatClient; + private ModelCaseMapper modelCaseMapper; + private CasePersonMapper casePersonMapper; + private ModelAtomicIndexMapper modelAtomicIndexMapper; + private ModelIndexResultMapper modelIndexResultMapper; + private ModelIndexMapper modelIndexMapper; + private ModelAtomicResultMapper modelAtomicResultMapper; + + public CaseScoreDetailBuilder() { + } + + public CaseScoreDetailBuilder setOllamaChatClient(OllamaChatClient chatClient) { + this.chatClient = chatClient; + return this; + } + + public CaseScoreDetailBuilder setMapper(ModelCaseMapper modelCaseMapper, CasePersonMapper casePersonMapper, + ModelAtomicIndexMapper modelAtomicIndexMapper,ModelIndexResultMapper modelIndexResultMapper, + ModelIndexMapper modelIndexMapper,ModelAtomicResultMapper modelAtomicResultMapper) { + this.modelCaseMapper = modelCaseMapper; + this.casePersonMapper = casePersonMapper; + this.modelAtomicIndexMapper = modelAtomicIndexMapper; + this.modelIndexResultMapper = modelIndexResultMapper; + this.modelIndexMapper = modelIndexMapper; + this.modelAtomicResultMapper = modelAtomicResultMapper; + return this; + } + /** * 共性指标分数 @@ -136,12 +165,31 @@ public class CaseScoreDetailBuilder { caseScoreDetailDTO.setCommonIndexHitCount(this.countIndexGroup("1",res->res.getActualScore() > 0).intValue()); if (crimeScore < crimeOutScore){ - caseScoreDetailDTO.setCrimeIndexCount(this.countIndexGroup("3",res->true).intValue()); - caseScoreDetailDTO.setCrimeIndexHitCount(this.countIndexGroup("3",res->res.getActualScore() > 0).intValue()); + caseScoreDetailDTO.setCrimeOrOut(1); + caseScoreDetailDTO.setSpecificCrimeIndexCount(this.countIndexGroup("3", res->true).intValue()); + caseScoreDetailDTO.setSpecificCrimeIndexHitCount(this.countIndexGroup("3", res->res.getActualScore() > 0).intValue()); }else { - caseScoreDetailDTO.setCrimeIndexCount(this.countIndexGroup("2",res->true).intValue()); - caseScoreDetailDTO.setCrimeIndexHitCount(this.countIndexGroup("2",res->res.getActualScore() > 0).intValue()); + caseScoreDetailDTO.setCrimeOrOut(0); + caseScoreDetailDTO.setSpecificCrimeIndexCount(this.countIndexGroup("2", res->true).intValue()); + caseScoreDetailDTO.setSpecificCrimeIndexHitCount(this.countIndexGroup("2", res->res.getActualScore() > 0).intValue()); } + + // 构建指标描述 + // 命中的公共指标数据 + List commonIndexResultList = this.listCommonIndexResult(); + caseScoreDetailDTO.setCommonIndexDescList( + commonIndexResultList.stream().map(indexResult -> indexResult.buildDesc(this.chatClient)).collect(Collectors.toList())); + // 命中的入罪或者出罪指标数据 + List specialCirimeIndexResultList = Integer.valueOf(0).equals(caseScoreDetailDTO.getCrimeOrOut()) ? + this.listCrimeIndexResult():this.listOutCrimeIndexResult(); + caseScoreDetailDTO.setSpecificCrimeIndexDescList( + specialCirimeIndexResultList.stream().map(indexResult -> indexResult.buildDesc(this.chatClient)).collect(Collectors.toList()) + ); + + caseScoreDetailDTO.setMissAtomicIndexCount( + this.indexResultList.stream().filter(indexResult -> indexResult.getActualScore() == 0) + .mapToInt(index -> CollUtil.size(index.getAtomicResults())).sum() + ); return caseScoreDetailDTO; } @@ -166,4 +214,72 @@ public class CaseScoreDetailBuilder { && function.apply(indexResult)).count(); } + + + /** + * 获取共性指标 + * @return + */ + public List listCommonIndexResult() { + return listIndexGroup("1",res->res.getActualScore() > 0); + } + + /** + * 获取入罪指标 + * @return + */ + public List listCrimeIndexResult() { + return listIndexGroup("2",res->res.getActualScore() > 0); + } + + /** + * 获取出罪指标 + * @return + */ + public List listOutCrimeIndexResult() { + return listIndexGroup("3",res->res.getActualScore() > 0); + } + + private List listIndexGroup(String indexGroup, Function function) { + if (CollUtil.isEmpty(this.indexResultList)){ + return new ArrayList<>(); + } + + return this.indexResultList.stream() + .filter(indexResult -> StrUtil.equals(indexGroup,indexResult.getIndexGroup()) + && function.apply(indexResult)).collect(Collectors.toList()); + + } + + public CaseScoreDetailBuilder loadCaseScoreDetail(String caseId) { + + // 1 设置案件基本信息 + ModelCase modelCase = modelCaseMapper.selectById(caseId); + this.setCaseId(modelCase.getId()); + this.setCaseName(modelCase.getCaseName()); + + // 2 设置当事人人员信息 + List casePersonList = casePersonMapper.selectList(new LambdaQueryWrapper().eq(CasePerson::getCaseId, caseId)); + this.setLawActor(casePersonList); + + // 3 设置指标结果信息 + + // 3.1 获取指标信息 + List modelIndices = modelIndexMapper.selectList(new LambdaQueryWrapper().eq(ModelIndex::getCaseType, modelCase.getCaseType())); + + // 3.2 获取指标结果信息 后面需要根据行人人id进行过滤 + List modelIndexResults = modelIndexResultMapper.selectList( + new LambdaQueryWrapper().eq(ModelIndexResult::getCaseId, caseId)); + + // 3.3 获取原子指标信息 + List modelAtomicIndices = modelAtomicIndexMapper.selectList(new LambdaQueryWrapper().eq(ModelAtomicIndex::getCaseType, modelCase.getCaseType())); + + // 3.4 获取原子指标结果 + List modelAtomicResults = modelAtomicResultMapper.selectList( + new LambdaQueryWrapper().eq(ModelAtomicResult::getCaseId, caseId)); + + this.setIndexResultList(modelIndices, modelIndexResults, modelAtomicIndices, modelAtomicResults); + + return this; + } } diff --git a/src/main/java/com/supervision/police/dto/caseScore/CaseScoreDetailDTO.java b/src/main/java/com/supervision/police/dto/caseScore/CaseScoreDetailDTO.java index df334d2..3cb4ed7 100644 --- a/src/main/java/com/supervision/police/dto/caseScore/CaseScoreDetailDTO.java +++ b/src/main/java/com/supervision/police/dto/caseScore/CaseScoreDetailDTO.java @@ -31,17 +31,20 @@ public class CaseScoreDetailDTO { @Schema(description = "共性指标命中数量") private Integer commonIndexHitCount; - @Schema(description = "共性指标命描述") + @Schema(description = "共性指标命描述(指标+命中的原子指标)") private List commonIndexDescList; - @Schema(description = "入罪指标数量") - private Integer crimeIndexCount; + @Schema(description = "入罪/出罪 0:入罪 1:出罪") + private Integer crimeOrOut; - @Schema(description = "入罪指标命中数量") - private Integer crimeIndexHitCount; + @Schema(description = "入罪/出罪指标数量") + private Integer specificCrimeIndexCount; - @Schema(description = "入罪指标命描述") - private List crimeIndexDescList; + @Schema(description = "入罪/出罪指标命中数量") + private Integer specificCrimeIndexHitCount; + + @Schema(description = "入罪/出罪指标命描述(指标+命中的原子指标)") + private List specificCrimeIndexDescList; @Schema(description = "缺失的原子指标数量") private Integer missAtomicIndexCount; diff --git a/src/main/java/com/supervision/police/dto/caseScore/IndexResult.java b/src/main/java/com/supervision/police/dto/caseScore/IndexResult.java index 15dacb6..21161cc 100644 --- a/src/main/java/com/supervision/police/dto/caseScore/IndexResult.java +++ b/src/main/java/com/supervision/police/dto/caseScore/IndexResult.java @@ -1,6 +1,7 @@ package com.supervision.police.dto.caseScore; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Assert; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.StrUtil; import com.supervision.police.domain.ModelAtomicIndex; @@ -10,9 +11,11 @@ import com.supervision.police.domain.ModelIndexResult; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.extern.slf4j.Slf4j; +import org.springframework.ai.chat.ChatClient; import java.util.*; import java.util.stream.Collectors; +import java.util.stream.Stream; /** * @Description 指标结果 @@ -76,4 +79,12 @@ public class IndexResult { } + /** + * 构建指标结果描述 + * @return + */ + public String buildDesc(ChatClient chatClient){ + return indexName; + } + } diff --git a/src/main/java/com/supervision/police/service/ModelService.java b/src/main/java/com/supervision/police/service/ModelService.java index e6088f7..90ba829 100644 --- a/src/main/java/com/supervision/police/service/ModelService.java +++ b/src/main/java/com/supervision/police/service/ModelService.java @@ -3,6 +3,7 @@ package com.supervision.police.service; import com.supervision.common.domain.R; import com.supervision.police.dto.AnalyseCaseDTO; import com.supervision.police.dto.CaseStatus; +import com.supervision.police.dto.caseScore.CaseScoreDetailDTO; public interface ModelService { @@ -13,7 +14,7 @@ public interface ModelService { * @param caseId 案件id * @return */ - String caseScoreDetail(String caseId); + CaseScoreDetailDTO caseScoreDetail(String caseId); /** * 获取案件数据状态 diff --git a/src/main/java/com/supervision/police/service/impl/ModelServiceImpl.java b/src/main/java/com/supervision/police/service/impl/ModelServiceImpl.java index 5bd5d61..dfeff6c 100644 --- a/src/main/java/com/supervision/police/service/impl/ModelServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/ModelServiceImpl.java @@ -19,6 +19,7 @@ import com.supervision.police.dto.AtomicData; import com.supervision.police.dto.CaseStatus; import com.supervision.police.dto.JudgeLogic; import com.supervision.police.dto.caseScore.CaseScoreDetailBuilder; +import com.supervision.police.dto.caseScore.CaseScoreDetailDTO; import com.supervision.police.mapper.*; import com.supervision.police.mybatis.RowSqlMapper; import com.supervision.police.service.CaseStatusManageService; @@ -147,13 +148,16 @@ public class ModelServiceImpl implements ModelService { } @Override - public String caseScoreDetail(String caseId) { + public CaseScoreDetailDTO caseScoreDetail(String caseId) { Assert.notEmpty(caseId, "案件id不能为空"); - CaseScoreDetailBuilder caseScoreDetailBuilder = loadCaseScoreDetail(caseId); + CaseScoreDetailBuilder caseScoreDetailBuilder = new CaseScoreDetailBuilder() + .setOllamaChatClient(null) + .setMapper(modelCaseMapper, casePersonMapper, modelAtomicIndexMapper, + modelIndexResultMapper, modelIndexMapper, modelAtomicResultMapper); - - return null; + caseScoreDetailBuilder.loadCaseScoreDetail(caseId); + return caseScoreDetailBuilder.build(); } @Override @@ -168,40 +172,6 @@ public class ModelServiceImpl implements ModelService { } - private CaseScoreDetailBuilder loadCaseScoreDetail(String caseId) { - - CaseScoreDetailBuilder caseScoreDetailBuilder = new CaseScoreDetailBuilder(); - - // 1 设置案件基本信息 - ModelCase modelCase = modelCaseMapper.selectById(caseId); - caseScoreDetailBuilder.setCaseId(modelCase.getId()); - caseScoreDetailBuilder.setCaseName(modelCase.getCaseName()); - - // 2 设置当事人人员信息 - List casePersonList = casePersonMapper.selectList(new LambdaQueryWrapper().eq(CasePerson::getCaseId, caseId)); - caseScoreDetailBuilder.setLawActor(casePersonList); - - // 3 设置指标结果信息 - - // 3.1 获取指标信息 - List modelIndices = modelIndexMapper.selectList(new LambdaQueryWrapper().eq(ModelIndex::getCaseType, modelCase.getCaseType())); - - // 3.2 获取指标结果信息 后面需要根据行人人id进行过滤 - List modelIndexResults = modelIndexResultMapper.selectList( - new LambdaQueryWrapper().eq(ModelIndexResult::getCaseId, caseId)); - - // 3.3 获取原子指标信息 - List modelAtomicIndices = modelAtomicIndexMapper.selectList(new LambdaQueryWrapper().eq(ModelAtomicIndex::getCaseType, modelCase.getCaseType())); - - // 3.4 获取原子指标结果 - List modelAtomicResults = modelAtomicResultMapper.selectList( - new LambdaQueryWrapper().eq(ModelAtomicResult::getCaseId, caseId)); - - caseScoreDetailBuilder.setIndexResultList(modelIndices, modelIndexResults, modelAtomicIndices, modelAtomicResults); - - return caseScoreDetailBuilder; - } - /** * 最终计算得分 */