liusheng
2026-09-23 ccf5fc76de48e6add5b325b93f2b0ea54efbf2b8
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -99,6 +99,8 @@
     */
    @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());
@@ -114,11 +116,75 @@
        }
        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(不排序)。
     * 只对「在院」患者查询(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
@@ -1044,6 +1110,8 @@
//        }
        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());
@@ -1155,6 +1223,8 @@
    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());
@@ -1296,7 +1366,6 @@
        }
        pmoi.setOpercheckFlag("0");
        pmoi.setMainFlag("1");
        pmoi.setOpid("5414");
        List<PatMedOperationItem> patMedOperationItems = patMedOperationItemMapper.selectOperationItemList(pmoi);
        log.info("dealOutHospInfo需要处理的出院手术患者信息:{}", CollectionUtils.isNotEmpty(patMedOperationItems) ? patMedOperationItems.size() : null);