| | |
| | | @Slf4j |
| | | @Service |
| | | public class PatMedInhospServiceImpl implements IPatMedInhospService { |
| | | |
| | | /** |
| | | * 批量查标签时单次 IN 的最大个数 |
| | | */ |
| | | private static final int TAG_QUERY_BATCH_SIZE = 500; |
| | | |
| | | @Autowired |
| | | private PatMedInhospMapper patMedInhospMapper; |
| | | @Autowired |
| | |
| | | } |
| | | |
| | | 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(不排序)。 |