| | |
| | | @Slf4j |
| | | @Service |
| | | public class PatMedInhospServiceImpl implements IPatMedInhospService { |
| | | |
| | | /** |
| | | * 批量查标签时单次 IN 的最大个数 |
| | | */ |
| | | private static final int TAG_QUERY_BATCH_SIZE = 500; |
| | | |
| | | @Autowired |
| | | private PatMedInhospMapper patMedInhospMapper; |
| | | @Autowired |
| | |
| | | */ |
| | | @Override |
| | | public List<PatMedInhosp> selectPatMedInhospList(PatMedInhosp patMedInhosp) { |
| | | //入院床位排序只在「在院」查询(cry=0)下生效,其它查询一律忽略,保证原有排序不变 |
| | | patMedInhosp.setBedSort(normalizeBedSort(patMedInhosp.getCry(), patMedInhosp.getBedSort())); |
| | | if (patMedInhosp.getCry() != null && patMedInhosp.getCry() == 0) { |
| | | patMedInhosp.setDeptcodeList(patMedInhosp.getLeaveldeptcodes()); |
| | | patMedInhosp.setHospitaldistrictcodeList(patMedInhosp.getLeavehospitaldistrictcodes()); |
| | |
| | | } |
| | | |
| | | List<PatMedInhosp> patMedInhospList = patMedInhospMapper.selectPatMedInhospList(patMedInhosp); |
| | | for (PatMedInhosp patMedInhosp1 : patMedInhospList) { |
| | | String tagname = patMedInhospMapper.getTagnameBypatid(patMedInhosp1.getPatid()); |
| | | patMedInhosp1.setTagname(tagname); |
| | | } |
| | | fillTagnames(patMedInhospList); |
| | | return patMedInhospList; |
| | | } |
| | | |
| | | /** |
| | | * 批量回填患者标签。 |
| | | * <p> |
| | | * 原来是拿到列表后逐行调用 getTagnameBypatid,属于典型的 N+1:分页 10 条就是 10 次查询, |
| | | * 非分页调用(导出、定时任务)几千条就是几千次查询。这里改成按 patid 去重后分批 IN 查询, |
| | | * 一批最多 {@link #TAG_QUERY_BATCH_SIZE} 个,避免 IN 列表过长。 |
| | | * |
| | | * @param patMedInhospList 待回填的住院记录列表 |
| | | */ |
| | | private void fillTagnames(List<PatMedInhosp> patMedInhospList) { |
| | | if (CollectionUtils.isEmpty(patMedInhospList)) { |
| | | return; |
| | | } |
| | | List<Long> patids = patMedInhospList.stream() |
| | | .map(PatMedInhosp::getPatid) |
| | | .filter(Objects::nonNull) |
| | | .distinct() |
| | | .collect(Collectors.toList()); |
| | | if (patids.isEmpty()) { |
| | | return; |
| | | } |
| | | |
| | | Map<Long, String> tagMap = new HashMap<>(patids.size()); |
| | | for (int i = 0; i < patids.size(); i += TAG_QUERY_BATCH_SIZE) { |
| | | List<Long> batch = patids.subList(i, Math.min(i + TAG_QUERY_BATCH_SIZE, patids.size())); |
| | | List<PatArchivetag> tags = patMedInhospMapper.selectTagnameByPatids(batch); |
| | | if (CollectionUtils.isEmpty(tags)) { |
| | | continue; |
| | | } |
| | | for (PatArchivetag tag : tags) { |
| | | if (tag.getPatid() != null) { |
| | | tagMap.put(tag.getPatid(), tag.getTagname()); |
| | | } |
| | | } |
| | | } |
| | | for (PatMedInhosp patMedInhosp : patMedInhospList) { |
| | | patMedInhosp.setTagname(tagMap.get(patMedInhosp.getPatid())); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 归一化入院床位排序参数 |
| | | * <p> |
| | | * asc / 1 -> asc(床位正序),desc / 2 -> desc(床位倒序),其余(含不传)-> null(不排序)。 |
| | | * 只对「在院」患者查询(cry=0)生效,出院/转科等查询忽略该参数。 |
| | | * |
| | | * @param cry 出入院标识:0入院 1出院 2转科 3预入院 |
| | | * @param bedSort 前端传入的床位排序值 |
| | | * @return 归一化后的排序值(asc / desc / null) |
| | | */ |
| | | private String normalizeBedSort(Integer cry, String bedSort) { |
| | | if (cry == null || cry != 0 || StringUtils.isEmpty(bedSort)) return null; |
| | | String value = bedSort.trim().toLowerCase(); |
| | | if ("asc".equals(value) || "1".equals(value)) return "asc"; |
| | | if ("desc".equals(value) || "2".equals(value)) return "desc"; |
| | | return null; |
| | | } |
| | | |
| | | @Override |
| | |
| | | pmoi.setDeptCodes(deptCodeList); |
| | | pmoi.setWardCodes(wardCodeList); |
| | | pmoi.setOpLevelCodes(opLevelCodeList); |
| | | List<PatMedOperationItem> patMedOperationItems = patMedOperationItemMapper.selectOperationItemList(pmoi); |
| | | |
| | | //每次查询只查最大的手术等级记录 |
| | | List<PatMedOperationItem> patMedOperationItems = patMedOperationItemMapper.selectOperationItemListMaxLevel(pmoi); |
| | | for (PatMedOperationItem patMedOperationItem : patMedOperationItems) { |
| | | PatArchive patArchive = patArchiveMapper.selectPatArchiveByPatid(patMedOperationItem.getPatid()); |
| | | if (Objects.isNull(patArchive)) { |
| | |
| | | } |
| | | } |
| | | |
| | | private Integer addServiceSubtaskPreachform(ServiceSubtask serviceSubtask, String sendstate) { |
| | | @Override |
| | | public Integer addServiceSubtaskPreachform(ServiceSubtask serviceSubtask, String sendstate) { |
| | | //将preachformDesc的json对象,放到list集合中 |
| | | ServiceTask serviceTask = serviceTaskMapper.selectServiceTaskByTaskid(serviceSubtask.getTaskid()); |
| | | if (Objects.isNull(serviceTask)) { |
| | |
| | | // } |
| | | ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTask, ServiceSubtask.class); |
| | | serviceSubtask.setTaskid(serviceTask.getTaskid()); |
| | | serviceSubtask.setOrgid(serviceTask.getOrgid()); |
| | | serviceSubtask.setCampusid(serviceTask.getCampusid()); |
| | | if (StringUtils.isNotEmpty(serviceTask.getLibtemplateid())) |
| | | serviceSubtask.setLibtemplateid(Long.valueOf(serviceTask.getLibtemplateid())); |
| | | serviceSubtask.setNurseId(patMedInhosp1.getNurseId()); |
| | |
| | | private ServiceSubtask boxedServiceSubtaskForOp(ServiceTask serviceTask, PatMedInhosp patMedInhosp1, PatMedOperationItem patMedOperationItem, PatArchive patArchive, String config) { |
| | | ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTask, ServiceSubtask.class); |
| | | serviceSubtask.setTaskid(serviceTask.getTaskid()); |
| | | serviceSubtask.setOrgid(serviceTask.getOrgid()); |
| | | serviceSubtask.setCampusid(serviceTask.getCampusid()); |
| | | if (StringUtils.isNotEmpty(serviceTask.getLibtemplateid())) |
| | | serviceSubtask.setLibtemplateid(Long.valueOf(serviceTask.getLibtemplateid())); |
| | | serviceSubtask.setNurseId(patMedInhosp1.getNurseId()); |
| | |
| | | pmoi.setOpercheckFlag("0"); |
| | | pmoi.setMainFlag("1"); |
| | | |
| | | List<PatMedOperationItem> patMedOperationItems = patMedOperationItemMapper.selectOperationItemList(pmoi); |
| | | //每次查询只查最大的手术等级记录 |
| | | List<PatMedOperationItem> patMedOperationItems = patMedOperationItemMapper.selectOperationItemListMaxLevel(pmoi); |
| | | log.info("dealOutHospInfo需要处理的出院手术患者信息:{}", CollectionUtils.isNotEmpty(patMedOperationItems) ? patMedOperationItems.size() : null); |
| | | |
| | | for (PatMedOperationItem opItem : patMedOperationItems) { |