package com.supervision.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.supervision.model.*; import com.supervision.model.Process; import com.supervision.pojo.vo.*; import com.supervision.service.*; import com.supervision.vo.ask.TreatmentPlanRecordVo; import com.supervision.vo.manage.DiseaseTreatmentPlanResVo; import com.supervision.vo.result.AncillaryRecordByResultDAO; import com.supervision.vo.result.PhysicalRecordByResultDAO; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @Service @RequiredArgsConstructor public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService { private final DiagnosisPrimaryService diagnosisPrimaryService; private final AskPatientAnswerService askPatientAnswerService; private final MedicalRecService medicalRecService; private final DiagnosisQaRecordService diagnosisQaRecordService; private final DiagnosisPhysicalRecordService diagnosisPhysicalRecordService; private final DiagnosisAncillaryRecordService diagnosisAncillaryRecordService; private final ProcessService processService; private final PatientService patientService; private final DiseaseService diseaseService; private final TreatmentPlanRecordService treatmentPlanRecordService; private final DiseaseTreatmentPlanService diseaseTreatmentPlanService; private final DiseaseTreatmentPlanDrugService diseaseTreatmentPlanDrugService; @Override public DiagnosisResultResVO queryDiagnosisResult(String processId) { DiagnosisResultResVO diagnosisResultResVO = new DiagnosisResultResVO(); diagnosisResultResVO.setId(processId); Process process = processService.getById(processId); Patient patient = patientService.getById(process.getPatientId()); MedicalRec medicalRec = medicalRecService.getById(process.getMedicalRecId()); List diseasesList = diseaseService.listDiseaseWithType(medicalRec.getDiseaseId()); // 1.生成预期诊断结果 diagnosisResultResVO.setExpertDiagnosisResult(creatExpertDiagnosisResult(medicalRec, diseasesList, processId)); // 2.生成初步诊断依据 diagnosisResultResVO.setBasisPrimaryResultResVO(createBasisPrimaryResult(patient, medicalRec, process)); // 3.生成证实诊断依据 diagnosisResultResVO.setBasisConfirmResultResVO(createBasisConfirmResult(medicalRec, processId)); // 4.生成鉴别诊断依据 diagnosisResultResVO.setBasisIdentificationResult(createBasisIdentificationResult(medicalRec, processId)); // 5.全面检查-(暂无相关数据) 后面再看 diagnosisResultResVO.setFullCheck(null); // 6.处置方案 diagnosisResultResVO.setDealPlan(createDealPlan(process.getDiseaseId(), processId)); return diagnosisResultResVO; } private DealPlanResVO createDealPlan(String diseaseId, String processId) { DealPlanResVO dealPlanResVO = new DealPlanResVO(); // 1. 查询处置计划记录 List treatmentPlanRecordList = treatmentPlanRecordService.queryByProcessId(processId); if (CollectionUtil.isEmpty(treatmentPlanRecordList)) { return dealPlanResVO; } // 2. 查询出疾病处置计划 List diseaseTreatmentPlanResVos = diseaseTreatmentPlanService.queryListByDiseaseId(diseaseId); List planIds = diseaseTreatmentPlanResVos.stream().map(DiseaseTreatmentPlanResVo::getPlanId).distinct().collect(Collectors.toList()); // 3. 查出疾病处置计划用药 List diseaseTreatmentPlanDrugList = diseaseTreatmentPlanDrugService.lambdaQuery().eq(DiseaseTreatmentPlanDrug::getDiseaseId, diseaseId).list(); List drugIds = diseaseTreatmentPlanDrugList.stream().map(DiseaseTreatmentPlanDrug::getDrugId).distinct().collect(Collectors.toList()); // 4. 组装数据 ArrayList drugTreatmentPlanResults = new ArrayList<>(); ArrayList otherTreatmentPlanResults = new ArrayList<>(); for (TreatmentPlanRecord treatmentPlanRecord : treatmentPlanRecordList) { TreatmentPlanRecordVo bean = BeanUtil.toBean(treatmentPlanRecord, TreatmentPlanRecordVo.class); boolean flag = StrUtil.isNotEmpty(bean.getDrugId()) ? drugIds.contains(bean.getDrugId()) : planIds.contains(bean.getTreatmentPlanId()); bean.setFlag(flag ? 1 : 0); if (StrUtil.isNotEmpty(bean.getDrugId())) { drugTreatmentPlanResults.add(bean); } else { otherTreatmentPlanResults.add(bean); } } dealPlanResVO.setUserTreatmentPlanType(CollectionUtil.getFirst(treatmentPlanRecordList).getDisposalMethod()); dealPlanResVO.setDrugTreatmentPlan(drugTreatmentPlanResults); dealPlanResVO.setOtherTreatmentPlan(otherTreatmentPlanResults.stream().sorted( Comparator.comparing(TreatmentPlanRecord::getDisposalPlan)).collect(Collectors.toList())); return dealPlanResVO; } private BasisIdentificationResultResVO createBasisIdentificationResult(MedicalRec medicalRec, String processId) { BasisIdentificationResultResVO basisIdentificationResultResVO = new BasisIdentificationResultResVO(); // 鉴别诊断依据,来自于medicalRec的DifferentialDiagnosisCriteria basisIdentificationResultResVO.setIdentificationDiagnosis(medicalRec.getDifferentialDiagnosisCriteria()); // 2.2 获取体格检查 List physicalRecordList = diagnosisPhysicalRecordService.queryPhysicalResultByProcessId(processId); List nodeList = physicalRecordList.stream() .filter(distinctPredicateNotNull(PhysicalRecordByResultDAO::getToolLocationName)).map(e -> { BasisDiagnosisNodeResVO nodeResVO = new BasisDiagnosisNodeResVO(); nodeResVO.setType(1); nodeResVO.setRecordName(e.getToolLocationName()); nodeResVO.setRecordId(e.getRecordId()); // 如果是必做的,则是正确 nodeResVO.setCorrect(Objects.equals(e.getBasisIdentification(), e.getRecordBasisIdentificationFlag()) ? 1 : 0); return nodeResVO; }).collect(Collectors.toList()); // 2.3 获取辅助检查 List ancillaryRecordList = diagnosisAncillaryRecordService.queryAncillaryResultByProcessId(processId); List collect = ancillaryRecordList.stream() .filter(distinctPredicateNotNull(AncillaryRecordByResultDAO::getItemName)).map(e -> { BasisDiagnosisNodeResVO nodeResVO = new BasisDiagnosisNodeResVO(); nodeResVO.setCorrect(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); basisIdentificationResultResVO.setNodeList(nodeList); return basisIdentificationResultResVO; } private BasisConfirmResultResVO createBasisConfirmResult(MedicalRec medicalRec, String processId) { BasisConfirmResultResVO basisConfirmResultResVO = new BasisConfirmResultResVO(); // 证实诊断依据,来自于medicalRec的ConfirmDiagnosisCriteria basisConfirmResultResVO.setConfirmingDiagnosis(medicalRec.getConfirmDiagnosisCriteria()); // 2.2 获取体格检查的证实诊断依据 List physicalRecordList = diagnosisPhysicalRecordService.queryPhysicalResultByProcessId(processId); List nodeList = physicalRecordList.stream() .filter(distinctPredicateNotNull(PhysicalRecordByResultDAO::getToolLocationName)).map(e -> { BasisDiagnosisNodeResVO nodeResVO = new BasisDiagnosisNodeResVO(); nodeResVO.setType(1); nodeResVO.setRecordName(e.getToolLocationName()); nodeResVO.setRecordId(e.getRecordId()); nodeResVO.setCorrect(Objects.equals(e.getBasisConfirm(), e.getRecordBasisConfirmFlag()) ? 1 : 0); return nodeResVO; }).collect(Collectors.toList()); // 2.3 获取辅助检查 List ancillaryRecordList = diagnosisAncillaryRecordService.queryAncillaryResultByProcessId(processId); List collect = ancillaryRecordList.stream() .filter(distinctPredicateNotNull(AncillaryRecordByResultDAO::getItemName)).map(e -> { BasisDiagnosisNodeResVO nodeResVO = new BasisDiagnosisNodeResVO(); nodeResVO.setCorrect(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); basisConfirmResultResVO.setNodeList(nodeList); return basisConfirmResultResVO; } private BasisPrimaryResultResVO createBasisPrimaryResult(Patient patient, MedicalRec medicalRec, Process process) { BasisPrimaryResultResVO basisPrimaryResultResVO = new BasisPrimaryResultResVO(); // 初步诊断依据 vp_medical_rec的primarily_diagnosis_criteria basisPrimaryResultResVO.setPreliminaryDiagnosis(medicalRec.getPrimarilyDiagnosisCriteria()); // 根据record记录寻找符合初步诊断依据的项目 // 2.1 首先获取对话 List basisDiagnosisNodeResVOS = new ArrayList<>(); List qaRecordList = diagnosisQaRecordService.lambdaQuery().eq(DiagnosisQaRecord::getProcessId, process.getId()).list(); if (CollectionUtil.isNotEmpty(qaRecordList)) { List list = askPatientAnswerService.lambdaQuery() .eq(AskPatientAnswer::getPatientId, patient.getId()).list(); // 获取配置了答案的项目(配置了答案的,认为是正确,没有配置答案的,走默认回答的,不标记为以正确) Set requireCheckIdSet = list.stream().map(AskPatientAnswer::getId).collect(Collectors.toSet()); List 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); } // 2.2 获取体格检查 List physicalRecordList = diagnosisPhysicalRecordService.queryPhysicalResultByProcessId(process.getId()); List physicalList = physicalRecordList.stream() .filter(distinctPredicateNotNull(PhysicalRecordByResultDAO::getToolLocationName)).map(e -> { BasisDiagnosisNodeResVO nodeResVO = new BasisDiagnosisNodeResVO(); nodeResVO.setType(1); nodeResVO.setRecordName(e.getToolLocationName()); nodeResVO.setRecordId(e.getRecordId()); // 如果是必做的,则是正确 nodeResVO.setCorrect(null == e.getRequireCheck() ? Integer.valueOf(0) : e.getRequireCheck()); return nodeResVO; }).collect(Collectors.toList()); basisDiagnosisNodeResVOS.addAll(physicalList); // 2.3 获取辅助检查 List ancillaryRecordList = diagnosisAncillaryRecordService.queryAncillaryResultByProcessId(process.getId()); List collect = ancillaryRecordList.stream() .filter(distinctPredicateNotNull(AncillaryRecordByResultDAO::getItemName)).map(e -> { BasisDiagnosisNodeResVO nodeResVO = new BasisDiagnosisNodeResVO(); nodeResVO.setCorrect(null == e.getRequireCheck() ? Integer.valueOf(0) : e.getRequireCheck()); nodeResVO.setRecordId(e.getRecordId()); nodeResVO.setRecordName(e.getItemName()); nodeResVO.setType(2); return nodeResVO; }).collect(Collectors.toList()); basisDiagnosisNodeResVOS.addAll(collect); basisPrimaryResultResVO.setNodeList(basisDiagnosisNodeResVOS); return basisPrimaryResultResVO; } /** * 预期诊断结果 */ private ExpertDiagnosisResultResVO creatExpertDiagnosisResult(MedicalRec medicalRec, List diseasesList, String processId) { ExpertDiagnosisResultResVO expertDiagnosisResultResVO = new ExpertDiagnosisResultResVO(); expertDiagnosisResultResVO.setDiagnosis(diseasesList.stream().map(Disease::getDiseaseNameAlias).collect(Collectors.joining(";"))); Set expertDiseaseIdSet = diseasesList.stream().map(Disease::getId).collect(Collectors.toSet()); // 从vp_diagnosis_primary中找到确认诊断时,确认的 List userPrimaryDiseaseList = diagnosisPrimaryService.lambdaQuery() .eq(DiagnosisPrimary::getProcessId, processId) // 1确诊 .eq(DiagnosisPrimary::getExcludeFlag, 1).list(); List userDiagnosisDiseaseList = CollUtil.isEmpty(userPrimaryDiseaseList) ? CollUtil.newArrayList() : diseaseService.listByIds(userPrimaryDiseaseList.stream().map(DiagnosisPrimary::getPrimaryDiagnosisId).collect(Collectors.toList())); // 用户的诊断 expertDiagnosisResultResVO.setUserDiagnosisResult(userDiagnosisDiseaseList.stream().map(e -> { DiagnosisDiseaseResultNodeVO userNode = new DiagnosisDiseaseResultNodeVO(); userNode.setDiseaseName(e.getDiseaseNameAlias()); // 如果用户诊断在预期诊断里面,则正确,否则错误 userNode.setCorrect(expertDiseaseIdSet.contains(e.getId()) ? 1 : 0); userNode.setDiseaseId(e.getId()); return userNode; }).collect(Collectors.toList())); // 预期诊断 expertDiagnosisResultResVO.setExpertDiagnosisResult(diseasesList.stream().map(e -> { DiagnosisDiseaseResultNodeVO node = new DiagnosisDiseaseResultNodeVO(); node.setDiseaseName(e.getDiseaseNameAlias()); node.setDiseaseId(e.getId()); return node; }).collect(Collectors.toList())); return expertDiagnosisResultResVO; } public static Predicate distinctPredicateNotNull(Function function) { ConcurrentHashMap map = new ConcurrentHashMap<>(); return t -> null != function.apply(t) && null == map.putIfAbsent(function.apply(t), true); } }