1. 数据库分析证据结果功能初步提交

topo_dev
xueqingkun 9 months ago
parent 697a8cca4c
commit b8a0145097

@ -0,0 +1,41 @@
package com.supervision.constants;
import java.util.Objects;
public enum ScoreEnum {
EVIDENCE_FULL("证据充分", "司法机关对案件形成一致认定意见的概率比较大"),
EVIDENCE_LACK("证据不足", "司法籍贯认定意见不一致的概率比较大"),
EVIDENCE_NOT_FULL("证据不充分", "司法籍贯会作出绝对不起诉或存疑不起诉的决定");
private final String name;
private final String desc;
ScoreEnum(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
public static ScoreEnum getScoreEnum(Integer score) {
if (Objects.isNull(score)){
return null;
}
if (score < 50){
return EVIDENCE_NOT_FULL;
}
if (score <= 70){
return EVIDENCE_LACK;
}
return EVIDENCE_FULL;
}
}

@ -3,15 +3,18 @@ package com.supervision.police.controller;
import com.supervision.common.domain.R;
import com.supervision.police.dto.AnalyseCaseDTO;
import com.supervision.police.service.ModelService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("model")
@RequiredArgsConstructor
public class ModelController {
@Autowired
private ModelService modelService;
private final ModelService modelService;
/**
*
@ -19,8 +22,23 @@ public class ModelController {
* @return
*/
@PostMapping("/analyseCase")
@Operation(summary = "分析指标")
public R<?> analyseCase(@RequestBody AnalyseCaseDTO analyseCaseDTO) {
return modelService.analyseCase(analyseCaseDTO);
}
/**
*
* @param caseId id
* @return
*/
@GetMapping("/caseScoreDetail")
@Operation(summary = "案件得分详情功能")
public R<?> caseScoreDetail( @RequestParam @Parameter(name = "caseId",description = "案件id") String caseId) {
String detail = modelService.caseScoreDetail(caseId);
return R.ok(detail);
}
}

@ -0,0 +1,45 @@
package com.supervision.police.dto.caseScore;
import com.supervision.police.domain.ModelAtomicIndex;
import com.supervision.police.domain.ModelAtomicResult;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Objects;
/**
*
*/
@Data
public class AtomicResult {
@Schema(description = "原子指标id")
private String atomicId;
@Schema(description = "原子指标名称")
private String atomicName;
@Schema(description = "指标id")
private String indexId;
@Schema(description = "指标来源 1:人工定义 2:数据库查询 3:图谱生成 4:大模型")
private String indexSource;
@Schema(description = "原子指标结果 1:真实 2:虚构 3存在 4不存在 5未知")
private String judgeResult;
public AtomicResult() {
}
public AtomicResult(String indexId,ModelAtomicIndex modelAtomicIndex, ModelAtomicResult atomicResult) {
if (Objects.isNull(atomicResult) || Objects.isNull(modelAtomicIndex)){
return;
}
this.atomicId = modelAtomicIndex.getId();
this.indexId = indexId;
this.atomicName = modelAtomicIndex.getName();
this.indexSource = modelAtomicIndex.getIndexSource();
this.judgeResult = atomicResult.getAtomicResult();
}
}

@ -0,0 +1,169 @@
package com.supervision.police.dto.caseScore;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import com.supervision.constants.ScoreEnum;
import com.supervision.police.domain.*;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.ai.ollama.OllamaChatClient;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
*
*/
@Data
public class CaseScoreDetailBuilder {
@Schema(description = "案件id")
private String caseId;
@Schema(description = "案件名称")
private String caseName;
@Schema(description = "当事人列表")
private List<LawParty> lawPartyList;
@Schema(description = "指标结果")
private List<IndexResult> indexResultList;
/**
* Ollama
*/
private OllamaChatClient chatClient;
/**
*
* @return
*/
public Integer getCommonScore() {
return sumIndexGroupScore("1");
}
/**
*
* @return
*/
public Integer getCrimeScore() {
return sumIndexGroupScore("2");
}
/**
*
* @return
*/
public Integer getCrimeOutScore() {
return sumIndexGroupScore("3");
}
/**
*
*/
public LawParty getLawActor() {
if (CollUtil.isEmpty(this.lawPartyList)){
return null;
}
return this.lawPartyList.stream()
.filter(lawParty -> StrUtil.equals("1",lawParty.getUserType())).findFirst().orElse(null);
}
public void setIndexResultList(List<ModelIndex> indexList, List<ModelIndexResult> indexResultList,
List<ModelAtomicIndex> atomicIndexList, List<ModelAtomicResult> atomicResultList) {
if (CollUtil.isEmpty(indexList) || CollUtil.isEmpty(indexResultList)){
this.indexResultList = new ArrayList<>();
return;
}
Map<String, ModelIndexResult> modelIndexResultMap = indexResultList.stream().collect(
Collectors.toMap(ModelIndexResult::getIndexId, modelIndexResult -> modelIndexResult));
this.indexResultList = indexList.stream().map(indexInfo ->
new IndexResult(indexInfo,modelIndexResultMap.get(indexInfo.getId()),atomicIndexList,atomicResultList)
).toList();
}
/**
*
* @param casePersonList
*/
public void setLawActor(List<CasePerson> casePersonList) {
if (CollUtil.isEmpty(casePersonList)){
this.lawPartyList = new ArrayList<>();
return;
}
this.lawPartyList = casePersonList.stream()
.map(casePerson -> {
LawParty lawParty = new LawParty();
lawParty.setUserId(casePerson.getId());
lawParty.setUserName(casePerson.getName());
lawParty.setUserType(casePerson.getRoleCode());
return lawParty;
}).toList();
}
/**
* CaseScoreDetailDTO
*/
public CaseScoreDetailDTO build(){
CaseScoreDetailDTO caseScoreDetailDTO = new CaseScoreDetailDTO();
caseScoreDetailDTO.setCaseName(this.caseName);
caseScoreDetailDTO.setCommonScore(this.getCommonScore());
Integer crimeScore = this.getCrimeScore();
Integer crimeOutScore = this.getCrimeOutScore();
caseScoreDetailDTO.setCrimeScore(crimeScore < crimeOutScore? crimeOutScore:crimeScore);
int sumScore = caseScoreDetailDTO.getCommonScore() + caseScoreDetailDTO.getCrimeScore();
ScoreEnum scoreEnum = ScoreEnum.getScoreEnum(sumScore);
if (scoreEnum != null){
caseScoreDetailDTO.setScoreDesc(scoreEnum.getDesc());
caseScoreDetailDTO.setJudicialCharacterization(scoreEnum.getName());
}
caseScoreDetailDTO.setCommonIndexCount(this.countIndexGroup("1",res->true).intValue());
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());
}else {
caseScoreDetailDTO.setCrimeIndexCount(this.countIndexGroup("2",res->true).intValue());
caseScoreDetailDTO.setCrimeIndexHitCount(this.countIndexGroup("2",res->res.getActualScore() > 0).intValue());
}
return caseScoreDetailDTO;
}
private Integer sumIndexGroupScore(String indexGroup) {
if (CollUtil.isEmpty(this.indexResultList)){
return 0;
}
return this.indexResultList.stream()
.filter(indexResult -> StrUtil.equals(indexGroup,indexResult.getIndexGroup()))
.mapToInt(IndexResult::getIndexScore).sum();
}
private Long countIndexGroup(String indexGroup, Function<IndexResult, Boolean> function) {
if (CollUtil.isEmpty(this.indexResultList)){
return 0L;
}
return this.indexResultList.stream()
.filter(indexResult -> StrUtil.equals(indexGroup,indexResult.getIndexGroup())
&& function.apply(indexResult)).count();
}
}

@ -0,0 +1,50 @@
package com.supervision.police.dto.caseScore;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
@Data
@Slf4j
public class CaseScoreDetailDTO {
@Schema(description = "案件名称")
private String caseName;
@Schema(description = "共性指标分数")
private Integer commonScore;
@Schema(description = "入罪指标分数")
private Integer crimeScore;
@Schema(description = "分数描述")
private String scoreDesc;
@Schema(description = "司法定性")
private String judicialCharacterization;
@Schema(description = "共性指标数量")
private Integer commonIndexCount;
@Schema(description = "共性指标命中数量")
private Integer commonIndexHitCount;
@Schema(description = "共性指标命描述")
private List<String> commonIndexDescList;
@Schema(description = "入罪指标数量")
private Integer crimeIndexCount;
@Schema(description = "入罪指标命中数量")
private Integer crimeIndexHitCount;
@Schema(description = "入罪指标命描述")
private List<String> crimeIndexDescList;
@Schema(description = "缺失的原子指标数量")
private Integer missAtomicIndexCount;
}

@ -0,0 +1,79 @@
package com.supervision.police.dto.caseScore;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.BooleanUtil;
import cn.hutool.core.util.StrUtil;
import com.supervision.police.domain.ModelAtomicIndex;
import com.supervision.police.domain.ModelAtomicResult;
import com.supervision.police.domain.ModelIndex;
import com.supervision.police.domain.ModelIndexResult;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Description
*/
@Data
@Slf4j
public class IndexResult {
@Schema(description = "指标id")
private String indexId;
@Schema(description = "指标名称")
private String indexName;
@Schema(description = "指标分组 1:共性指标 2入罪指标 3出罪指标")
private String indexGroup;
@Schema(description = "指标分数")
private Integer indexScore;
@Schema(description = "实际分数")
private int actualScore;
@Schema(description = "原子指标结果")
private List<AtomicResult> atomicResults;
public IndexResult() {
}
public IndexResult(ModelIndex indexInfo, ModelIndexResult modelIndexResult,
List<ModelAtomicIndex> atomicIndexList, List<ModelAtomicResult> atomicResultList ) {
if (Objects.isNull(modelIndexResult) || Objects.isNull(indexInfo)){
return;
}
this.indexId = indexInfo.getId();
this.indexGroup = indexInfo.getIndexType();
this.indexName = indexInfo.getName();
this.indexScore = indexInfo.getIndexScore();
if (StrUtil.equals("true", modelIndexResult.getIndexResult())){
// 如果运行结果为真,则实际分数为指标分数
this.actualScore = indexInfo.getIndexScore();
}
if (CollUtil.isEmpty(atomicResultList) || StrUtil.isEmpty(modelIndexResult.getAtomicIds())){
return;
}
// 填充原子指标结果属性
List<String> atomicIdList = Arrays.stream(modelIndexResult.getAtomicIds().split(",")).toList();
atomicResultList = atomicResultList.stream().filter(atomicResult -> atomicIdList.contains(atomicResult.getAtomicId())).distinct().toList();
if (CollUtil.isEmpty(atomicResultList)){
log.info("IndexResult:经过过滤后的原子指标结果为空");
return;
}
if (Objects.isNull(atomicIndexList)){
atomicIndexList = new ArrayList<>(1);
}
// 注意不要有重复值
Map<String, ModelAtomicIndex> atomicIndexMap = atomicIndexList.stream().collect(Collectors.toMap(ModelAtomicIndex::getId, k -> k, (k1, k2) -> k1));
this.atomicResults = atomicResultList.stream().map(atomicResult -> new AtomicResult(indexId,
atomicIndexMap.get(atomicResult.getAtomicId()), atomicResult)).toList();
}
}

@ -0,0 +1,20 @@
package com.supervision.police.dto.caseScore;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
*
*/
@Data
public class LawParty {
@Schema(description = "当事人id")
private String userId;
@Schema(description = "当事人名称")
private String userName;
@Schema(description = "当事人类型 1:行为人 2当事人")
private String userType;
}

@ -7,4 +7,10 @@ public interface ModelService {
R<?> analyseCase(AnalyseCaseDTO analyseCaseDTO);
/**
*
* @param caseId id
* @return
*/
String caseScoreDetail(String caseId);
}

@ -1,10 +1,10 @@
package com.supervision.police.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.supervision.common.domain.R;
import com.supervision.common.utils.StringUtils;
import com.supervision.neo4j.dto.ResultDTO;
@ -13,6 +13,7 @@ import com.supervision.police.domain.*;
import com.supervision.police.dto.AnalyseCaseDTO;
import com.supervision.police.dto.AtomicData;
import com.supervision.police.dto.JudgeLogic;
import com.supervision.police.dto.caseScore.CaseScoreDetailBuilder;
import com.supervision.police.mapper.*;
import com.supervision.police.service.ModelService;
import lombok.RequiredArgsConstructor;
@ -100,6 +101,50 @@ public class ModelServiceImpl implements ModelService {
return R.ok();
}
@Override
public String caseScoreDetail(String caseId) {
Assert.notEmpty(caseId, "案件id不能为空");
CaseScoreDetailBuilder caseScoreDetailBuilder = loadCaseScoreDetail(caseId);
return null;
}
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