1. 案件得分详情功能

topo_dev
xueqingkun 9 months ago
parent 38ea4c2d1b
commit 829cdd0c9c

@ -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<CaseScoreDetailDTO> caseScoreDetail( @RequestParam @Parameter(name = "caseId",description = "案件id") String caseId) {
String detail = modelService.caseScoreDetail(caseId);
CaseScoreDetailDTO detail = modelService.caseScoreDetail(caseId);
return R.ok(detail);
}

@ -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;
}
}

@ -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<IndexResult> commonIndexResultList = this.listCommonIndexResult();
caseScoreDetailDTO.setCommonIndexDescList(
commonIndexResultList.stream().map(indexResult -> indexResult.buildDesc(this.chatClient)).collect(Collectors.toList()));
// 命中的入罪或者出罪指标数据
List<IndexResult> 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<IndexResult> listCommonIndexResult() {
return listIndexGroup("1",res->res.getActualScore() > 0);
}
/**
*
* @return
*/
public List<IndexResult> listCrimeIndexResult() {
return listIndexGroup("2",res->res.getActualScore() > 0);
}
/**
*
* @return
*/
public List<IndexResult> listOutCrimeIndexResult() {
return listIndexGroup("3",res->res.getActualScore() > 0);
}
private List<IndexResult> listIndexGroup(String indexGroup, Function<IndexResult, Boolean> 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<CasePerson> casePersonList = casePersonMapper.selectList(new LambdaQueryWrapper<CasePerson>().eq(CasePerson::getCaseId, caseId));
this.setLawActor(casePersonList);
// 3 设置指标结果信息
// 3.1 获取指标信息
List<ModelIndex> modelIndices = modelIndexMapper.selectList(new LambdaQueryWrapper<ModelIndex>().eq(ModelIndex::getCaseType, modelCase.getCaseType()));
// 3.2 获取指标结果信息 后面需要根据行人人id进行过滤
List<ModelIndexResult> modelIndexResults = modelIndexResultMapper.selectList(
new LambdaQueryWrapper<ModelIndexResult>().eq(ModelIndexResult::getCaseId, caseId));
// 3.3 获取原子指标信息
List<ModelAtomicIndex> modelAtomicIndices = modelAtomicIndexMapper.selectList(new LambdaQueryWrapper<ModelAtomicIndex>().eq(ModelAtomicIndex::getCaseType, modelCase.getCaseType()));
// 3.4 获取原子指标结果
List<ModelAtomicResult> modelAtomicResults = modelAtomicResultMapper.selectList(
new LambdaQueryWrapper<ModelAtomicResult>().eq(ModelAtomicResult::getCaseId, caseId));
this.setIndexResultList(modelIndices, modelIndexResults, modelAtomicIndices, modelAtomicResults);
return this;
}
}

@ -31,17 +31,20 @@ public class CaseScoreDetailDTO {
@Schema(description = "共性指标命中数量")
private Integer commonIndexHitCount;
@Schema(description = "共性指标命描述")
@Schema(description = "共性指标命描述(指标+命中的原子指标)")
private List<String> 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<String> crimeIndexDescList;
@Schema(description = "入罪/出罪指标命中数量")
private Integer specificCrimeIndexHitCount;
@Schema(description = "入罪/出罪指标命描述(指标+命中的原子指标)")
private List<String> specificCrimeIndexDescList;
@Schema(description = "缺失的原子指标数量")
private Integer missAtomicIndexCount;

@ -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;
}
}

@ -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);
/**
*

@ -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<CasePerson> casePersonList = casePersonMapper.selectList(new LambdaQueryWrapper<CasePerson>().eq(CasePerson::getCaseId, caseId));
caseScoreDetailBuilder.setLawActor(casePersonList);
// 3 设置指标结果信息
// 3.1 获取指标信息
List<ModelIndex> modelIndices = modelIndexMapper.selectList(new LambdaQueryWrapper<ModelIndex>().eq(ModelIndex::getCaseType, modelCase.getCaseType()));
// 3.2 获取指标结果信息 后面需要根据行人人id进行过滤
List<ModelIndexResult> modelIndexResults = modelIndexResultMapper.selectList(
new LambdaQueryWrapper<ModelIndexResult>().eq(ModelIndexResult::getCaseId, caseId));
// 3.3 获取原子指标信息
List<ModelAtomicIndex> modelAtomicIndices = modelAtomicIndexMapper.selectList(new LambdaQueryWrapper<ModelAtomicIndex>().eq(ModelAtomicIndex::getCaseType, modelCase.getCaseType()));
// 3.4 获取原子指标结果
List<ModelAtomicResult> modelAtomicResults = modelAtomicResultMapper.selectList(
new LambdaQueryWrapper<ModelAtomicResult>().eq(ModelAtomicResult::getCaseId, caseId));
caseScoreDetailBuilder.setIndexResultList(modelIndices, modelIndexResults, modelAtomicIndices, modelAtomicResults);
return caseScoreDetailBuilder;
}
/**
*
*/

Loading…
Cancel
Save