diff --git a/src/main/java/com/supervision/police/controller/ModelController.java b/src/main/java/com/supervision/police/controller/ModelController.java index 8204a01..bd54706 100644 --- a/src/main/java/com/supervision/police/controller/ModelController.java +++ b/src/main/java/com/supervision/police/controller/ModelController.java @@ -10,45 +10,54 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/model") @RequiredArgsConstructor public class ModelController { + private static final String METHOD_NEW = "new"; private final ModelService modelService; + @Value("${fu-hsi-config.case-analysis-method}") + private String caseAnalysisMethod; + @PostMapping("/analyseCase") @Operation(summary = "分析指标") public R analyseCase(@RequestBody AnalyseCaseDTO analyseCaseDTO) { - return modelService.analyseCase(analyseCaseDTO); + if (METHOD_NEW.equals(caseAnalysisMethod)) { + return modelService.analyseCaseNew(analyseCaseDTO); + } else { + return modelService.analyseCase(analyseCaseDTO); + } } @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) { CaseScoreDetailDTO detail = modelService.caseScoreDetail(caseId); return R.ok(detail); } @GetMapping("/caseScoreByCaseId") @Operation(summary = "获取案件得分详情") - public R caseScoreByCaseId(@RequestParam @Parameter(name = "caseId",description = "案件id") String caseId) { + public R caseScoreByCaseId(@RequestParam @Parameter(name = "caseId", description = "案件id") String caseId) { return R.ok(modelService.caseScoreByCaseId(caseId)); } @GetMapping("/exportCaseScoreDetail") @Operation(summary = "导出案件得分详情功能") - public void exportCaseScoreDetail( @RequestParam @Parameter(name = "caseId",description = "案件id") String caseId, - HttpServletResponse response) { + public void exportCaseScoreDetail(@RequestParam @Parameter(name = "caseId", description = "案件id") String caseId, + HttpServletResponse response) { - modelService.exportCaseScoreDetail(caseId,response); + modelService.exportCaseScoreDetail(caseId, response); } @GetMapping("/getCaseDateStatus") @Operation(summary = "获取案件数据状态") - public R getCaseDateStatus(@RequestParam @Parameter(name = "caseId",description = "案件id") String caseId) { + public R getCaseDateStatus(@RequestParam @Parameter(name = "caseId", description = "案件id") String caseId) { CaseStatus caseStatus = modelService.getCaseDateStatus(caseId); return R.ok(caseStatus); diff --git a/src/main/java/com/supervision/police/domain/ModelIndex.java b/src/main/java/com/supervision/police/domain/ModelIndex.java index 8ff532d..b269d35 100644 --- a/src/main/java/com/supervision/police/domain/ModelIndex.java +++ b/src/main/java/com/supervision/police/domain/ModelIndex.java @@ -1,15 +1,16 @@ package com.supervision.police.domain; -import java.time.LocalDateTime; -import java.util.Date; - import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; +import com.supervision.police.dto.indexRule.IndexRule; +import com.supervision.police.handler.IndexRuleTypeHandler; import lombok.Data; + import java.io.Serializable; +import java.time.LocalDateTime; import java.util.List; /** @@ -19,39 +20,39 @@ import java.util.List; * @since 2024-07-05 09:20:10 */ @Data -@TableName("model_index") +@TableName(value = "model_index", autoResultMap = true) public class ModelIndex implements Serializable { @TableId private String id; - + /** * 指标名称 */ private String name; - + /** * 指标简称 */ private String shortName; - + /** * 指标说明 */ private String remark; - + /** * 指标类别 */ private String indexType; @TableField(exist = false) private String indexTypeName; - + /** * 指标分数 */ private Integer indexScore; - + /** * 原子指标数量 */ @@ -64,7 +65,7 @@ public class ModelIndex implements Serializable { private String caseType; @TableField(exist = false) private String caseTypeName; - + /** * 判断逻辑 */ @@ -73,18 +74,19 @@ public class ModelIndex implements Serializable { /** * 指标规则 */ - private String indexRule; + @TableField(typeHandler = IndexRuleTypeHandler.class) + private IndexRule indexRule; @TableField(exist = false) - @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime updateStartTime; @TableField(exist = false) - @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime updateEndTime; - + /** * 数据状态 */ @@ -100,7 +102,7 @@ public class ModelIndex implements Serializable { * 创建时间 */ @TableField(fill = FieldFill.INSERT) - @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime createTime; /** @@ -112,7 +114,7 @@ public class ModelIndex implements Serializable { * 更新时间 */ @TableField(fill = FieldFill.INSERT_UPDATE) - @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime updateTime; } diff --git a/src/main/java/com/supervision/police/dto/indexRule/IndexRule.java b/src/main/java/com/supervision/police/dto/indexRule/IndexRule.java index 7fc686e..73a7b2c 100644 --- a/src/main/java/com/supervision/police/dto/indexRule/IndexRule.java +++ b/src/main/java/com/supervision/police/dto/indexRule/IndexRule.java @@ -14,7 +14,7 @@ public class IndexRule { * 条件组之间逻辑关系 默认或 */ - private String logic = "2"; + private String groupLogic = "2"; /** * 规则条件组 diff --git a/src/main/java/com/supervision/police/dto/indexRule/Operand.java b/src/main/java/com/supervision/police/dto/indexRule/Operand.java index 5a29bc3..55f8805 100644 --- a/src/main/java/com/supervision/police/dto/indexRule/Operand.java +++ b/src/main/java/com/supervision/police/dto/indexRule/Operand.java @@ -43,4 +43,11 @@ public class Operand{ * 0:合计 1:数量 2:任一 */ private String aggregateType; + + /** + * 原子指标逻辑 + * 3 存在 + * 4 不存在 + */ + private String relationalSymbol; } diff --git a/src/main/java/com/supervision/police/dto/indexRule/RuleConditionGroup.java b/src/main/java/com/supervision/police/dto/indexRule/RuleConditionGroup.java index fe6807b..3e91c27 100644 --- a/src/main/java/com/supervision/police/dto/indexRule/RuleConditionGroup.java +++ b/src/main/java/com/supervision/police/dto/indexRule/RuleConditionGroup.java @@ -10,7 +10,7 @@ public class RuleConditionGroup { /** * 条件组内逻辑关系 默认或 */ - private String logic = "2"; + private String rowLogic = "2"; /** * 规则条件 diff --git a/src/main/java/com/supervision/police/handler/IndexRuleTypeHandler.java b/src/main/java/com/supervision/police/handler/IndexRuleTypeHandler.java new file mode 100644 index 0000000..25e722a --- /dev/null +++ b/src/main/java/com/supervision/police/handler/IndexRuleTypeHandler.java @@ -0,0 +1,29 @@ +package com.supervision.police.handler; + +import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.supervision.police.dto.indexRule.IndexRule; + +public class IndexRuleTypeHandler extends AbstractJsonTypeHandler { + private static final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + protected IndexRule parse(String json) { + try { + return objectMapper.readValue(json, new TypeReference() { + }); + } catch (Exception e) { + throw new RuntimeException("Failed to parse JSON to List", e); + } + } + + @Override + protected String toJson(IndexRule obj) { + try { + return objectMapper.writeValueAsString(obj); + } catch (Exception e) { + throw new RuntimeException("Failed to convert List to JSON", e); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/supervision/police/mapper/ModelIndexMapper.java b/src/main/java/com/supervision/police/mapper/ModelIndexMapper.java index 71b9e03..863c261 100644 --- a/src/main/java/com/supervision/police/mapper/ModelIndexMapper.java +++ b/src/main/java/com/supervision/police/mapper/ModelIndexMapper.java @@ -2,9 +2,6 @@ package com.supervision.police.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.supervision.police.domain.ModelIndex; -import org.apache.ibatis.annotations.Param; - -import java.util.List; /** * 指标表(ModelIndex)表数据库访问层 @@ -13,8 +10,5 @@ import java.util.List; * @since 2024-07-05 09:20:10 */ public interface ModelIndexMapper extends BaseMapper { - - List selectByCaseType(@Param("caseType") String caseType); - } 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 7ef005a..1ca1a4d 100644 --- a/src/main/java/com/supervision/police/service/impl/ModelServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/ModelServiceImpl.java @@ -8,7 +8,7 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.deepoove.poi.XWPFTemplate; - import com.google.gson.Gson; +import com.supervision.common.constant.IndexRuleConstants; import com.supervision.common.domain.R; import com.supervision.common.utils.StringUtils; import com.supervision.constant.JudgeResultEnum; @@ -187,7 +187,7 @@ public class ModelServiceImpl implements ModelService { throw new RuntimeException("未找到的行为人" + analyseCaseDTO.getLawActorName()); } // 查出指标信息 - List modelIndices = modelIndexMapper.selectByCaseType(modelCase.getCaseType()); + List modelIndices = modelIndexService.list(new LambdaQueryWrapper().eq(ModelIndex::getDataStatus, "1").eq(ModelIndex::getCaseType, modelCase.getCaseType())); // 查出原子指标信息 List atomicIndices = modelAtomicIndexMapper.selectByCaseType(modelCase.getCaseType()); // 查出提示词信息 @@ -198,67 +198,86 @@ public class ModelServiceImpl implements ModelService { List caseEvidences = caseEvidenceService.list(new LambdaQueryWrapper().eq(CaseEvidence::getCaseId, caseId)); // 遍历指标集合,处理每个指标的判断逻辑,得出结果 modelIndices.forEach(modelIndex -> { - String indexRuleStr = modelIndex.getIndexRule(); - Gson gson = new Gson(); - IndexRule indexRule = gson.fromJson(indexRuleStr, IndexRule.class); + IndexRule indexRule = modelIndex.getIndexRule(); Set ruleConditionGroupResultList = new HashSet<>(); - indexRule.getRuleConditionGroupList().forEach(ruleConditionGroup -> { - Set ruleConditionResultSet = new HashSet<>(); - ruleConditionGroup.getRuleConditionList().forEach(ruleCondition -> { - Set operandUnitResultSet = new HashSet<>(); - ruleCondition.getOperandUnitList().forEach(operandUnit -> { - Operand left = operandUnit.getLeftOperand(); - 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()); - result.setCasePersonId(casePerson.getId()); - result.setCaseId(analyseCaseDTO.getCaseId()); - result.setAtomicId(modelAtomicIndex.getId()); - result.setAtomicResult(JudgeResultEnum.NOT_EXIST.getCode()); - ModelAtomicResult exist = modelAtomicResultMapper.selectByCaseIdAndAtomicId(caseId, casePerson.getId(), modelIndex.getId(), modelAtomicIndex.getId()); - if (exist != null) { - result.setId(exist.getId()); - } - switch (left.getOperandType()) { - case OPERAND_TYPE_MANUAL: - operandUnitResultSet.add(manualIndexAnalysis(left, caseId)); - break; - case OPERAND_TYPE_DB: - operandUnitResultSet.add(dbIndexAnalysis(caseId, modelAtomicIndex.getQueryLang(), result)); - break; - case OPERAND_TYPE_GRAPH: - operandUnitResultSet.add(graphIndexAnalysis(modelIndex, casePerson, modelAtomicIndex, analyseCaseDTO, result)); - break; - case OPERAND_TYPE_STRUCTURE: - operandUnitResultSet.add(structureIndexAnalysis(left, right, operandUnit.getOperator(), modelAtomicIndex, atomicIndices, notePrompts, evidenceDirectories, caseEvidences, result)); - break; - default: - break; - } + if (indexRule != null) { + indexRule.getRuleConditionGroupList().forEach(ruleConditionGroup -> { + Set ruleConditionResultSet = new HashSet<>(); + ruleConditionGroup.getRuleConditionList().forEach(ruleCondition -> { + Set operandUnitResultSet = new HashSet<>(); + 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()); + result.setCasePersonId(casePerson.getId()); + result.setCaseId(analyseCaseDTO.getCaseId()); + result.setAtomicId(modelAtomicIndex.getId()); + result.setAtomicResult(JudgeResultEnum.NOT_EXIST.getCode()); + ModelAtomicResult exist = modelAtomicResultMapper.selectByCaseIdAndAtomicId(caseId, casePerson.getId(), modelIndex.getId(), modelAtomicIndex.getId()); + if (exist != null) { + result.setId(exist.getId()); + } + switch (left.getOperandType()) { + case OPERAND_TYPE_MANUAL: + operandUnitResultSet.add(relationSymbol == manualIndexAnalysis(left.getAtomicIndexId(), caseId)); + break; + case OPERAND_TYPE_DB: + operandUnitResultSet.add(relationSymbol == dbIndexAnalysis(caseId, modelAtomicIndex.getQueryLang(), result)); + break; + case OPERAND_TYPE_GRAPH: + 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)); + break; + default: + 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.getLogic())); - }); - boolean result = CalculationUtil.calculateBooleanSet(ruleConditionGroupResultList, indexRule.getLogic()); + } else { + log.error("指标规则不存在,跳出当前循环。指标ID:{}", modelIndex.getId()); + return; + } + // 计算指标结果并保存 + boolean result = CalculationUtil.calculateBooleanSet(ruleConditionGroupResultList, indexRule.getGroupLogic()); + ModelIndexResult modelIndexResult = new ModelIndexResult(); + modelIndexResult.setCaseId(caseId); + modelIndexResult.setIndexId(modelIndex.getId()); + ModelIndexResult exist = modelIndexResultMapper.selectByCaseIdAndIndexId(analyseCaseDTO.getCaseId(), modelIndex.getId()); + if (exist != null) { + modelIndexResult.setId(exist.getId()); + } + modelIndexResult.setIndexResult(result ? "true" : "false"); + if (exist == null) { + modelIndexResultMapper.insert(modelIndexResult); + } else { + modelIndexResultMapper.updateById(modelIndexResult); + } if (result) { Integer score = typeScoreMap.getOrDefault(modelIndex.getIndexType(), 0); + log.info("指标ID:{},指标类型:{},得分:{}分", modelIndex.getId(), modelIndex.getIndexType(), modelIndex.getIndexScore()); typeScoreMap.put(modelIndex.getIndexType(), score + modelIndex.getIndexScore()); + log.info("当前类型总分:{}分", typeScoreMap.get(modelIndex.getIndexType())); } }); - log.info("计算分数(共性+入罪/共性+出罪 取最大值)"); Integer gx = typeScoreMap.getOrDefault("1", 0); Integer rz = typeScoreMap.getOrDefault("2", 0); Integer cz = typeScoreMap.getOrDefault("3", 0); int max = Integer.max(gx + rz, gx + cz); modelCase.setTotalScore(max); - log.info("更新案件得分情况"); + log.info("更新案件得分情况。最终得分:{}分(共性+入罪/共性+出罪 取最大值)。入罪:{}分。出罪:{}分。共性:{}分。", max, rz, cz, gx); caseStatusManageService.whenAnalyseCaseSuccess(analyseCaseDTO.getCaseId(), modelCase.getTotalScore()); noteRecordService.uploadFileToLangChainChat(analyseCaseDTO.getCaseId()); return R.ok(); @@ -267,14 +286,14 @@ public class ModelServiceImpl implements ModelService { /** * 人工定义指标分析 * - * @param left 左操作数 - * @param caseId 案件ID + * @param atomicIndexId 原子指标ID + * @param caseId 案件ID */ - private boolean manualIndexAnalysis(Operand left, String caseId) { + private boolean manualIndexAnalysis(String atomicIndexId, String caseId) { boolean flag = false; List modelAtomicResults = modelAtomicResultMapper.selectList( new LambdaQueryWrapper().eq(ModelAtomicResult::getCaseId, caseId) - .eq(ModelAtomicResult::getAtomicId, left.getAtomicIndexId())); + .eq(ModelAtomicResult::getAtomicId, atomicIndexId)); if (modelAtomicResults != null && !modelAtomicResults.isEmpty()) { ModelAtomicResult modelAtomicResult = CollUtil.getFirst(modelAtomicResults); flag = EVALUATE_RESULT_EXIST.equals(modelAtomicResult.getAtomicResult()); @@ -308,19 +327,18 @@ public class ModelServiceImpl implements ModelService { /** * 图谱查询指标分析 * - * @param modelIndex 大指标 - * @param casePerson 行为人 + * @param casePersonName 行为人 * @param modelAtomicIndex 原子指标 * @param analyseCaseDTO 案件信息 * @return 是否存在 */ - private boolean graphIndexAnalysis(ModelIndex modelIndex, CasePerson casePerson, ModelAtomicIndex modelAtomicIndex, AnalyseCaseDTO analyseCaseDTO, ModelAtomicResult atomicResult) { + private boolean graphIndexAnalysis(String casePersonName, ModelAtomicIndex modelAtomicIndex, AnalyseCaseDTO analyseCaseDTO, ModelAtomicResult atomicResult) { boolean flag = false; Session session = driver.session(); //图谱 Map params = new HashMap<>(); // 行为人 - params.put("lawActor", casePerson.getName()); + params.put("lawActor", casePersonName); // 案号 params.put("caseId", analyseCaseDTO.getCaseId()); Result run = null; @@ -599,10 +617,8 @@ public class ModelServiceImpl implements ModelService { * 最终计算得分 */ private void calculateFinalScore(AnalyseCaseDTO analyseCaseDTO, ModelCase modelCase, Map> atomicResultMap) { - // 计算指标结果 - int score = 0; // 根据案件类型获取所有的指标 - List modelIndices = modelIndexMapper.selectByCaseType(modelCase.getCaseType()); + List modelIndices = modelIndexService.list(new LambdaQueryWrapper().eq(ModelIndex::getDataStatus, "1").eq(ModelIndex::getCaseType, modelCase.getCaseType())); Map typeScoreMap = new HashMap<>(); for (ModelIndex modelIndex : modelIndices) { ModelIndexResult result = new ModelIndexResult(); diff --git a/src/main/java/com/supervision/utils/CalculationUtil.java b/src/main/java/com/supervision/utils/CalculationUtil.java index 2028e66..4dc00d6 100644 --- a/src/main/java/com/supervision/utils/CalculationUtil.java +++ b/src/main/java/com/supervision/utils/CalculationUtil.java @@ -41,17 +41,17 @@ public class CalculationUtil { public static boolean calculateBooleanSet(Set booleanSet, String logic) { // 判断是否为空 if (booleanSet == null || booleanSet.isEmpty()) { - throw new IllegalArgumentException("Boolean set cannot be null or empty"); + return false; } // 判断是"且"还是"或" - String operator; + String operator = ""; if (LOGIC_AND.equals(logic)) { operator = " and "; } else if (LOGIC_OR.equals(logic)) { operator = " or "; } else { - throw new IllegalArgumentException("Invalid logic value, use 1 for AND, 2 for OR."); + throw new IllegalArgumentException("Invalid logic value: [" + operator + "], use 1 for AND, 2 for OR."); } // 构建表达式 diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 0353948..d47eec7 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -26,6 +26,7 @@ case: evidence: table: case_evidence fu-hsi-config: + case-analysis-method: new thread-pool: triple: core: 1 diff --git a/src/main/resources/mapper/ModelIndexMapper.xml b/src/main/resources/mapper/ModelIndexMapper.xml index a7aa550..8deab35 100644 --- a/src/main/resources/mapper/ModelIndexMapper.xml +++ b/src/main/resources/mapper/ModelIndexMapper.xml @@ -1,7 +1,4 @@ - \ No newline at end of file diff --git a/src/test/java/com/supervision/demo/CaseTest.java b/src/test/java/com/supervision/demo/CaseTest.java new file mode 100644 index 0000000..4f5d68f --- /dev/null +++ b/src/test/java/com/supervision/demo/CaseTest.java @@ -0,0 +1,80 @@ +package com.supervision.demo; + +import cn.hutool.json.JSONUtil; +import com.supervision.police.domain.ModelAtomicIndex; +import com.supervision.police.domain.ModelIndex; +import com.supervision.police.dto.AnalyseCaseDTO; +import com.supervision.police.dto.JudgeLogic; +import com.supervision.police.dto.indexRule.*; +import com.supervision.police.service.ModelAtomicIndexService; +import com.supervision.police.service.ModelIndexService; +import com.supervision.police.service.ModelService; +import lombok.extern.slf4j.Slf4j; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.ArrayList; +import java.util.List; + +@Slf4j +@SpringBootTest +public class CaseTest { + + @Autowired + private ModelService modelService; + @Autowired + private ModelIndexService modelIndexService; + @Autowired + private ModelAtomicIndexService modelAtomicIndexService; + + @Test + public void test() { + long start = System.currentTimeMillis(); + AnalyseCaseDTO analyseCaseDTO = new AnalyseCaseDTO(); + analyseCaseDTO.setCaseId("1831221360763416578"); + modelService.analyseCaseNew(analyseCaseDTO); + long end = System.currentTimeMillis(); + log.info("耗时:{}ms", end - start); + } + + @Test + public void judgeLogicTransform() { + List indices = modelIndexService.list(); + List modelAtomicIndices = modelAtomicIndexService.list(); + indices.forEach(index -> { + String judgeLogicStr = index.getJudgeLogic(); + List judgeLogics = JSONUtil.toList(judgeLogicStr, JudgeLogic.class); + IndexRule indexRule = new IndexRule(); + if (judgeLogics.size() == 2) { + indexRule.setGroupLogic(judgeLogics.get(1).getGroupLogic()); + } + List ruleConditionGroups = new ArrayList<>(); + judgeLogics.forEach(judgeLogic -> { + RuleConditionGroup ruleConditionGroup = new RuleConditionGroup(); + List ruleConditions = new ArrayList<>(); + if (!judgeLogic.getRowLogic().equals("&")) { + ruleConditionGroup.setRowLogic(judgeLogic.getRowLogic()); + } + judgeLogic.getAtomicData().forEach(atomicData -> { + RuleCondition ruleCondition = new RuleCondition(); + OperandUnit operandUnit = new OperandUnit(); + Operand left = new Operand(); + left.setAtomicIndexId(atomicData.getAtomicIndex()); + left.setRelationalSymbol(atomicData.getRelationalSymbol()); + modelAtomicIndices.stream().filter(modelAtomicIndex -> modelAtomicIndex.getId().equals(atomicData.getAtomicIndex())).findFirst().ifPresent(modelAtomicIndex -> { + left.setOperandType(modelAtomicIndex.getIndexSource()); + }); + operandUnit.setLeftOperand(left); + ruleCondition.setOperandUnitList(List.of(operandUnit)); + ruleConditions.add(ruleCondition); + }); + ruleConditionGroup.setRuleConditionList(ruleConditions); + ruleConditionGroups.add(ruleConditionGroup); + }); + indexRule.setRuleConditionGroupList(ruleConditionGroups); + index.setIndexRule(indexRule); + modelIndexService.updateById(index); + }); + } +}