Merge remote-tracking branch 'origin/dev' into dev

topo_dev
xueqingkun 6 months ago
commit 5498fd9ad2

@ -211,21 +211,18 @@ public class ModelServiceImpl implements ModelService {
// 得到当前指标要求的存在关系(存在或不存在) // 得到当前指标要求的存在关系(存在或不存在)
boolean relationSymbol = IndexRuleConstants.EVALUATE_RESULT_EXIST.equals(ruleCondition.getRelationalSymbol()); boolean relationSymbol = IndexRuleConstants.EVALUATE_RESULT_EXIST.equals(ruleCondition.getRelationalSymbol());
ModelAtomicIndex modelAtomicIndex = atomicIndices.stream().filter(atomicIndex -> atomicIndex.getId().equals(ruleCondition.getAtomicIndexId())).findAny().orElse(null); ModelAtomicIndex modelAtomicIndex = atomicIndices.stream().filter(atomicIndex -> atomicIndex.getId().equals(ruleCondition.getAtomicIndexId())).findAny().orElse(null);
if (modelAtomicIndex == null) { if (modelAtomicIndex == null && !OPERAND_TYPE_STRUCTURE.equals(ruleCondition.getIndexSource())) {
log.error("原子指标不存在,跳出当前循环。原子指标ID:{}", ruleCondition.getAtomicIndexId()); log.error("原子指标不存在,跳出当前循环。原子指标ID:{}", ruleCondition.getAtomicIndexId());
return; return;
} }
ruleCondition.getOperandUnitList().forEach(operandUnit -> {
Operand left = operandUnit.getLeftOperand();
Operand right = operandUnit.getRightOperand();
// 定义原子指标结果共有属性 // 定义原子指标结果共有属性
ModelAtomicResult result = new ModelAtomicResult(); ModelAtomicResult result = new ModelAtomicResult();
result.setIndexId(modelIndex.getId()); result.setIndexId(modelIndex.getId());
result.setCasePersonId(casePerson.getId()); result.setCasePersonId(casePerson.getId());
result.setCaseId(analyseCaseDTO.getCaseId()); result.setCaseId(analyseCaseDTO.getCaseId());
result.setAtomicId(modelAtomicIndex.getId()); result.setAtomicId(ruleCondition.getAtomicIndexId());
result.setAtomicResult(JudgeResultEnum.NOT_EXIST.getCode()); result.setAtomicResult(JudgeResultEnum.NOT_EXIST.getCode());
ModelAtomicResult exist = modelAtomicResultMapper.selectByCaseIdAndAtomicId(caseId, casePerson.getId(), modelIndex.getId(), modelAtomicIndex.getId()); ModelAtomicResult exist = modelAtomicResultMapper.selectByCaseIdAndAtomicId(caseId, casePerson.getId(), modelIndex.getId(), ruleCondition.getAtomicIndexId());
if (exist != null) { if (exist != null) {
result.setId(exist.getId()); result.setId(exist.getId());
} }
@ -240,12 +237,11 @@ public class ModelServiceImpl implements ModelService {
operandUnitResultSet.add(relationSymbol == graphIndexAnalysis(casePerson.getName(), modelAtomicIndex, analyseCaseDTO, result)); operandUnitResultSet.add(relationSymbol == graphIndexAnalysis(casePerson.getName(), modelAtomicIndex, analyseCaseDTO, result));
break; break;
case OPERAND_TYPE_STRUCTURE: case OPERAND_TYPE_STRUCTURE:
operandUnitResultSet.add(structureIndexAnalysis(operandUnit, modelAtomicIndex, atomicIndices, notePrompts, evidenceDirectories, caseEvidences, result)); ruleCondition.getOperandUnitList().forEach(operandUnit -> operandUnitResultSet.add(structureIndexAnalysis(operandUnit, ruleCondition.getAtomicIndexId(), atomicIndices, notePrompts, evidenceDirectories, caseEvidences, result)));
break; break;
default: default:
break; break;
} }
});
ruleConditionResultSet.add(CalculationUtil.calculateBooleanSet(operandUnitResultSet, ruleCondition.getLogic())); ruleConditionResultSet.add(CalculationUtil.calculateBooleanSet(operandUnitResultSet, ruleCondition.getLogic()));
}); });
ruleConditionGroupResultList.add(CalculationUtil.calculateBooleanSet(ruleConditionResultSet, ruleConditionGroup.getRowLogic())); ruleConditionGroupResultList.add(CalculationUtil.calculateBooleanSet(ruleConditionResultSet, ruleConditionGroup.getRowLogic()));
@ -378,7 +374,7 @@ public class ModelServiceImpl implements ModelService {
* *
* *
* @param operandUnit * @param operandUnit
* @param modelAtomicIndex * @param modelAtomicIndexId ID
* @param atomicIndices * @param atomicIndices
* @param notePrompts * @param notePrompts
* @param evidenceDirectories * @param evidenceDirectories
@ -386,11 +382,16 @@ public class ModelServiceImpl implements ModelService {
* @param atomicResult * @param atomicResult
* @return * @return
*/ */
private boolean structureIndexAnalysis(OperandUnit operandUnit, ModelAtomicIndex modelAtomicIndex, List<ModelAtomicIndex> atomicIndices, List<NotePrompt> notePrompts, List<EvidenceDirectory> evidenceDirectories, List<CaseEvidence> caseEvidences, ModelAtomicResult atomicResult) { private boolean structureIndexAnalysis(OperandUnit operandUnit, String modelAtomicIndexId, List<ModelAtomicIndex> atomicIndices, List<NotePrompt> notePrompts, List<EvidenceDirectory> evidenceDirectories, List<CaseEvidence> caseEvidences, ModelAtomicResult atomicResult) {
Operand left = operandUnit.getLeftOperand(); Operand left = operandUnit.getLeftOperand();
String operator = operandUnit.getOperator(); String operator = operandUnit.getOperator();
Operand right = operandUnit.getRightOperand(); Operand right = operandUnit.getRightOperand();
boolean flag = false; boolean flag = false;
ModelAtomicIndex modelAtomicIndex = atomicIndices.stream().filter(atomicIndex -> atomicIndex.getId().equals(modelAtomicIndexId)).findAny().orElse(null);
if (modelAtomicIndex == null) {
log.error("原子指标不存在。原子指标ID:{}", modelAtomicIndexId);
return flag;
}
List<CaseEvidence> evidences = getEvidencesByPromptId(modelAtomicIndex.getPromptId(), caseEvidences, evidenceDirectories, notePrompts); List<CaseEvidence> evidences = getEvidencesByPromptId(modelAtomicIndex.getPromptId(), caseEvidences, evidenceDirectories, notePrompts);
ModelAtomicIndex rightModelAtomicIndex = null; ModelAtomicIndex rightModelAtomicIndex = null;
if (OPERAND_TYPE_STRUCTURE.equals(right.getOperandType())) { if (OPERAND_TYPE_STRUCTURE.equals(right.getOperandType())) {

@ -1,5 +1,7 @@
package com.supervision.utils; package com.supervision.utils;
import com.supervision.common.constant.IndexRuleConstants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.expression.ExpressionParser; import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser; import org.springframework.expression.spel.standard.SpelExpressionParser;
import org.springframework.expression.spel.support.StandardEvaluationContext; import org.springframework.expression.spel.support.StandardEvaluationContext;
@ -9,6 +11,7 @@ import java.util.Set;
import static com.supervision.common.constant.IndexRuleConstants.LOGIC_AND; import static com.supervision.common.constant.IndexRuleConstants.LOGIC_AND;
import static com.supervision.common.constant.IndexRuleConstants.LOGIC_OR; import static com.supervision.common.constant.IndexRuleConstants.LOGIC_OR;
@Slf4j
public class CalculationUtil { public class CalculationUtil {
/** /**
@ -20,17 +23,43 @@ public class CalculationUtil {
* @return * @return
*/ */
public static boolean evaluateExpression(String leftOperand, String operator, String rightOperand) { public static boolean evaluateExpression(String leftOperand, String operator, String rightOperand) {
// 构建表达式 String expression = switch (operator) {
String expression = leftOperand + " " + operator + " " + rightOperand; case IndexRuleConstants.OPERATOR_GT -> // ">"
"#leftOperand > #rightOperand";
case IndexRuleConstants.OPERATOR_GE -> // ">="
"#leftOperand >= #rightOperand";
case IndexRuleConstants.OPERATOR_LT -> // "<"
"#leftOperand < #rightOperand";
case IndexRuleConstants.OPERATOR_LE -> // "<="
"#leftOperand <= #rightOperand";
case IndexRuleConstants.OPERATOR_EQ -> // "="
"#leftOperand == #rightOperand";
case IndexRuleConstants.OPERATOR_NE -> // "!="
"#leftOperand != #rightOperand";
case IndexRuleConstants.OPERATOR_EARLY -> // "早于"
"#leftOperand < #rightOperand";
case IndexRuleConstants.OPERATOR_LATE -> // "晚于"
"#leftOperand > #rightOperand";
case IndexRuleConstants.OPERATOR_CONTAIN -> // "包含"
"#leftOperand.contains(#rightOperand)";
default -> throw new UnsupportedOperationException("不支持的操作符: " + operator);
};
// 判断操作符并构造相应的SpEL表达式
log.info("Expression: [{}]", expression);
// 初始化SpEL解析器 // 初始化SpEL解析器
ExpressionParser parser = new SpelExpressionParser(); ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext(); StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable("leftOperand", leftOperand);
context.setVariable("rightOperand", rightOperand);
// 计算结果 // 计算结果
return Boolean.TRUE.equals(parser.parseExpression(expression).getValue(context, Boolean.class)); return Boolean.TRUE.equals(parser.parseExpression(expression).getValue(context, Boolean.class));
} }
/** /**
* *
* *
@ -45,7 +74,7 @@ public class CalculationUtil {
} }
// 判断是"且"还是"或" // 判断是"且"还是"或"
String operator = ""; String operator;
if (LOGIC_AND.equals(logic)) { if (LOGIC_AND.equals(logic)) {
operator = " and "; operator = " and ";
} else if (LOGIC_OR.equals(logic)) { } else if (LOGIC_OR.equals(logic)) {

@ -35,7 +35,7 @@ public class CaseTest {
public void test() { public void test() {
long start = System.currentTimeMillis(); long start = System.currentTimeMillis();
AnalyseCaseDTO analyseCaseDTO = new AnalyseCaseDTO(); AnalyseCaseDTO analyseCaseDTO = new AnalyseCaseDTO();
analyseCaseDTO.setCaseId("1831221360763416578"); analyseCaseDTO.setCaseId("1852254296647204865");
modelService.analyseCaseNew(analyseCaseDTO); modelService.analyseCaseNew(analyseCaseDTO);
long end = System.currentTimeMillis(); long end = System.currentTimeMillis();
log.info("耗时:{}ms", end - start); log.info("耗时:{}ms", end - start);

Loading…
Cancel
Save