陈昶聿
3 天以前 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,11 +122,48 @@
        }
        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()));
        }
    }
    /**
@@ -520,7 +563,9 @@
                                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)) {
@@ -1010,7 +1055,8 @@
        }
    }
    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)) {
@@ -1321,7 +1367,8 @@
        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) {