From 2bcf612defe0e85725df3e9dc19dc20cb8a9f40e Mon Sep 17 00:00:00 2001 From: xueqingkun <xueqingkun@126.com> Date: Thu, 7 Mar 2024 14:24:36 +0800 Subject: [PATCH] =?UTF-8?q?web=20:=20=E4=BF=AE=E6=94=B9=E8=AF=8A=E6=96=AD?= =?UTF-8?q?=E8=AF=A6=E6=83=85=E5=8A=9F=E8=83=BD=EF=BC=9A=E5=88=9D=E6=AD=A5?= =?UTF-8?q?=E8=AF=8A=E6=96=AD=E7=BB=93=E6=9E=9C=EF=BC=8C=E6=AD=A3=E5=BC=8F?= =?UTF-8?q?=E8=AF=8A=E6=96=AD=E7=BB=93=E6=9E=9C=EF=BC=8C=E9=89=B4=E5=88=AB?= =?UTF-8?q?=E4=BE=9D=E6=8D=AE=E5=B1=95=E7=A4=BA=E7=97=85=E5=8E=86=E4=B8=AD?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E7=9A=84=E6=95=B0=E6=8D=AE=E5=B9=B6=E5=AF=B9?= =?UTF-8?q?=E5=AD=A6=E7=94=9F=E9=80=89=E4=B8=AD=E7=9A=84=E8=AF=8A=E6=96=AD?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=BF=9B=E8=A1=8C=E6=A0=87=E8=AF=86(?= =?UTF-8?q?=E5=8E=9F=E6=9C=AC=E5=B1=95=E7=A4=BA=E5=AD=A6=E7=94=9F=E9=80=89?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E8=AF=8A=E6=96=AD=E6=95=B0=E6=8D=AE=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E5=AF=B9=E6=AD=A3=E7=A1=AE=E7=9A=84=E8=AF=8A=E6=96=AD?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=BF=9B=E8=A1=8C=E6=A0=87=E8=AF=86)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pojo/vo/BasisDiagnosisNodeResVO.java | 10 +- .../impl/AskDiagnosisResultServiceImpl.java | 250 ++++++++++++------ 2 files changed, 174 insertions(+), 86 deletions(-) diff --git a/virtual-patient-web/src/main/java/com/supervision/pojo/vo/BasisDiagnosisNodeResVO.java b/virtual-patient-web/src/main/java/com/supervision/pojo/vo/BasisDiagnosisNodeResVO.java index b323b263..84195acf 100644 --- a/virtual-patient-web/src/main/java/com/supervision/pojo/vo/BasisDiagnosisNodeResVO.java +++ b/virtual-patient-web/src/main/java/com/supervision/pojo/vo/BasisDiagnosisNodeResVO.java @@ -18,5 +18,13 @@ public class BasisDiagnosisNodeResVO { @ApiModelProperty("是否正确,0:不正确 1:正确") private Integer correct; - + public BasisDiagnosisNodeResVO() { + } + + public BasisDiagnosisNodeResVO(Integer type, String recordName, String recordId, Integer correct) { + this.type = type; + this.recordName = recordName; + this.recordId = recordId; + this.correct = correct; + } } diff --git a/virtual-patient-web/src/main/java/com/supervision/service/impl/AskDiagnosisResultServiceImpl.java b/virtual-patient-web/src/main/java/com/supervision/service/impl/AskDiagnosisResultServiceImpl.java index 40df6d1f..deab1dfd 100644 --- a/virtual-patient-web/src/main/java/com/supervision/service/impl/AskDiagnosisResultServiceImpl.java +++ b/virtual-patient-web/src/main/java/com/supervision/service/impl/AskDiagnosisResultServiceImpl.java @@ -13,6 +13,8 @@ import com.supervision.model.*; import com.supervision.pojo.vo.*; import com.supervision.service.*; import com.supervision.vo.ask.TreatmentPlanRecordVo; +import com.supervision.vo.manage.DiseaseAncillaryResVo; +import com.supervision.vo.manage.DiseasePhysicalResVo; import com.supervision.vo.manage.DiseaseTreatmentPlanResVo; import com.supervision.vo.result.AncillaryRecordByResultDTO; import com.supervision.vo.result.PhysicalRecordByResultDTO; @@ -23,6 +25,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.BiFunction; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -129,31 +132,15 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService basisIdentificationResultResVO.setIdentificationDiagnosis(medicalRec.getDifferentialDiagnosisCriteria()); // 2.2 获取体格检查 List<PhysicalRecordByResultDTO> physicalRecordList = diagnosisPhysicalRecordService.queryPhysicalResultByProcessId(processId); - List<BasisDiagnosisNodeResVO> nodeList = physicalRecordList.stream() - .filter(distinctPredicateNotNull(PhysicalRecordByResultDTO::getToolLocationName)).map(e -> { - BasisDiagnosisNodeResVO nodeResVO = new BasisDiagnosisNodeResVO(); - nodeResVO.setType(1); - nodeResVO.setRecordName(e.getToolLocationName()); - nodeResVO.setRecordId(e.getRecordId()); - nodeResVO.setCorrect( - (ObjectUtil.isNotNull(e.getBasisConfirm()) && 1 == e.getBasisIdentification() && Objects.equals(e.getBasisIdentification(), e.getRecordBasisIdentificationFlag())) - ? 1 : 0); - return nodeResVO; - }).collect(Collectors.toList()); + List<DiseasePhysicalResVo> diseasePhysicalResVos = diseasePhysicalService.queryListByDiseaseId(medicalRec.getDiseaseId()); + + List<BasisDiagnosisNodeResVO> nodeList = physicalRecordMergeListsIdentification(physicalRecordList, diseasePhysicalResVos); + // 2.3 获取辅助检查 List<AncillaryRecordByResultDTO> ancillaryRecordList = diagnosisAncillaryRecordService.queryAncillaryResultByProcessId(processId); - List<BasisDiagnosisNodeResVO> collect = ancillaryRecordList.stream() - .filter(distinctPredicateNotNull(AncillaryRecordByResultDTO::getItemName)).map(e -> { - BasisDiagnosisNodeResVO nodeResVO = new BasisDiagnosisNodeResVO(); - nodeResVO.setCorrect( - (ObjectUtil.isNotNull(e.getBasisConfirm()) && 1 == e.getBasisIdentification() && Objects.equals(e.getBasisIdentification(), e.getRecordBasisIdentificationFlag())) - ? 1 : 0); - nodeResVO.setRecordId(e.getRecordId()); - nodeResVO.setRecordName(e.getItemName()); - nodeResVO.setType(2); - return nodeResVO; - }).collect(Collectors.toList()); - nodeList.addAll(collect); + List<DiseaseAncillaryResVo> diseaseAncillaryResVos = diseaseAncillaryService.queryListByDiseaseId(medicalRec.getDiseaseId()); + + nodeList.addAll(ancillaryRecordMergeListsIdentification(ancillaryRecordList, diseaseAncillaryResVos)); basisIdentificationResultResVO.setNodeList(nodeList); return basisIdentificationResultResVO; @@ -165,32 +152,14 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService basisConfirmResultResVO.setConfirmingDiagnosis(medicalRec.getConfirmDiagnosisCriteria()); // 2.2 获取体格检查的证实诊断依据 List<PhysicalRecordByResultDTO> physicalRecordList = diagnosisPhysicalRecordService.queryPhysicalResultByProcessId(processId); - List<BasisDiagnosisNodeResVO> nodeList = physicalRecordList.stream() - .filter(distinctPredicateNotNull(PhysicalRecordByResultDTO::getToolLocationName)).map(e -> { - BasisDiagnosisNodeResVO nodeResVO = new BasisDiagnosisNodeResVO(); - nodeResVO.setType(1); - nodeResVO.setRecordName(e.getToolLocationName()); - nodeResVO.setRecordId(e.getRecordId()); - nodeResVO.setCorrect( - (ObjectUtil.isNotNull(e.getBasisConfirm()) && 1 == e.getBasisConfirm() && Objects.equals(e.getBasisConfirm(), e.getRecordBasisConfirmFlag())) - ? 1 : 0); - return nodeResVO; - }).collect(Collectors.toList()); + List<DiseasePhysicalResVo> diseasePhysicalResVos = diseasePhysicalService.queryListByDiseaseId(medicalRec.getDiseaseId()); + + List<BasisDiagnosisNodeResVO> nodeList = physicalRecordMergeListsConfirm(physicalRecordList, diseasePhysicalResVos); // 2.3 获取辅助检查 List<AncillaryRecordByResultDTO> ancillaryRecordList = diagnosisAncillaryRecordService.queryAncillaryResultByProcessId(processId); - List<BasisDiagnosisNodeResVO> collect = ancillaryRecordList.stream() - .filter(distinctPredicateNotNull(AncillaryRecordByResultDTO::getItemName)).map(e -> { - BasisDiagnosisNodeResVO nodeResVO = new BasisDiagnosisNodeResVO(); - nodeResVO.setCorrect( - (ObjectUtil.isNotNull(e.getBasisConfirm()) && 1 == e.getBasisConfirm() && Objects.equals(e.getBasisConfirm(), e.getRecordBasisConfirmFlag())) - ? 1 : 0); - nodeResVO.setRecordId(e.getRecordId()); - nodeResVO.setRecordName(e.getItemName()); - nodeResVO.setType(2); - return nodeResVO; - }).collect(Collectors.toList()); - nodeList.addAll(collect); + List<DiseaseAncillaryResVo> diseaseAncillaryResVos = diseaseAncillaryService.queryListByDiseaseId(medicalRec.getDiseaseId()); + nodeList.addAll(ancillaryRecordMergeListsConfirm(ancillaryRecordList, diseaseAncillaryResVos)); basisConfirmResultResVO.setNodeList(nodeList); return basisConfirmResultResVO; @@ -202,56 +171,167 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService basisPrimaryResultResVO.setPreliminaryDiagnosis(medicalRec.getPrimarilyDiagnosisCriteria()); // 根据record记录寻找符合初步诊断依据的项目 // 2.1 首先获取对话 - List<BasisDiagnosisNodeResVO> basisDiagnosisNodeResVOS = new ArrayList<>(); List<DiagnosisQaRecord> qaRecordList = diagnosisQaRecordService.lambdaQuery().eq(DiagnosisQaRecord::getProcessId, process.getId()).list(); - if (CollectionUtil.isNotEmpty(qaRecordList)) { - List<AskPatientAnswer> list = askPatientAnswerService.lambdaQuery() - .eq(AskPatientAnswer::getMedicalId, medicalRec.getId()).list(); - // 获取配置了答案的项目(配置了答案的,认为是正确,没有配置答案的,走默认回答的,不标记为以正确) - Set<String> requireCheckIdSet = list.stream().map(AskPatientAnswer::getId).collect(Collectors.toSet()); - List<BasisDiagnosisNodeResVO> qaList = qaRecordList.stream().map(e -> { - BasisDiagnosisNodeResVO node = new BasisDiagnosisNodeResVO(); - node.setType(0); - node.setRecordName(e.getQuestion()); - node.setRecordId(e.getId()); - node.setCorrect(requireCheckIdSet.contains(e.getAnswerId()) ? 1 : 0); - return node; - - }).collect(Collectors.toList()); - basisDiagnosisNodeResVOS.addAll(qaList); - } + List<AskPatientAnswer> list = askPatientAnswerService.lambdaQuery() + .eq(AskPatientAnswer::getMedicalId, medicalRec.getId()).list(); + // 获取配置了答案的项目(配置了答案的,认为是正确,没有配置答案的,走默认回答的,不标记为以正确) + List<BasisDiagnosisNodeResVO> basisDiagnosisNodeResVOS = new ArrayList<>(qaRecordMergeListsBasisPrimary(qaRecordList, list)); + // 2.2 获取体格检查 List<PhysicalRecordByResultDTO> physicalRecordList = diagnosisPhysicalRecordService.queryPhysicalResultByProcessId(process.getId()); - List<BasisDiagnosisNodeResVO> physicalList = physicalRecordList.stream() - .filter(distinctPredicateNotNull(PhysicalRecordByResultDTO::getToolLocationName)).map(e -> { - BasisDiagnosisNodeResVO nodeResVO = new BasisDiagnosisNodeResVO(); - nodeResVO.setType(1); - nodeResVO.setRecordName(e.getToolLocationName()); - nodeResVO.setRecordId(e.getRecordId()); - // 如果是初步诊断依据 - nodeResVO.setCorrect(e.getPrimarilyDiagnosisCriteriaFlag()); - return nodeResVO; - }).collect(Collectors.toList()); - basisDiagnosisNodeResVOS.addAll(physicalList); + List<DiseasePhysicalResVo> diseasePhysicalResVos = diseasePhysicalService.queryListByDiseaseId(medicalRec.getDiseaseId()); + + basisDiagnosisNodeResVOS.addAll(physicalRecordMergeListsBasisPrimary(physicalRecordList, diseasePhysicalResVos)); + // 2.3 获取辅助检查 List<AncillaryRecordByResultDTO> ancillaryRecordList = diagnosisAncillaryRecordService.queryAncillaryResultByProcessId(process.getId()); - List<BasisDiagnosisNodeResVO> collect = ancillaryRecordList.stream() - .filter(distinctPredicateNotNull(AncillaryRecordByResultDTO::getItemName)).map(e -> { - BasisDiagnosisNodeResVO nodeResVO = new BasisDiagnosisNodeResVO(); - - nodeResVO.setCorrect(e.getPrimarilyDiagnosisCriteriaFlag()); - nodeResVO.setRecordId(e.getRecordId()); - nodeResVO.setRecordName(e.getItemName()); - nodeResVO.setType(2); - return nodeResVO; - }).collect(Collectors.toList()); - basisDiagnosisNodeResVOS.addAll(collect); + List<DiseaseAncillaryResVo> diseaseAncillaryResVos = diseaseAncillaryService.queryListByDiseaseId(medicalRec.getDiseaseId()); + + basisDiagnosisNodeResVOS.addAll(ancillaryRecordMergeListsBasisPrimary(ancillaryRecordList,diseaseAncillaryResVos)); basisPrimaryResultResVO.setNodeList(basisDiagnosisNodeResVOS); return basisPrimaryResultResVO; } + private List<BasisDiagnosisNodeResVO> qaRecordMergeListsBasisPrimary(List<DiagnosisQaRecord> qaRecordList, List<AskPatientAnswer> list){ + + BiFunction<DiagnosisQaRecord,AskPatientAnswer,Boolean> biFunction = (qaRecord, qa) -> qa.getLibraryQuestionId().equals(qaRecord.getQuestionLibraryId()); + + Set<String> requireCheckIdSet = list.stream().map(AskPatientAnswer::getId).collect(Collectors.toSet()); + + Function<DiagnosisQaRecord,BasisDiagnosisNodeResVO> t1 = r -> new BasisDiagnosisNodeResVO(0,r.getQuestion(),r.getId(), + requireCheckIdSet.contains(r.getAnswerId()) ? 1 : 0); + Function<AskPatientAnswer,BasisDiagnosisNodeResVO> t2 = item -> new BasisDiagnosisNodeResVO(0, item.getQuestion(), item.getId(), 0); + + return mergeListsBasedOnCondition(qaRecordList, list, biFunction, t1, t2); + } + + + private List<BasisDiagnosisNodeResVO> physicalRecordMergeLists(List<PhysicalRecordByResultDTO> physicalRecordList, + List<DiseasePhysicalResVo> diseasePhysicalResVos, + Function<PhysicalRecordByResultDTO,Integer> functionCorrect){ + physicalRecordList = physicalRecordList.stream() + .filter(distinctPredicateNotNull(PhysicalRecordByResultDTO::getToolLocationName)).collect(Collectors.toList()); + + BiFunction<PhysicalRecordByResultDTO,DiseasePhysicalResVo,Boolean> biFunction = (r, diseasePhysical) -> StrUtil.equals(diseasePhysical.getToolId(),r.getToolId()) + && StrUtil.equals(diseasePhysical.getLocationId(),(r.getLocationId())); + + Function<PhysicalRecordByResultDTO,BasisDiagnosisNodeResVO> t1 = r -> new BasisDiagnosisNodeResVO(1, r.getToolLocationName(), + r.getRecordId(), functionCorrect.apply(r)); + + // 这里的recordId只为了展示用diseasePhysical.getId()代替。只是为展示使用correct的值固定为不正确 + Function<DiseasePhysicalResVo,BasisDiagnosisNodeResVO> t2 = diseasePhysical -> new BasisDiagnosisNodeResVO(1, diseasePhysical.getToolName(), + diseasePhysical.getId(), 0); + + return mergeListsBasedOnCondition(physicalRecordList, diseasePhysicalResVos,biFunction, t1, t2); + } + + private List<BasisDiagnosisNodeResVO> ancillaryRecordMergeLists(List<AncillaryRecordByResultDTO> ancillaryRecordList, + List<DiseaseAncillaryResVo> diseaseAncillaryResVos, + Function<AncillaryRecordByResultDTO,Integer> functionCorrect){ + ancillaryRecordList = ancillaryRecordList.stream() + .filter(distinctPredicateNotNull(AncillaryRecordByResultDTO::getItemName)).collect(Collectors.toList()); + + BiFunction<AncillaryRecordByResultDTO,DiseaseAncillaryResVo,Boolean> biFunction =(r, diseaseAncillary) -> StrUtil.equals(diseaseAncillary.getItemId(),r.getItemId()); + + Function<AncillaryRecordByResultDTO,BasisDiagnosisNodeResVO> t1 = record -> new BasisDiagnosisNodeResVO(2, record.getItemName(), record.getRecordId(), + functionCorrect.apply(record)); + + // 这里的recordId只为了展示用diseaseAncillary.getId()代替。只是为展示使用correct的值固定为不正确 + Function<DiseaseAncillaryResVo,BasisDiagnosisNodeResVO> t2 = diseaseAncillary -> new BasisDiagnosisNodeResVO(2, diseaseAncillary.getItemName(), + diseaseAncillary.getId(), 0); + + return mergeListsBasedOnCondition(ancillaryRecordList, diseaseAncillaryResVos,biFunction, t1, t2); + } + private List<BasisDiagnosisNodeResVO> physicalRecordMergeListsBasisPrimary(List<PhysicalRecordByResultDTO> physicalRecordList, + List<DiseasePhysicalResVo> diseasePhysicalResVos){ + + return physicalRecordMergeLists(physicalRecordList, diseasePhysicalResVos, PhysicalRecordByResultDTO::getPrimarilyDiagnosisCriteriaFlag); + } + + private List<BasisDiagnosisNodeResVO> physicalRecordMergeListsConfirm(List<PhysicalRecordByResultDTO> physicalRecordList, + List<DiseasePhysicalResVo> diseasePhysicalResVos){ + + Function<PhysicalRecordByResultDTO,Integer> functionCorrect = record -> (ObjectUtil.isNotNull(record.getBasisConfirm()) && 1 == record.getBasisConfirm() + && Objects.equals(record.getBasisConfirm(), record.getRecordBasisConfirmFlag())) ? 1 : 0; + + return physicalRecordMergeLists(physicalRecordList, diseasePhysicalResVos, functionCorrect); + } + + private List<BasisDiagnosisNodeResVO> physicalRecordMergeListsIdentification(List<PhysicalRecordByResultDTO> physicalRecordList, + List<DiseasePhysicalResVo> diseasePhysicalResVos){ + + Function<PhysicalRecordByResultDTO,Integer> functionCorrect = record -> (ObjectUtil.isNotNull(record.getBasisConfirm()) && 1 == record.getBasisIdentification() + && Objects.equals(record.getBasisIdentification(), record.getRecordBasisIdentificationFlag())) ? 1 : 0; + + return physicalRecordMergeLists(physicalRecordList, diseasePhysicalResVos, functionCorrect); + } + + private List<BasisDiagnosisNodeResVO> ancillaryRecordMergeListsBasisPrimary(List<AncillaryRecordByResultDTO> ancillaryRecordList, + List<DiseaseAncillaryResVo> diseaseAncillaryResVos){ + + return ancillaryRecordMergeLists(ancillaryRecordList, diseaseAncillaryResVos, + AncillaryRecordByResultDTO::getPrimarilyDiagnosisCriteriaFlag); + } + + + private List<BasisDiagnosisNodeResVO> ancillaryRecordMergeListsConfirm(List<AncillaryRecordByResultDTO> ancillaryRecordList, + List<DiseaseAncillaryResVo> diseaseAncillaryResVos){ + + Function<AncillaryRecordByResultDTO,Integer> functionCorrect = record -> ObjectUtil.isNotNull(record.getBasisConfirm()) && 1 == record.getBasisConfirm() + && Objects.equals(record.getBasisConfirm(), record.getRecordBasisConfirmFlag()) ? 1 : 0 ; + + return ancillaryRecordMergeLists(ancillaryRecordList, diseaseAncillaryResVos,functionCorrect); + } + + private List<BasisDiagnosisNodeResVO> ancillaryRecordMergeListsIdentification(List<AncillaryRecordByResultDTO> ancillaryRecordList, + List<DiseaseAncillaryResVo> diseaseAncillaryResVos){ + Function<AncillaryRecordByResultDTO,Integer> functionCorrect = record -> (ObjectUtil.isNotNull(record.getBasisConfirm()) && 1 == record.getBasisIdentification() + && Objects.equals(record.getBasisIdentification(), record.getRecordBasisIdentificationFlag())) ? 1 : 0; + + return ancillaryRecordMergeLists(ancillaryRecordList, diseaseAncillaryResVos,functionCorrect); + } + + /** + * 根据指定条件合并两个列表。 + * + * @param simpleList 要处理的简单列表。 + * @param poolList 用于比较的池列表。 + * @param biFunction 定义合并元素条件。 + * @param t1 用于处理简单列表中元素的函数。 + * @param t2 用于处理池列表中元素的函数。 + * @return 包含根据条件合并的元素的列表。 + */ + private <T, M, R> List<R> mergeListsBasedOnCondition(List<T> simpleList, List<M> poolList, + BiFunction<T, M, Boolean> biFunction, + Function<T, R> t1, Function<M, R> t2) { + List<R> rs = new ArrayList<>(); + + // 检查两个列表是否都为空,在这种情况下返回空列表 + if (CollUtil.isEmpty(simpleList) && CollUtil.isEmpty(poolList)) { + return CollUtil.newArrayList(); + } + + // 如果简单列表为空但池列表不为空,则映射和收集池列表元素 + if (CollUtil.isEmpty(simpleList) && CollUtil.isNotEmpty(poolList)) { + return poolList.stream().map(t2).collect(Collectors.toList()); + } + + // 根据定义的条件合并列表 + for (M m : poolList) { + for (T t : simpleList) { + if (biFunction.apply(t, m)) { + rs.add(t1.apply(t)); + break; + } + } + rs.add(t2.apply(m)); + } + + return rs; + } + /** * 预期诊断结果 */