diff --git a/src/main/java/com/supervision/constant/JudgeResultEnum.java b/src/main/java/com/supervision/constant/JudgeResultEnum.java index fc3a52c..12707ec 100644 --- a/src/main/java/com/supervision/constant/JudgeResultEnum.java +++ b/src/main/java/com/supervision/constant/JudgeResultEnum.java @@ -5,24 +5,29 @@ import lombok.Getter; @Getter public enum JudgeResultEnum { - TRUE("1","真实"), + TRUE("1","真实","1"), - FALSE("2","虚构"), + FALSE("2","虚构","0"), - EXIST("3","存在"), + EXIST("3","存在","1"), - NOT_EXIST("4","不存在"), + NOT_EXIST("4","不存在","0"), - UNKNOWN("5","未知"); + UNKNOWN("5","未知","-1"); private String code; private String desc; + // 原子指标结果 -1:未知, 0:不存在, 1存在 + private String translateResult; - JudgeResultEnum(String code, String desc) { + JudgeResultEnum(String code, String desc,String translateResult) { this.code = code; this.desc = desc; + this.translateResult = translateResult; } + + /** * 根据code获取枚举 * @param code 标识 @@ -34,9 +39,19 @@ public enum JudgeResultEnum { return judgeResultEnum; } } - return null; + return JudgeResultEnum.UNKNOWN; } + public static JudgeResultEnum getInstanceByTranslateResult(String translateResult) { + for (JudgeResultEnum judgeResultEnum : JudgeResultEnum.values()) { + if (judgeResultEnum.getTranslateResult().equals(translateResult)) { + return judgeResultEnum; + } + } + return JudgeResultEnum.UNKNOWN; + } + + /** * 判断是否为真 * @return diff --git a/src/main/java/com/supervision/police/dto/AtomicIndexDTO.java b/src/main/java/com/supervision/police/dto/AtomicIndexDTO.java index 8ed16dc..61b6465 100644 --- a/src/main/java/com/supervision/police/dto/AtomicIndexDTO.java +++ b/src/main/java/com/supervision/police/dto/AtomicIndexDTO.java @@ -1,5 +1,6 @@ package com.supervision.police.dto; +import cn.hutool.core.util.StrUtil; import com.supervision.constant.JudgeResultEnum; import com.supervision.constant.ScoreEnum; import lombok.Data; @@ -9,6 +10,8 @@ import java.util.Objects; @Data public class AtomicIndexDTO { + private String atomicIndexId; + /** * 指标名称 */ @@ -44,4 +47,27 @@ public class AtomicIndexDTO { this.indexResult = instance.flagIsTrue() ? "true" : "false"; } + public void judgeWithIndexResult(String judgeLogic){ + JudgeResultEnum instance = JudgeResultEnum.getInstanceByTranslateResult(this.atomicResult); + if (Objects.isNull(instance)){ + this.indexResult = "false"; + return; + } + if (StrUtil.isBlank(judgeLogic)){ + this.indexResult = instance.flagIsTrue() ? "true" : "false"; + }else { + String translateResult = instance.getTranslateResult(); + // 1.指标判断符合,规则要求不符合,返回false + // 2.指标判断不符合,规则要求符合,返回false + // 3.指标判断符合,规则要求符合,返回true + // 4.指标判断不符合,规则要求不符合,返回true + if (judgeLogic.equals(translateResult)){ + this.indexResult = "true"; + }else { + this.indexResult = "false"; + } + } + + } + } diff --git a/src/main/java/com/supervision/police/dto/IndexDetail.java b/src/main/java/com/supervision/police/dto/IndexDetail.java index ca939c3..2c69009 100644 --- a/src/main/java/com/supervision/police/dto/IndexDetail.java +++ b/src/main/java/com/supervision/police/dto/IndexDetail.java @@ -37,4 +37,9 @@ public class IndexDetail { */ private List children; + /** + * 校验规则 + */ + private String judgeLogic; + } diff --git a/src/main/java/com/supervision/police/service/impl/ModelCaseServiceImpl.java b/src/main/java/com/supervision/police/service/impl/ModelCaseServiceImpl.java index eb89a71..a4cf0a1 100644 --- a/src/main/java/com/supervision/police/service/impl/ModelCaseServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/ModelCaseServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.bean.copier.CopyOptions; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -18,10 +19,7 @@ import com.supervision.common.utils.IPages; import com.supervision.common.utils.StringUtils; import com.supervision.police.domain.CasePerson; import com.supervision.police.domain.ComDictionary; -import com.supervision.police.dto.AtomicIndexDTO; -import com.supervision.police.dto.IndexDetail; -import com.supervision.police.dto.ModelCaseBase; -import com.supervision.police.dto.ModelCaseDTO; +import com.supervision.police.dto.*; import com.supervision.police.mapper.CasePersonMapper; import com.supervision.police.mapper.ModelCaseMapper; import com.supervision.police.domain.ModelCase; @@ -59,6 +57,7 @@ public class ModelCaseServiceImpl extends ServiceImpl queryList(ModelCase modelCase, Integer page, Integer size) { IPage modelCaseIPage = modelCaseMapper.selectAll(Page.of(page, size), modelCase); - if (CollUtil.isEmpty(modelCaseIPage.getRecords())){ + if (CollUtil.isEmpty(modelCaseIPage.getRecords())) { return Page.of(page, size); } @@ -88,7 +87,7 @@ public class ModelCaseServiceImpl extends ServiceImpl> casePersonMap = persionMap.get(modelCaseDTO.getId()); - if (CollUtil.isNotEmpty(casePersonMap)){ + if (CollUtil.isNotEmpty(casePersonMap)) { modelCaseDTO.setLawActor(CollUtil.getFirst(casePersonMap.get("1"))); modelCaseDTO.floatLawActorInfo(); - modelCaseDTO.setLawPartyList(casePersonMap.getOrDefault("2",new ArrayList<>())); + modelCaseDTO.setLawPartyList(casePersonMap.getOrDefault("2", new ArrayList<>())); } - if (Objects.isNull(modelCaseDTO.getLawPartyList())){ + if (Objects.isNull(modelCaseDTO.getLawPartyList())) { modelCaseDTO.setLawPartyList(new ArrayList<>()); } return modelCaseDTO; @@ -110,13 +109,15 @@ public class ModelCaseServiceImpl extends ServiceImpl checkCaseNo(String caseNo,String caseId) { + public R checkCaseNo(String caseNo, String caseId) { Long count = modelCaseMapper.selectCount(new LambdaQueryWrapper() .eq(ModelCase::getCaseNo, caseNo) .eq(ModelCase::getDataStatus, "1") @@ -162,7 +163,7 @@ public class ModelCaseServiceImpl extends ServiceImpl> getPerson(String caseId, String name) { LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); wrapper.eq(CasePerson::getCaseId, caseId) - .like(StrUtil.isNotEmpty(name),CasePerson::getName, name); + .like(StrUtil.isNotEmpty(name), CasePerson::getName, name); List casePeople = casePersonMapper.selectList(wrapper); List dicts = comDictionaryService.list(); for (CasePerson cp : casePeople) { @@ -172,7 +173,7 @@ public class ModelCaseServiceImpl extends ServiceImpl addPersion(CasePerson person) { Assert.notEmpty(person.getCaseId(), "案件id不能为空"); @@ -259,18 +260,43 @@ public class ModelCaseServiceImpl extends ServiceImpl records = iPage.getRecords(); for (IndexDetail record : records) { - if (StringUtils.isEmpty(record.getAtomicIds())){ + if (StringUtils.isEmpty(record.getAtomicIds())) { continue; } + String judgeLogic = record.getJudgeLogic(); + Map indexJundgeLogicMap = parseLogicMap(judgeLogic); String[] array = record.getAtomicIds().split(","); List atomicIds = Arrays.asList(array); List atomics = modelCaseMapper.getAtomicDetail(caseId, atomicIds); - atomics.forEach(AtomicIndexDTO::atomicResultToIndexResult); + for (AtomicIndexDTO atomic : atomics) { + // 需要和原子指标的规则判断是否一致(解决出罪和入罪冲突的问题) + String s = indexJundgeLogicMap.get(atomic.getAtomicIndexId()); + atomic.judgeWithIndexResult(s); + + } record.setChildren(atomics); } iPage.setRecords(records); return R.ok(IPages.buildDataMap(iPage)); } + private Map parseLogicMap(String judgeLogic) { + List judgeLogics = JSONUtil.toList(judgeLogic, JudgeLogic.class); + Map resultMap = new HashMap<>(); + for (JudgeLogic logic : judgeLogics) { + for (AtomicData atomicDatum : logic.getAtomicData()) { + // 原子指标结果 -1:未知, 0:不存在, 1存在 + if (atomicDatum.getRelationalSymbol().equals("1") || atomicDatum.getRelationalSymbol().equals("3")) { + resultMap.put(atomicDatum.getAtomicIndex(), "1"); + } else if (atomicDatum.getRelationalSymbol().equals("2") || atomicDatum.getRelationalSymbol().equals("4")) { + resultMap.put(atomicDatum.getAtomicIndex(), "0"); + } else { + resultMap.put(atomicDatum.getAtomicIndex(), "-1"); + } + } + } + return resultMap; + } + } 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 16b6a48..bbd8c19 100644 --- a/src/main/java/com/supervision/police/service/impl/ModelServiceImpl.java +++ b/src/main/java/com/supervision/police/service/impl/ModelServiceImpl.java @@ -13,6 +13,8 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.deepoove.poi.XWPFTemplate; import com.supervision.common.domain.R; import com.supervision.common.utils.StringUtils; +import com.supervision.constant.JudgeResultEnum; +import com.supervision.constant.ScoreEnum; import com.supervision.neo4j.dto.ResultDTO; import com.supervision.neo4j.utils.Neo4jUtils; import com.supervision.police.domain.*; @@ -88,7 +90,7 @@ public class ModelServiceImpl implements ModelService { } //原子指标 List atomicIndices = modelAtomicIndexMapper.selectByCaseType(modelCase.getCaseType()); - Map atomicResultMap = new HashMap<>(); + Map atomicResultMap = new HashMap<>(); for (ModelAtomicIndex atomicIndex : atomicIndices) { //原子指标结果 ModelAtomicResult result = new ModelAtomicResult(); @@ -128,8 +130,12 @@ public class ModelServiceImpl implements ModelService { result.setId(exist.getId()); modelAtomicResultMapper.updateById(result); } - // 所有原子指标id,判断结果是否为1 或者3,如果为1或者3,则符合,为true - atomicResultMap.put(result.getAtomicId(), "1".equals(result.getAtomicResult()) || "3".equals(result.getAtomicResult())); + // 所有原子指标id,判断结果 + Set checkAtomicResult = Set.of("-1", "0", "1"); + if (!checkAtomicResult.contains(result.getAtomicResult())) { + throw new RuntimeException("TEST:不被支持的校核结果,需排查BUG,atomicId:" + result.getAtomicId() + " result:" + result.getAtomicResult()); + } + atomicResultMap.put(result.getAtomicId(), result.getAtomicResult()); } // 最终计算得分 calculateFinalScore(analyseCaseDTO, modelCase, atomicResultMap); @@ -139,6 +145,7 @@ public class ModelServiceImpl implements ModelService { /** * 手动定义原子指标处理 + * * @param analyseCaseDTO * @param result * @param atomicIndex @@ -148,15 +155,18 @@ public class ModelServiceImpl implements ModelService { new LambdaQueryWrapper().eq(ModelAtomicResult::getCaseId, analyseCaseDTO.getCaseId()) .eq(ModelAtomicResult::getAtomicId, atomicIndex.getId())); - if (CollUtil.isEmpty(modelAtomicResults)){ + if (CollUtil.isEmpty(modelAtomicResults)) { log.info("manuallyDefinedCase:根据caseId:{},auomicId:{}未找到原子指标结果", analyseCaseDTO.getCaseId(), atomicIndex.getId()); return; } - if (CollUtil.size(modelAtomicResults) > 0){ + if (CollUtil.size(modelAtomicResults) > 0) { log.warn("manuallyDefinedCase:根据caseId:{},auomicId:{}找到多个原子指标结果", analyseCaseDTO.getCaseId(), atomicIndex.getId()); } ModelAtomicResult modelAtomicResult = CollUtil.getFirst(modelAtomicResults); - result.setAtomicResult(modelAtomicResult.getAtomicResult()); + // 对结果进行映射操作,前端填的是1-5,我们这里应该是-1,0,1 + JudgeResultEnum instance = JudgeResultEnum.getInstance(modelAtomicResult.getAtomicResult()); + + result.setAtomicResult(instance.getTranslateResult()); } @Override @@ -194,14 +204,14 @@ public class ModelServiceImpl implements ModelService { InputStream inputStream = null; try { response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document"); - response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(caseScoreDetailDTO.getCaseName()+".docx", StandardCharsets.UTF_8)); + response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(caseScoreDetailDTO.getCaseName() + ".docx", StandardCharsets.UTF_8)); inputStream = resource.getInputStream(); XWPFTemplate template = XWPFTemplate.compile(inputStream).render(caseScoreDetailDTO); template.writeAndClose(response.getOutputStream()); } catch (IOException e) { throw new RuntimeException(e); - }finally { - if (inputStream != null){ + } finally { + if (inputStream != null) { try { inputStream.close(); } catch (IOException e) { @@ -214,7 +224,7 @@ public class ModelServiceImpl implements ModelService { /** * 最终计算得分 */ - private void calculateFinalScore(AnalyseCaseDTO analyseCaseDTO, ModelCase modelCase, Map atomicResultMap) { + private void calculateFinalScore(AnalyseCaseDTO analyseCaseDTO, ModelCase modelCase, Map atomicResultMap) { // 计算指标结果 int score = 0; // 根据案件类型获取所有的指标 @@ -241,13 +251,11 @@ public class ModelServiceImpl implements ModelService { for (int j = 0; j < atomicData.size(); j++) { AtomicData data = atomicData.get(j); atomicIds.add(data.getAtomicIndex()); - // 这里可能不存在,如果不存在,就默认为false - Boolean ato = atomicResultMap.getOrDefault(data.getAtomicIndex(), false); + // 这里可能不存在,如果未找到,就默认为false + String atomicIndexResult = atomicResultMap.getOrDefault(data.getAtomicIndex(), "-1"); String relationalSymbol = data.getRelationalSymbol(); - // 判断,如果是2 虚构,4不存在 ,5 未知,则取反,即判断结果为false - if ("2".equals(relationalSymbol) || "4".equals(relationalSymbol) || "5".equals(relationalSymbol)) { - ato = !ato; - } + JudgeResultEnum instance = JudgeResultEnum.getInstance(relationalSymbol); + boolean ato = atomicIndexResult.equals(instance.getTranslateResult()); if (j == 0) { innerGroupJudge = ato; } else { @@ -258,6 +266,7 @@ public class ModelServiceImpl implements ModelService { } } } + // 组间进行判断 String groupLogic = logic.getGroupLogic(); if (i == 0) { finalJudgeResult = innerGroupJudge; @@ -318,7 +327,8 @@ public class ModelServiceImpl implements ModelService { try { run = session.run(ql, params); } catch (Exception e) { - log.info("图数据库查询出现错误,查询语句{},参数{}", ql, JSONUtil.toJsonStr(params)); + result.setAtomicResult("-1"); + log.error("图数据库查询出现错误,查询语句{},参数{}", ql, JSONUtil.toJsonStr(params),e); return; } @@ -326,7 +336,7 @@ public class ModelServiceImpl implements ModelService { if (res.isEmpty()) { result.setAtomicResult("-1"); } else { - // 设置为0,不符合 + // 设置为0,不存在 result.setAtomicResult("0"); // 进行遍历,如果有存在的,就设置为有 for (ResultDTO resultDTO : res) { @@ -346,6 +356,7 @@ public class ModelServiceImpl implements ModelService { /** * 分析数据库类型的原子信息 + * * @param analyseCaseDTO * @param result * @param sql @@ -359,7 +370,7 @@ public class ModelServiceImpl implements ModelService { params.put("party_a", analyseCaseDTO.getLawActorName()); params.put("party_b", analyseCaseDTO.getLawParty()); boolean success = false; - if (modelIndexService.checkSql(sql)){ + if (modelIndexService.checkSql(sql)) { success = parseResult(rowSqlMapper.selectList(sql, params, Map.class)); } result.setAtomicResult(success ? "1" : "0"); @@ -367,11 +378,11 @@ public class ModelServiceImpl implements ModelService { } - private boolean checkSql(String sql,List allowedTables) { + private boolean checkSql(String sql, List allowedTables) { if (StringUtils.isEmpty(sql)) { return false; } - if (CollUtil.isEmpty(allowedTables)){ + if (CollUtil.isEmpty(allowedTables)) { log.info("checkSql:未配置允许的表"); return false; } @@ -387,14 +398,14 @@ public class ModelServiceImpl implements ModelService { return false; } List tableList = SqlParserUtil.extractTableNames(sqlStatement); - if (CollUtil.isEmpty(tableList)){ + if (CollUtil.isEmpty(tableList)) { log.warn("checkSql:未检测到表"); return false; } long count = tableList.stream().filter(table -> !allowedTables.contains(table)).count(); - if (count > 0){ - log.warn("checkSql:表{}不在允许的表列表中",tableList); + if (count > 0) { + log.warn("checkSql:表{}不在允许的表列表中", tableList); return false; } return true; @@ -404,7 +415,8 @@ public class ModelServiceImpl implements ModelService { /** * 执行结果分析: * 1. 如果查询出的结果只有一行,判断列数是否大于1,如果大于1,返回真,如果=1,继续判断值是否大于0,如果大于0,返回真,如果=0,返回假 - *2. 如果查询出的结果大于一行,则返回真 + * 2. 如果查询出的结果大于一行,则返回真 + * * @param mapList 查询结果 * @return */ @@ -414,12 +426,12 @@ public class ModelServiceImpl implements ModelService { return false; } - if (CollUtil.size(mapList) > 1){ + if (CollUtil.size(mapList) > 1) { return true; } Map firstRow = CollUtil.getFirst(mapList); - if (firstRow.size() == 1 && CollUtil.size(firstRow.values())==1) { + if (firstRow.size() == 1 && CollUtil.size(firstRow.values()) == 1) { Object first = CollUtil.getFirst(firstRow.values()); if (NumberUtil.isNumber(first.toString())) { return NumberUtil.parseInt(first.toString()) > 0; diff --git a/src/main/resources/mapper/ModelCaseMapper.xml b/src/main/resources/mapper/ModelCaseMapper.xml index 75eb492..45ff622 100644 --- a/src/main/resources/mapper/ModelCaseMapper.xml +++ b/src/main/resources/mapper/ModelCaseMapper.xml @@ -47,7 +47,7 @@ and mi.index_type = #{indexType}