liusheng
2026-10-12 26d1f59f0266672398975ba0337bb3d8267c2d95
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -116,14 +116,60 @@
        }
        List<PatMedInhosp> patMedInhospList = patMedInhospMapper.selectPatMedInhospList(patMedInhosp);
        for (PatMedInhosp patMedInhosp1 : patMedInhospList) {
            String tagname = patMedInhospMapper.getTagnameBypatid(patMedInhosp1.getPatid());
            patMedInhosp1.setTagname(tagname);
        }
        fillTagname(patMedInhospList);
        return patMedInhospList;
    }
    /**
     * 批量填充患者标签
     * <p>
     * 原实现是每行调一次 getTagnameBypatid,SQL 往返次数随 pageSize 线性增长;
     * 这里按 patid 去重后分批一次查回,结果与逐行查询完全一致(患者无标签时仍为 null)。
     *
     * @param patMedInhospList 待填充的住院记录,允许为空
     */
    private void fillTagname(List<PatMedInhosp> patMedInhospList) {
        if (CollectionUtils.isEmpty(patMedInhospList)) {
            return;
        }
        // LinkedHashSet 去重同时保持顺序,避免 IN 列表出现重复 patid
        Set<Long> patids = new LinkedHashSet<>();
        for (PatMedInhosp patMedInhosp : patMedInhospList) {
            if (patMedInhosp.getPatid() != null) {
                patids.add(patMedInhosp.getPatid());
            }
        }
        if (patids.isEmpty()) {
            return;
        }
        Map<Long, String> tagnameMap = new HashMap<>();
        List<Long> patidList = new ArrayList<>(patids);
        // 分片,防止 IN 参数过多
        int batchSize = 1000;
        for (int i = 0; i < patidList.size(); i += batchSize) {
            List<Long> batch = patidList.subList(i, Math.min(i + batchSize, patidList.size()));
            List<Map<String, Object>> rows = patMedInhospMapper.getTagnameByPatids(batch);
            if (CollectionUtils.isEmpty(rows)) {
                continue;
            }
            for (Map<String, Object> row : rows) {
                Object patid = row.get("patid");
                Object tagname = row.get("tagname");
                if (patid != null) {
                    tagnameMap.put(((Number) patid).longValue(), tagname == null ? null : tagname.toString());
                }
            }
        }
        for (PatMedInhosp patMedInhosp : patMedInhospList) {
            if (patMedInhosp.getPatid() != null) {
                patMedInhosp.setTagname(tagnameMap.get(patMedInhosp.getPatid()));
            }
        }
    }
    /**
     * 归一化入院床位排序参数
     * <p>
     * asc / 1 -> asc(床位正序),desc / 2 -> desc(床位倒序),其余(含不传)-> null(不排序)。