陈昶聿
4 天以前 d7e3192804fca756d881af360ffd5eea157ef9ad
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -37,6 +37,12 @@
@Slf4j
@Service
public class PatMedInhospServiceImpl implements IPatMedInhospService {
    /**
     * 批量查标签时单次 IN 的最大个数
     */
    private static final int TAG_QUERY_BATCH_SIZE = 500;
    @Autowired
    private PatMedInhospMapper patMedInhospMapper;
    @Autowired
@@ -116,14 +122,51 @@
        }
        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(不排序)。