|
|
|
@ -21,6 +21,7 @@ import com.supervision.police.dto.caseScore.CaseScoreDetailBuilder;
|
|
|
|
|
import com.supervision.police.dto.caseScore.CaseScoreDetailDTO;
|
|
|
|
|
import com.supervision.police.dto.indexRule.IndexRule;
|
|
|
|
|
import com.supervision.police.dto.indexRule.Operand;
|
|
|
|
|
import com.supervision.police.dto.indexRule.OperandUnit;
|
|
|
|
|
import com.supervision.police.mapper.*;
|
|
|
|
|
import com.supervision.police.mybatis.RowSqlMapper;
|
|
|
|
|
import com.supervision.police.service.*;
|
|
|
|
@ -196,8 +197,10 @@ public class ModelServiceImpl implements ModelService {
|
|
|
|
|
List<EvidenceDirectory> evidenceDirectories = evidenceDirectoryService.list(new LambdaQueryWrapper<EvidenceDirectory>().eq(EvidenceDirectory::getCaseId, caseId));
|
|
|
|
|
// 查出证据信息
|
|
|
|
|
List<CaseEvidence> caseEvidences = caseEvidenceService.list(new LambdaQueryWrapper<CaseEvidence>().eq(CaseEvidence::getCaseId, caseId));
|
|
|
|
|
log.info("开始计算指标结果");
|
|
|
|
|
// 遍历指标集合,处理每个指标的判断逻辑,得出结果
|
|
|
|
|
modelIndices.forEach(modelIndex -> {
|
|
|
|
|
log.info("开始计算指标ID:{},指标名称:{}", modelIndex.getId(), modelIndex.getName());
|
|
|
|
|
IndexRule indexRule = modelIndex.getIndexRule();
|
|
|
|
|
Set<Boolean> ruleConditionGroupResultList = new HashSet<>();
|
|
|
|
|
if (indexRule != null) {
|
|
|
|
@ -205,15 +208,16 @@ public class ModelServiceImpl implements ModelService {
|
|
|
|
|
Set<Boolean> ruleConditionResultSet = new HashSet<>();
|
|
|
|
|
ruleConditionGroup.getRuleConditionList().forEach(ruleCondition -> {
|
|
|
|
|
Set<Boolean> operandUnitResultSet = new HashSet<>();
|
|
|
|
|
// 得到当前指标要求的存在关系(存在或不存在)
|
|
|
|
|
boolean relationSymbol = IndexRuleConstants.EVALUATE_RESULT_EXIST.equals(ruleCondition.getRelationalSymbol());
|
|
|
|
|
ModelAtomicIndex modelAtomicIndex = atomicIndices.stream().filter(atomicIndex -> atomicIndex.getId().equals(ruleCondition.getAtomicIndexId())).findAny().orElse(null);
|
|
|
|
|
if (modelAtomicIndex == null) {
|
|
|
|
|
log.error("原子指标不存在,跳出当前循环。原子指标ID:{}", ruleCondition.getAtomicIndexId());
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
ruleCondition.getOperandUnitList().forEach(operandUnit -> {
|
|
|
|
|
Operand left = operandUnit.getLeftOperand();
|
|
|
|
|
boolean relationSymbol = IndexRuleConstants.EVALUATE_RESULT_EXIST.equals(left.getRelationalSymbol());
|
|
|
|
|
Operand right = operandUnit.getRightOperand();
|
|
|
|
|
ModelAtomicIndex modelAtomicIndex = atomicIndices.stream().filter(atomicIndex -> atomicIndex.getId().equals(left.getAtomicIndexId())).findAny().orElse(null);
|
|
|
|
|
if (modelAtomicIndex == null) {
|
|
|
|
|
log.error("原子指标不存在,跳出当前循环。原子指标ID:{}", left.getAtomicIndexId());
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
// 定义原子指标结果共有属性
|
|
|
|
|
ModelAtomicResult result = new ModelAtomicResult();
|
|
|
|
|
result.setIndexId(modelIndex.getId());
|
|
|
|
@ -225,9 +229,9 @@ public class ModelServiceImpl implements ModelService {
|
|
|
|
|
if (exist != null) {
|
|
|
|
|
result.setId(exist.getId());
|
|
|
|
|
}
|
|
|
|
|
switch (left.getOperandType()) {
|
|
|
|
|
switch (ruleCondition.getIndexSource()) {
|
|
|
|
|
case OPERAND_TYPE_MANUAL:
|
|
|
|
|
operandUnitResultSet.add(relationSymbol == manualIndexAnalysis(left.getAtomicIndexId(), caseId));
|
|
|
|
|
operandUnitResultSet.add(relationSymbol == manualIndexAnalysis(ruleCondition.getAtomicIndexId(), caseId));
|
|
|
|
|
break;
|
|
|
|
|
case OPERAND_TYPE_DB:
|
|
|
|
|
operandUnitResultSet.add(relationSymbol == dbIndexAnalysis(caseId, modelAtomicIndex.getQueryLang(), result));
|
|
|
|
@ -236,7 +240,7 @@ public class ModelServiceImpl implements ModelService {
|
|
|
|
|
operandUnitResultSet.add(relationSymbol == graphIndexAnalysis(casePerson.getName(), modelAtomicIndex, analyseCaseDTO, result));
|
|
|
|
|
break;
|
|
|
|
|
case OPERAND_TYPE_STRUCTURE:
|
|
|
|
|
operandUnitResultSet.add(structureIndexAnalysis(left, right, operandUnit.getOperator(), modelAtomicIndex, atomicIndices, notePrompts, evidenceDirectories, caseEvidences, result));
|
|
|
|
|
operandUnitResultSet.add(structureIndexAnalysis(operandUnit, modelAtomicIndex, atomicIndices, notePrompts, evidenceDirectories, caseEvidences, result));
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
@ -341,11 +345,12 @@ public class ModelServiceImpl implements ModelService {
|
|
|
|
|
params.put("lawActor", casePersonName);
|
|
|
|
|
// 案号
|
|
|
|
|
params.put("caseId", analyseCaseDTO.getCaseId());
|
|
|
|
|
Result run = null;
|
|
|
|
|
Result run;
|
|
|
|
|
try {
|
|
|
|
|
run = session.run(modelAtomicIndex.getQueryLang(), params);
|
|
|
|
|
} catch (Exception e) {
|
|
|
|
|
log.error("图数据库查询出现错误,查询语句{},参数{}", modelAtomicIndex.getQueryLang(), JSONUtil.toJsonStr(params), e);
|
|
|
|
|
return flag;
|
|
|
|
|
}
|
|
|
|
|
List<ResultDTO> res = Neo4jUtils.getResultDTOList(run);
|
|
|
|
|
if (!res.isEmpty()) {
|
|
|
|
@ -372,8 +377,7 @@ public class ModelServiceImpl implements ModelService {
|
|
|
|
|
/**
|
|
|
|
|
* 结构化查询指标分析
|
|
|
|
|
*
|
|
|
|
|
* @param left 左操作数
|
|
|
|
|
* @param right 右操作数
|
|
|
|
|
* @param operandUnit 操作单元
|
|
|
|
|
* @param modelAtomicIndex 原子指标
|
|
|
|
|
* @param atomicIndices 原子指标集合
|
|
|
|
|
* @param notePrompts 提示词集合
|
|
|
|
@ -382,7 +386,10 @@ public class ModelServiceImpl implements ModelService {
|
|
|
|
|
* @param atomicResult 原子指标结果
|
|
|
|
|
* @return 是否存在
|
|
|
|
|
*/
|
|
|
|
|
private boolean structureIndexAnalysis(Operand left, Operand right, String operator, ModelAtomicIndex modelAtomicIndex, List<ModelAtomicIndex> atomicIndices, List<NotePrompt> notePrompts, List<EvidenceDirectory> evidenceDirectories, List<CaseEvidence> caseEvidences, ModelAtomicResult atomicResult) {
|
|
|
|
|
private boolean structureIndexAnalysis(OperandUnit operandUnit, ModelAtomicIndex modelAtomicIndex, List<ModelAtomicIndex> atomicIndices, List<NotePrompt> notePrompts, List<EvidenceDirectory> evidenceDirectories, List<CaseEvidence> caseEvidences, ModelAtomicResult atomicResult) {
|
|
|
|
|
Operand left = operandUnit.getLeftOperand();
|
|
|
|
|
String operator = operandUnit.getOperator();
|
|
|
|
|
Operand right = operandUnit.getRightOperand();
|
|
|
|
|
boolean flag = false;
|
|
|
|
|
List<CaseEvidence> evidences = getEvidencesByPromptId(modelAtomicIndex.getPromptId(), caseEvidences, evidenceDirectories, notePrompts);
|
|
|
|
|
ModelAtomicIndex rightModelAtomicIndex = null;
|
|
|
|
@ -400,14 +407,14 @@ public class ModelServiceImpl implements ModelService {
|
|
|
|
|
case AGGREGATE_TYPE_SUM:
|
|
|
|
|
if (OPERAND_TYPE_STRUCTURE.equals(right.getOperandType())) {
|
|
|
|
|
List<CaseEvidence> rightEvidences = getEvidencesByPromptId(rightModelAtomicIndex.getPromptId(), caseEvidences, evidenceDirectories, notePrompts);
|
|
|
|
|
if (CalculationUtil.evaluateExpression(String.valueOf(getSumFromEvidences(left, evidences)), operator, String.valueOf(getSumFromEvidences(right, rightEvidences)))) {
|
|
|
|
|
if (CalculationUtil.evaluateExpression(String.valueOf(getSumFromEvidences(left.getPropertyKey(), evidences)), operator, String.valueOf(getSumFromEvidences(right.getPropertyKey(), rightEvidences)))) {
|
|
|
|
|
atomicResult.setEvidenceId(evidences.stream().map(CaseEvidence::getId).collect(Collectors.joining(",")));
|
|
|
|
|
atomicResult.setAtomicResult(JudgeResultEnum.EXIST.getCode());
|
|
|
|
|
modelAtomicResultService.saveOrUpdate(atomicResult);
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
} else if (OPERAND_TYPE_VALUE.equals(right.getOperandType())) {
|
|
|
|
|
if (CalculationUtil.evaluateExpression(String.valueOf(getSumFromEvidences(left, evidences)), operator, right.getValue())) {
|
|
|
|
|
if (CalculationUtil.evaluateExpression(String.valueOf(getSumFromEvidences(left.getPropertyKey(), evidences)), operator, right.getValue())) {
|
|
|
|
|
atomicResult.setEvidenceId(evidences.stream().map(CaseEvidence::getId).collect(Collectors.joining(",")));
|
|
|
|
|
atomicResult.setAtomicResult(JudgeResultEnum.EXIST.getCode());
|
|
|
|
|
modelAtomicResultService.saveOrUpdate(atomicResult);
|
|
|
|
@ -464,14 +471,14 @@ public class ModelServiceImpl implements ModelService {
|
|
|
|
|
return flag;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Double getSumFromEvidences(Operand operand, List<CaseEvidence> evidences) {
|
|
|
|
|
private Double getSumFromEvidences(String propertyKey, List<CaseEvidence> evidences) {
|
|
|
|
|
AtomicReference<Double> sum = new AtomicReference<>(0.0);
|
|
|
|
|
if (evidences != null && !evidences.isEmpty()) {
|
|
|
|
|
evidences.forEach(e -> {
|
|
|
|
|
List<NotePromptExtractAttributesDto> properties = e.getProperty();
|
|
|
|
|
if (properties != null && !properties.isEmpty()) {
|
|
|
|
|
properties.forEach(p -> {
|
|
|
|
|
if (p.getAttrName().equals(operand.getPropertyKey())) {
|
|
|
|
|
if (p.getAttrName().equals(propertyKey)) {
|
|
|
|
|
if (StringUtils.isNotEmpty(p.getAttrValue())) {
|
|
|
|
|
sum.updateAndGet(v -> v + NumberUtil.parseDouble(p.getAttrValue()));
|
|
|
|
|
}
|
|
|
|
|