package com.supervision.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.supervision.exception.BusinessException; import com.supervision.model.*; import com.supervision.model.Process; import com.supervision.pojo.vo.AskPhysicalResultReqVO; import com.supervision.vo.ask.ConfigPhysicalToolResVO; import com.supervision.service.*; import com.supervision.util.UserUtil; import com.supervision.vo.ask.DiagnosisPhysicalRecordVo; import com.supervision.vo.ask.AskPhysicalHistoryResVO; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.Comparator; import java.util.List; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; @Service @RequiredArgsConstructor public class AskPhysicalServiceImpl implements AskPhysicalService { private final ConfigPhysicalLocationService locationService; private final ConfigPhysicalToolService toolService; private final DiseasePhysicalService diseasePhysicalService; private final DiagnosisPhysicalRecordService diagnosisPhysicalRecordService; private final ProcessService processService; @Override public List queryPhysicalToolList() { return toolService.queryPhysicalToolList(); } @Override public DiagnosisPhysicalRecordVo queryAskPhysicalResult(AskPhysicalResultReqVO reqVO) { // 首先根据process_id查新到流程ID Process process = Optional.ofNullable(processService.getById(reqVO.getProcessId())).orElseThrow(() -> new BusinessException("未找到流程ID")); ConfigPhysicalTool tool = Optional.ofNullable(toolService.getById(reqVO.getToolId())).orElseThrow(() -> new BusinessException("工具不支持")); // 是否需要具体的部位,0否1是 ConfigPhysicalLocation location = new ConfigPhysicalLocation(); DiseasePhysical result = new DiseasePhysical(); if (1 == tool.getRequireLocation() && StrUtil.isBlank(reqVO.getLocationCode())) { throw new BusinessException("请选择对应的位置"); } if (1 == tool.getRequireLocation()) { location = locationService.lambdaQuery().eq(ConfigPhysicalLocation::getCode, reqVO.getLocationCode()).last("limit 1") .oneOpt().orElseGet(ConfigPhysicalLocation::new); } if (1 == tool.getRequireLocation() && StrUtil.isEmpty(location.getId())) { result.setResult("无相关资讯"); } else { result = diseasePhysicalService.lambdaQuery().eq(DiseasePhysical::getDiseaseId, process.getMedicalRecId()) .eq(DiseasePhysical::getToolId, tool.getId()).eq(StrUtil.isNotBlank(location.getId()), DiseasePhysical::getLocationId, location.getId()).last("limit 1") .oneOpt() .orElseGet(() -> { DiseasePhysical diseasePhysical = new DiseasePhysical(); diseasePhysical.setResult("无相关资讯"); return diseasePhysical; }); } // 检查记录保存到数据库中 DiagnosisPhysicalRecord diagnosisPhysicalRecord = new DiagnosisPhysicalRecord(); diagnosisPhysicalRecord.setProcessId(process.getId()); diagnosisPhysicalRecord.setPhysicalId(result.getId()); diagnosisPhysicalRecord.setToolId(tool.getId()); diagnosisPhysicalRecord.setLocationId(location.getId()); diagnosisPhysicalRecord.setResult(result.getResult()); diagnosisPhysicalRecord.setCreateUserId(UserUtil.getUser().getCreateUserId()); diagnosisPhysicalRecord.setUpdateUserId(UserUtil.getUser().getCreateUserId()); diagnosisPhysicalRecord.insert(); // 保存初步诊断 for (String primaryId : reqVO.getPrimaryIdList()) { DiagnosisPrimaryRelation diagnosisPrimaryRelation = new DiagnosisPrimaryRelation(); diagnosisPrimaryRelation.setProcessId(process.getId()); diagnosisPrimaryRelation.setPrimaryId(primaryId); diagnosisPrimaryRelation.setType(2); diagnosisPrimaryRelation.setRelationId(diagnosisPhysicalRecord.getId()); diagnosisPrimaryRelation.insert(); } DiagnosisPhysicalRecordVo resVo = BeanUtil.toBean(diagnosisPhysicalRecord, DiagnosisPhysicalRecordVo.class); resVo.setLocationName(location.getLocationName()); resVo.setToolName(tool.getToolName()); return resVo; } @Override public List queryAskPhysicalHistory(String processId) { return diagnosisPhysicalRecordService.queryAskPhysicalHistory(processId).stream() .filter(distinctPredicateNotNull(e->e.getToolId()+e.getLocationId())).collect(Collectors.toList()); } public static Predicate distinctPredicateNotNull(Function function){ ConcurrentHashMap map = new ConcurrentHashMap<>(); return t-> null != function.apply(t) && null == map.putIfAbsent(function.apply(t), true); } }