陈昶聿
2 天以前 3d047130b059efd46f56be37465a751ab16ee8cb
Merge branch 'smartor_ls_merge' into 20261111-妇幼档案随访
已修改17个文件
已添加1个文件
429 ■■■■■ 文件已修改
.gitignore 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/service/dto/VisitSubtaskDraft.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/domain/row/VisitInhospRow.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/support/VisitSubtaskFactory.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-inhospvisit/src/main/resources/mapper/inhospvisit/VisitInhospMapper.xml 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/api/contract/OperationSubtaskWriter.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/api/contract/VisitTaskCreateApiImpl.java 4 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/domain/ServiceSubtask.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/domain/ServiceSubtaskRes.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/domain/ServiceTaskVO.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/domain/entity/ServiceSubtaskEntity.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/java/com/ruoyi/task/service/impl/ServiceSubtaskServiceImpl.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.gitignore
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
# ==================== æž„建产物 ====================
target/
out/
*.class
# ==================== IDE / ç¼–辑器 ====================
.idea/
*.iml
*.ipr
*.iws
.vscode/
.settings/
.project
.classpath
# ==================== ä¸´æ—¶ç›®å½• ====================
tmp/
.tmp/
_backups/
recovered/
__pycache__/
*.pyc
# ==================== å¤‡ä»½ä¸Žä¸´æ—¶æ–‡ä»¶ ====================
*.bak
*.bak[0-9]
*.bak-*
*.bak[0-9]-*
*.orig
*.rej
*~
# ==================== ä¸€æ¬¡æ€§æŽ’查脚本 / æŽ¢é’ˆ / æ—¥å¿—(不入库) ====================
# sql/ ä¸‹çš„一次性修复、排查、开关配置脚本仅本地留存,不入库;
# ä»…保留包内基线脚本与新库初始化脚本。
/sql/*.sql
!/sql/quartz.sql
!/sql/ry_20220822.sql
!/sql/pat_specific_archive_generate_config_lishui_mch_20261104.sql
sql/_probe/
*.log
_dbcheck.txt
package-lock.json
# ==================== æœ¬åœ°ä¸´æ—¶é…ç½® ====================
ruoyi-admin/src/main/resources/tempfile_*.yml
ruoyi-admin/src/main/resources/logback-backup.xml
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -63,6 +63,12 @@
    @Value("${spring.profiles.active}")
    private String active;
    /**
     * ç®¡ç†å‘˜ç”¨æˆ·ID列表(配置项 isAdmin)。管理员不受「用户-部门关系表」限制,直接看本机构全部科室/病区。
     */
    @Value("${isAdmin:1}")
    private List<Long> isAdmin;
//    @Value("${wx_appid}")
//    private String wxAppid;
//
@@ -240,23 +246,43 @@
        ajax.put("user", user);
        ajax.put("roles", roles);
        ajax.put("permissions", permissions);
        List<SysDept> sysDeptKSs = null;
        List<SysDept> sysDeptBQs = null;
        // ç§‘室/病区下拉的数据源:
        //   Â· ç®¡ç†å‘˜ï¼ˆè´¦å· admin,或命中配置 isAdmin çš„用户ID):直接查 sys_dept å–本机构全部科室/病区,
        //     ä¸å†å…³è” sys_user_dept,也不按院区过滤——管理员天然拥有全部科室权限;
        //   Â· æ™®é€šç”¨æˆ·ï¼šä»ç„¶æŒ‰ã€Œç”¨æˆ·-部门关系表」只返回自己名下的科室/病区(保持原逻辑)。
        SysUserDept sysUserDept = new SysUserDept();
        sysUserDept.setUserId(user.getUserId());
        sysUserDept.setDeptType("1");
        sysUserDept.setOrgid(user.getOrgid());
        if (!isAdminUser(user)) {
            sysUserDept.setUserId(user.getUserId());
        sysUserDept.setCampusid(user.getCampusid());
        sysDeptKSs = sysDeptService.selectLeafSysDeptListBySysUserDept(sysUserDept);
        }
        sysUserDept.setDeptType("1");
        List<SysDept> sysDeptKSs = sysDeptService.selectLeafSysDeptListBySysUserDept(sysUserDept);
        ajax.put("belongDepts", sysDeptKSs);
        sysUserDept.setDeptType("2");
        sysDeptBQs = sysDeptService.selectLeafSysDeptListBySysUserDept(sysUserDept);
        List<SysDept> sysDeptBQs = sysDeptService.selectLeafSysDeptListBySysUserDept(sysUserDept);
        ajax.put("belongWards", sysDeptBQs);
        return ajax;
    }
    /**
     * æ˜¯å¦ç®¡ç†å‘˜ï¼šè´¦å·åä¸º admin,或用户ID命中配置项 isAdmin。
     * <p>
     * ç®¡ç†å‘˜å–科室/病区时不走 sys_user_dept(HIS é‡‡é›†æ˜Žç¡®æŽ’除 admin,该表里管理员没有数据),
     * å¦åˆ™ä¼šå‡ºçŽ°ã€Œç™»å½•æˆåŠŸä½†ç§‘å®¤/病区下拉为空」。
     */
    private boolean isAdminUser(SysUser user) {
        if (user == null) {
            return false;
        }
        if ("admin".equalsIgnoreCase(user.getUserName())) {
            return true;
        }
        return user.getUserId() != null && isAdmin != null && isAdmin.contains(user.getUserId());
    }
    /**
     * èŽ·å–è·¯ç”±ä¿¡æ¯
     *
     * @return è·¯ç”±ä¿¡æ¯
ruoyi-common/src/main/java/com/ruoyi/common/core/service/dto/VisitSubtaskDraft.java
@@ -112,6 +112,19 @@
    /** è¯Šæ–­åç§° */
    private String diagname;
    /**
     * é‡è¦æ€§æ ‡è®°ç¼–码(2026-11 æ–°å¢žï¼‰ï¼šæ¥æº {@code pat_med_inhosp.importance_flag_code},
     * è½åº“到 {@code service_subtask.importance_flag_code}。
     * <p>
     * åˆ¤æ–­ã€Œæ—¥é—´ã€å°±çœ‹è¿™ä¸ªå­—段({@code ImportFlagEnum} çš„ {@code FH0165.01} æ—¥é—´æ‰‹æœ¯ /
     * {@code FH0165.02} æ—¥é—´è¯Šç–—;现场库存的是中文描述「日间手术」「日间诊疗」,可能多值)。
     * <p>
     * âš ï¸ ä¸Ž {@code deptcode}/{@code leaveldeptcode} é‚£æ‰¹ä¸åŒï¼š<b>不做维度改写</b>
     * ï¼ˆå…¥é™¢å®£æ•™ type=4/5 ä¹Ÿç…§æ ·å¸¦åŽŸå€¼ï¼‰ï¼Œå®ƒæè¿°çš„æ˜¯ã€Œè¿™æ¬¡ä½é™¢çš„é‡è¦æ€§/日间属性」,与科室无关。
     * é—¨è¯Šé“¾è·¯ï¼ˆ{@link OuthospSubtaskDraft})没有这个来源,恒为 {@code null}。
     */
    private String importanceFlagCode;
    // ==================== æ¨¡æ¿ï¼ˆåŽŸ serviceTask) ====================
    /** é—®å·æ¨¡æ¿ID */
    private Long templateid;
@@ -517,6 +530,14 @@
        this.diagname = diagname;
    }
    public String getImportanceFlagCode() {
        return importanceFlagCode;
    }
    public void setImportanceFlagCode(String importanceFlagCode) {
        this.importanceFlagCode = importanceFlagCode;
    }
    public Long getTemplateid() {
        return templateid;
    }
ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/domain/row/VisitInhospRow.java
@@ -545,7 +545,14 @@
    private String outWayName;
    /** è¿‡æ»¤ï¼šå°±è¯Šæ¥æºID */
    private String encounterSourceId;
    /** è¿‡æ»¤ï¼šé‡è¦ç¨‹åº¦ä»£ç  */
    /**
     * é‡è¦æ€§æ ‡è®°ï¼ˆ2026-11 èµ·<b>不再只是过滤条件</b>:{@code selectForScan} / {@code selectByInhospid}
     * å·²ç»æŠŠ {@code b.importance_flag_code} æŸ¥å‡ºæ¥ï¼Œå»ºå­ä»»åŠ¡æ—¶åŽŸæ ·å¸¦ç»™ {@code service_subtask})。
     * <p>
     * å–值:现场库存中文描述(「日间手术」「日间诊疗」「无」「特约人员」「离休人员」,可能逗号多值),
     * ä¹Ÿæœ‰åº“按 {@code ImportFlagEnum} å­˜ {@code FH0165.01} / {@code FH0165.02} ç­‰ç¼–码。
     * åˆ¤æ–­ã€Œæ—¥é—´ã€å°±åˆ¤æ–­å®ƒ â€”— æœ¬ç±»åªè´Ÿè´£æ¬è¿ï¼Œä¸åšå€¼åŸŸå½’一。
     */
    private String importanceFlagCode;
    /** è¿‡æ»¤ï¼šæ€¥è¯Šåˆ†çº§ä»£ç  */
    private String emergencyLevelCode;
ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/support/VisitSubtaskFactory.java
@@ -146,6 +146,12 @@
        d.setDeptname(inhosp.getDeptname());
        d.setHospitaldistrictcode(inhosp.getHospitaldistrictcode());
        d.setHospitaldistrictname(inhosp.getHospitaldistrictname());
        // ---- 2026-11 æ–°å¢žï¼šé‡è¦æ€§æ ‡è®°ï¼ˆå«ã€Œæ—¥é—´ã€ï¼‰åŽŸæ ·å¸¦èµ° ----
        //   èƒŒæ™¯ï¼šåˆ¤æ–­æ—¥é—´å°±çœ‹ pat_med_inhosp.importance_flag_code(现场库存中文描述
        //         ã€Œæ—¥é—´æ‰‹æœ¯ã€ã€Œæ—¥é—´è¯Šç–—」,也有库按 ImportFlagEnum å­˜ FH0165.01/02)。
        //   å­ä»»åŠ¡è½ä¸€ä»½ï¼Œéšè®¿åˆ—è¡¨å°±èƒ½ç›´æŽ¥æŒ‰ã€Œæ—¥é—´ã€ç­›ï¼Œä¸ç”¨æ¯è¡Œå›žæŸ¥ä½é™¢ç™»è®°è¡¨ã€‚
        //   å£å¾„:原样拷贝、不做值域归一;不随 type 4/5 æ”¹å†™ï¼ˆä¸Žç§‘室/病区维度无关)。
        d.setImportanceFlagCode(inhosp.getImportanceFlagCode());
        // ---- åŽŸ L1128-1134:type 4/5 æ”¹ç”¨å…¥é™¢ç»´åº¦ ----
        if (type != null && (type == 4 || type == 5)) {
            d.setLeaveldeptcode(inhosp.getDeptcode());
@@ -308,6 +314,8 @@
        d.setHospitaldistrictname(inhosp.getHospitaldistrictname());
        d.setLeavehospitaldistrictcode(inhosp.getLeavehospitaldistrictcode());
        d.setLeavehospitaldistrictname(inhosp.getLeavehospitaldistrictname());
        // 2026-11:重要性标记(含「日间」)原样带走(口径同 boxedServiceSubtask)
        d.setImportanceFlagCode(inhosp.getImportanceFlagCode());
        // ---- åŽŸ L1242-1251 ----
        d.setTemplateid(serviceTask.getTemplateid());
        d.setTemplatename(serviceTask.getTemplatename());
ruoyi-inhospvisit/src/main/resources/mapper/inhospvisit/VisitInhospMapper.xml
@@ -74,6 +74,8 @@
        <result property="longTaskReason" column="long_task_reason"/>
        <result property="remark" column="remark"/>
        <result property="medicalCode" column="medical_code"/>
        <!-- 2026-11:重要性标记编码(日间手术/日间诊疗/无…),建子任务时原样带给 service_subtask -->
        <result property="importanceFlagCode" column="importance_flag_code"/>
    </resultMap>
    <!--
@@ -125,6 +127,7 @@
        b.fuflag,
        b.fudate,
        b.remark,
        b.importance_flag_code,
        b.medical_code
        FROM
        pat_med_inhosp b
@@ -337,6 +340,7 @@
               leaveldeptname,
               leavehospitaldistrictcode,
               leavehospitaldistrictname,
               importance_flag_code,
               campusid
        from pat_med_inhosp
        where inhospid = #{inhospid}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeptServiceImpl.java
@@ -334,6 +334,10 @@
    public List<SysDept> selectLeafSysDeptListBySysUserDept(SysUserDept sysUserDept){
        List<SysDept> list =  deptMapper.selectSysDeptListBySysUserDept(sysUserDept);
        // userId ä¸ºç©º = ç®¡ç†å‘˜å–本机构全量科室/病区:要「全部」,不能再按叶子节点过滤掉父级部门
        if (sysUserDept != null && sysUserDept.getUserId() == null) {
            return list == null ? new ArrayList<>() : list;
        }
        if(CollectionUtils.isNotEmpty(list)){
            list = TreeUtils.getLeafDepts(list);
        }
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -146,7 +146,10 @@
            deptIds.add(sysDept.getDeptId());
        }
        SysUserDept sysUserDept = new SysUserDept();
        // ç®¡ç†å‘˜ï¼šä¸æŒ‰ç”¨æˆ·è¿‡æ»¤ï¼ˆsys_user_dept é‡Œæ²¡æœ‰ admin çš„æ•°æ®ï¼‰ï¼Œç›´æŽ¥å–本机构全部科室/病区
        if (!isAdminUser(sysUser)) {
        sysUserDept.setUserId(sysUser.getUserId());
        }
        sysUserDept.setDeptType(sysUser.getSearchscope());
        sysUserDept.setOrgid(sysUser.getOrgid());
        List<SysUserDept> sysUserDeptKSs = null;
@@ -201,7 +204,7 @@
        if (sysUser.getUserType().equals("患者") && StringUtils.isNotEmpty(split[3]) && !split[3].equals("null") && !sysUser.getUserType().equals(split[3].trim()))
            throw new BaseException("当前用户类型与登录用户类型不一致");
        boolean isAdmin = StringUtils.isNotEmpty(split[0]) && "admin".equals(split[0]);
        boolean isAdmin = isAdminUser(sysUser);
        IUserExtInfoService userExtInfoService = SpringUtils.getBean(IUserExtInfoService.class);
        Executor executor = SpringUtils.getBean("threadPoolTaskExecutor");
@@ -220,7 +223,7 @@
        // ç­‰å¾…机构信息
        Map<String, String> userOrgInfo = new HashMap<>();
        try {
            userOrgInfo = orgInfoFuture.get(5, TimeUnit.SECONDS);
            userOrgInfo = orgInfoFuture.get(50, TimeUnit.SECONDS);
        } catch (Exception e) {
            log.warn("获取用户机构信息超时或异常", e);
        }
@@ -258,8 +261,8 @@
                    CompletableFuture<List<SysDept>> ksFuture = CompletableFuture.supplyAsync(() -> selectLeafSysDeptForAdmin(deptKS), executor);
                    CompletableFuture<List<SysDept>> bqFuture = CompletableFuture.supplyAsync(() -> selectLeafSysDeptForAdmin(deptBQ), executor);
                    try {
                        sysUserDeptKSs = distinctByDeptCode(DtoConversionUtils.sourceToTarget(ksFuture.get(5, TimeUnit.SECONDS), SysUserDept.class));
                        sysUserDeptBQs = distinctByDeptCode(DtoConversionUtils.sourceToTarget(bqFuture.get(5, TimeUnit.SECONDS), SysUserDept.class));
                        sysUserDeptKSs = distinctByDeptCode(DtoConversionUtils.sourceToTarget(ksFuture.get(50, TimeUnit.SECONDS), SysUserDept.class));
                        sysUserDeptBQs = distinctByDeptCode(DtoConversionUtils.sourceToTarget(bqFuture.get(50, TimeUnit.SECONDS), SysUserDept.class));
                    } catch (Exception e) {
                        log.warn("获取admin科室/病区信息超时或异常", e);
                    }
@@ -358,6 +361,23 @@
            log.warn("获取满意度分类失败,已降级为空结果(不影响登录)。orgid={}", orgid, e);
            return Collections.emptyMap();
        }
    }
    /**
     * æ˜¯å¦ç®¡ç†å‘˜ï¼šè´¦å·åä¸º admin,或用户ID命中配置项 isAdmin。
     * <p>
     * ç®¡ç†å‘˜å–科室/病区时不按 sys_user_dept è¿‡æ»¤â€”—HIS é‡‡é›†å†™è¯¥è¡¨æ—¶æ˜Žç¡®æŽ’除了 admin
     * ï¼ˆCollectHISMapper çš„ yhyksxx/yhybfxx éƒ½æœ‰ {@code ud.user_id != 'admin'}),
     * èµ°å…³è”查询会得到空列表,表现为「登录成功但创建任务时选不到科室病区」。
     */
    private boolean isAdminUser(SysUser sysUser) {
        if (sysUser == null) {
            return false;
        }
        if ("admin".equalsIgnoreCase(sysUser.getUserName())) {
            return true;
        }
        return sysUser.getUserId() != null && isAdmin != null && isAdmin.contains(sysUser.getUserId());
    }
    /**
@@ -1022,8 +1042,11 @@
    public List<SysUserDept> selectLeafSysDeptList(SysUserDept sysUserDept){
        List<SysDept> list =  sysDeptMapper.selectSysDeptListBySysUserDept(sysUserDept);
        // userId ä¸ºç©º = ç®¡ç†å‘˜å–本机构全量:要「所有科室病区」,不能再按叶子节点过滤
        if (sysUserDept == null || sysUserDept.getUserId() != null) {
        if(org.apache.commons.collections4.CollectionUtils.isNotEmpty(list)){
            list = TreeUtils.getLeafDepts(list);
            }
        }
        List<SysUserDept> list1 = DtoConversionUtils.sourceToTarget(list, SysUserDept.class);
        return list1;
@@ -1031,11 +1054,9 @@
    public List<SysDept> selectLeafSysDeptForAdmin(SysDept sysDept){
        SysUserDept sysUserDept = DtoConversionUtils.sourceToTarget(sysDept, SysUserDept.class);
        List<SysDept> list =  sysDeptMapper.selectSysDeptListBySysUserDept(sysUserDept);
        if(org.apache.commons.collections4.CollectionUtils.isNotEmpty(list)){
            list = TreeUtils.getLeafDepts(list);
        }
        return list;
        // ç®¡ç†å‘˜åˆ†æ”¯ï¼šsysUserDept ä¸å¸¦ userId,mapper ä¼šç›´æŽ¥æŸ¥ sys_dept(不关联 sys_user_dept),
        // è¿”回本机构全部科室/病区;这里不再做叶子过滤,否则「所有科室病区」会被砍掉父级部门。
        return sysDeptMapper.selectSysDeptListBySysUserDept(sysUserDept);
    }
    /**
ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
@@ -283,8 +283,19 @@
        where dept_id = #{deptId}
    </delete>
    <!--
        æŸ¥è¯¢ç§‘室/病区:
          Â· userId æœ‰å€¼ï¼ˆæ™®é€šç”¨æˆ· / ç”¨æˆ·ç¼–辑页:查某个用户名下的部门)→ å…³è” sys_user_dept;
          Â· userId ä¸ºç©ºï¼ˆç®¡ç†å‘˜ï¼šçœ‹æœ¬æœºæž„全部科室/病区)→ åªæŸ¥ sys_dept,不关联关系表。
        ä¸ºä»€ä¹ˆè¦åˆ†æ”¯ï¼šHIS é‡‡é›†å†™ sys_user_dept æ—¶æ˜Žç¡®æŽ’除了 admin(CollectHISMapper çš„
        yhyksxx/yhybfxx éƒ½æœ‰ ud.user_id != 'admin'),管理员在关系表里没有数据,走 inner join
        ä¼šå¾—到空列表,表现就是「登录成功但创建任务时选不到科室病区」。
        å¦å¤–不做院区过滤(管理员跨院区),院区隔离只对普通用户生效。
    -->
    <select id="selectSysDeptListBySysUserDept" parameterType="com.ruoyi.common.core.domain.entity.SysUserDept"
            resultMap="SysDeptResult">
        <choose>
            <when test="userId != null">
        <include refid="selectDeptVo"/>
        inner join sys_user_dept ud
        on d.dept_code = ud.dept_code
@@ -293,7 +304,15 @@
        and ud.del_flag = 0
        <if test="orgid != null">and d.orgid = #{orgid} and ud.orgid = #{orgid}</if>
        <if test="campusid != null">and d.campusid = #{campusid}</if>
        <if test="userId != null">and ud.user_id = #{userId}</if>
        <if test="deptType != null and deptType != ''">and d.dept_type = #{deptType}</if>
                and ud.user_id = #{userId}
            </when>
            <otherwise>
                <include refid="selectDeptVo"/>
                where d.del_flag = 0
                <if test="orgid != null">and d.orgid = #{orgid}</if>
                <if test="deptType != null and deptType != ''">and d.dept_type = #{deptType}</if>
            </otherwise>
        </choose>
    </select>
</mapper>
ruoyi-task/src/main/java/com/ruoyi/task/api/contract/OperationSubtaskWriter.java
@@ -485,6 +485,8 @@
        serviceSubtask.setLeaveldeptname(patMedInhosp1.getLeaveldeptname());
        serviceSubtask.setLeavehospitaldistrictcode(patMedInhosp1.getLeavehospitaldistrictcode());
        serviceSubtask.setLeavehospitaldistrictname(patMedInhosp1.getLeavehospitaldistrictname());
        // 2026-11:重要性标记(含「日间」)随任务走,便于子任务列表直接按日间筛选
        serviceSubtask.setImportanceFlagCode(patMedInhosp1.getImportanceFlagCode());
        serviceSubtask.setTemplateid(serviceTask.getTemplateid());
        serviceSubtask.setTemplatename(serviceTask.getTemplatename());
@@ -620,6 +622,8 @@
        serviceSubtask.setLeaveicd10code(patMedInhosp1.getLeaveicd10code());
        serviceSubtask.setLeavediagname(patMedInhosp1.getLeavediagname());
        serviceSubtask.setDiagname(patMedInhosp1.getDiagname());
        // 2026-11:重要性标记(含「日间」)随任务走(口径同上)
        serviceSubtask.setImportanceFlagCode(patMedInhosp1.getImportanceFlagCode());
        serviceSubtask.setTemplateid(serviceTask.getTemplateid());
        serviceSubtask.setTemplatename(serviceTask.getTemplatename());
        serviceSubtask.setPatid(patArchive.getId());
ruoyi-task/src/main/java/com/ruoyi/task/api/contract/VisitTaskCreateApiImpl.java
@@ -285,6 +285,10 @@
        e.setLeaveicd10code(d.getLeaveicd10code());
        e.setLeavediagname(d.getLeavediagname());
        e.setDiagname(d.getDiagname());
        // 2026-11:重要性标记编码(日间手术/日间诊疗/无…),来自 pat_med_inhosp.importance_flag_code。
        // åªæœ‰ã€Œå‡ºå…¥é™¢éšè®¿ã€é“¾è·¯ä¼šå¡«å€¼ï¼ˆVisitSubtaskFactory);门诊/手术等草稿里为 null â†’
        // insert çš„æ¡ä»¶åˆ—直接跳过,与改造前这些列不写的效果一致。
        e.setImportanceFlagCode(d.getImportanceFlagCode());
        e.setTemplateid(d.getTemplateid());
        e.setTemplatename(d.getTemplatename());
        e.setLibtemplateid(d.getLibtemplateid());
ruoyi-task/src/main/java/com/ruoyi/task/domain/ServiceSubtask.java
@@ -708,6 +708,25 @@
    private String diagType;
    /**
     * é‡è¦æ€§æ ‡è®°ç¼–码(2026-11 æ–°å¢žï¼Œ<b>建任务时从 {@code pat_med_inhosp.importance_flag_code} åŒæ­¥</b>)。
     * <p>
     * ä¸ºä»€ä¹ˆåŒæ­¥ï¼šåˆ¤æ–­ã€Œæ—¥é—´ã€å°±çœ‹è¿™ä¸ªå­—段,而 service_subtask ä¸Šåªæœ‰ {@code inhospid},
     * ä¸è½ä¸€ä»½çš„话按「日间」筛子任务每行都要回查住院登记表(JOIN / å­æŸ¥è¯¢ï¼‰ï¼Œåˆ—表与统计都变慢。
     * <p>
     * å–值是<b>原样拷贝</b>,不在本表做归一:
     * <ul>
     *   <li>枚举编码口径({@code ImportFlagEnum}):{@code FH0165.01} æ—¥é—´æ‰‹æœ¯ã€{@code FH0165.02} æ—¥é—´è¯Šç–—、
     *       {@code FH0165.03} æ— ã€{@code FH0165.98} ç‰¹çº¦äººå‘˜ã€{@code FH0165.99} ç¦»ä¼‘人员;</li>
     *   <li>现场也有存<b>中文描述</b>的库(「日间手术」「日间诊疗」…),还存在逗号多值(如 {@code æ— ,日间手术})。</li>
     * </ul>
     * æ‰€ä»¥æŸ¥è¯¢ä¾§æä¾›ã€Œç²¾ç¡®å€¼ã€å’Œã€Œé›†åˆ IN」两种条件,见 {@code serviceSubtaskWhere}。
     * <p>
     * âš ï¸ è¿™æ˜¯<b>建任务那一刻的快照</b>:之后住院记录改了标记,不会自动回写已有子任务。
     */
    @ApiModelProperty(value = "重要性标记编码(日间手术/日间诊疗/无/特约人员/离休人员,或 FH0165.xx)")
    private String importanceFlagCode;
    /**
     * å¼€å§‹å‡ºé™¢æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
ruoyi-task/src/main/java/com/ruoyi/task/domain/ServiceSubtaskRes.java
@@ -243,6 +243,17 @@
    private String deptname;
    /**
     * é‡è¦æ€§æ ‡è®°ç¼–码(2026-11 æ–°å¢žï¼‰ï¼šå»ºä»»åŠ¡æ—¶ä»Ž {@code pat_med_inhosp.importance_flag_code} åŒæ­¥ï¼Œ
     * åˆ—表接口原样返回。
     * <p>
     * åˆ¤æ–­ã€Œæ—¥é—´ã€çœ‹è¿™é‡Œï¼š{@code ImportFlagEnum} çš„ {@code FH0165.01}(日间手术)/
     * {@code FH0165.02}(日间诊疗);现场库存的是中文描述「日间手术」「日间诊疗」,
     * è¿˜å¯èƒ½å‡ºçް {@code æ— ,日间手术} è¿™ç±»å¤šå€¼ â€”— æ‰€ä»¥å‰ç«¯åˆ«ç”¨ç­‰å€¼åˆ¤æ–­ï¼ŒæŒ‰ã€ŒåŒ…含」匹配。
     */
    @ApiModelProperty(value = "重要性标记编码(日间手术/日间诊疗/无/特约人员/离休人员)")
    private String importanceFlagCode;
    /**
     * æ™šä¸Šå¼€å§‹å‘送时间限制
     */
    @Excel(name = " æ™šä¸Šå¼€å§‹å‘送时间限制 ")
ruoyi-task/src/main/java/com/ruoyi/task/domain/ServiceTaskVO.java
@@ -70,9 +70,9 @@
    private List<String> leavehospitaldistrictcodes;
    /**
     * å‡ºé™¢ç—…区编号
     * å‡ºé™¢éƒ¨é—¨ç¼–号集合(点位编号)
     */
    @ApiModelProperty(value = "出院部门编号集合")
    @ApiModelProperty(value = "出院部门编号集合(点位编号)")
    private List<String> leaveldeptcodes;
    /**
@@ -468,8 +468,8 @@
    /**
     * é€‚用条件类型:1、按科室、2、按病区、3、按疾病诊断、4、按手术类型、5、按任务组
     */
    @ApiModelProperty("适用条件类型:1、按科室、2、按病区、3、按疾病诊断、4、按手术类型、5、按任务组  6.按药品编码")
    @Excel(name = "适用条件类型:1、按科室、2、按病区、3、按疾病诊断、4、按手术类型、5、按任务组 6.按药品编码" )
    @ApiModelProperty("适用条件类型:1、按科室、2、按病区、3、按疾病诊断、4、按手术类型、5、按任务组  6.按药品编码  7.按点位(同德需求)")
    @Excel(name = "适用条件类型:1、按科室、2、按病区、3、按疾病诊断、4、按手术类型、5、按任务组 6.按药品编码   7.按点位(同德需求)" )
    private String appltype;
    @ApiModelProperty(value = "随访部门编码")
ruoyi-task/src/main/java/com/ruoyi/task/domain/entity/ServiceSubtaskEntity.java
@@ -732,6 +732,31 @@
    private String managementDoctor;
    /**
     * é‡è¦æ€§æ ‡è®°ç¼–码(2026-11 æ–°å¢žï¼Œ<b>查询条件</b>):精确匹配。
     * <p>
     * å¯¹åº” {@code service_subtask.importance_flag_code}:建任务时从
     * {@code pat_med_inhosp.importance_flag_code} åŽŸæ ·åŒæ­¥ã€‚
     * æžšä¸¾è§ {@code com.ruoyi.common.enums.ImportFlagEnum}
     * ï¼ˆ{@code FH0165.01} æ—¥é—´æ‰‹æœ¯ã€{@code FH0165.02} æ—¥é—´è¯Šç–—…);
     * çŽ°åœºåº“ä¹Ÿå¯èƒ½å­˜ä¸­æ–‡æè¿°ã€‚
     */
    @ApiModelProperty(value = "重要性标记编码(精确匹配,如 FH0165.01 / æ—¥é—´æ‰‹æœ¯ï¼‰")
    private String importanceFlagCode;
    /**
     * é‡è¦æ€§æ ‡è®°ç¼–码集合(查询条件):{@code IN} åŒ¹é…ï¼Œç”¨äºŽã€Œæ—¥é—´ã€è¿™ç±»
     * ã€Œè¦åŒæ—¶å‘½ä¸­å¤šä¸ªå–值」的场景。
     * <p>
     * ä¾‹ï¼šåªçœ‹æ—¥é—´ â†’ {@code ["日间手术","日间诊疗"]}(中文描述口径)或
     * {@code ["FH0165.01","FH0165.02"]}(枚举编码口径)。
     * <p>
     * âš ï¸ ç­‰å€¼/IN éƒ½åŒ¹é…ä¸åˆ°é€—号多值(如 {@code æ— ,日间手术});这类数据极少,
     * éœ€è¦æ—¶è¯·ç”¨ {@code find_in_set} å•独写 SQL,别把语义塞进这个字段。
     */
    @ApiModelProperty(value = "重要性标记编码集合(IN åŒ¹é…ï¼Œç”¨äºŽä¸€æ¬¡ç­›å¤šä¸ªæ ‡è®°ï¼‰")
    private List<String> importanceFlagCodes;
    /**
     * å¼€å§‹å‡ºé™¢æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
ruoyi-task/src/main/java/com/ruoyi/task/service/impl/ServiceSubtaskServiceImpl.java
@@ -1608,6 +1608,61 @@
    }
    /**
     * å–逗号串里的第一个值(任务上科室/病区是多选,而 {@code service_subtask} ä¸Šéƒ½æ˜¯å•值列)。
     */
    private String firstValue(String value) {
        if (StringUtils.isEmpty(value)) {
            return null;
        }
        for (String item : value.split(",")) {
            if (StringUtils.isNotEmpty(item.trim())) {
                return item.trim();
            }
        }
        return null;
    }
    /**
     * ä»»åŠ¡é…ç½®ï¼ˆ{@link ServiceTaskVO})→ å­ä»»åŠ¡ï¼ˆ{@link ServiceSubtask})的字段搬运。
     * <p>
     * <b>为什么不能直接 {@code DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceSubtask.class)}:</b>
     * å®ƒæ˜¯çº¯åŒåæ‹·è´ï¼Œè€Œä¸¤è¾¹åŒåçš„ {@code deptcode / deptname} <b>语义不同</b>:
     * <ul>
     *   <li>{@code ServiceTaskVO.deptcode / deptname} = ä»»åŠ¡çš„ã€Œé€‚ç”¨ç§‘å®¤ã€ï¼Œ
     *       å‡ºé™¢éšè®¿ï¼ˆserviceType=2)/ å‡ºé™¢å®£æ•™ï¼ˆ4)/ é—¨è¯Šéšè®¿ï¼ˆ3)等场景下就是<b>离院科室</b>;</li>
     *   <li>{@code ServiceSubtask.deptcode / deptname} = <b>在院科室</b>
     *       ï¼ˆ2026-11 ç”±åŽŸ sendlimitpbegin/pend å¤ç”¨è€Œæ¥ï¼Œè§ {@code ServiceSubtask} å­—段注释)。</li>
     * </ul>
     * äºŽæ˜¯çº¯åŒåæ‹·è´ä¼šæŠŠã€Œç¦»é™¢ç§‘室」写进「在院科室」列,后果有两个:
     * <ol>
     *   <li>按在院维度筛({@code deptcodes} â†’ {@code service_subtask.deptcode})会误命中这些子任务;</li>
     *   <li>按离院维度筛({@code leaveldeptcodes} â†’ {@code service_subtask.leaveldeptcode})时,
     *       æ‚£è€…自己没带科室的那些(前端手动勾选患者很常见)会因为 {@code leaveldeptcode} ä¸ºç©ºè€ŒæŸ¥ä¸åˆ°ã€‚</li>
     * </ol>
     * å› æ­¤è¿™é‡ŒæŒ‰é¡¹ç›®æ—¢å®šå£å¾„({@code doc/service_subtask_字段改名_改动清单.md} Â§8:这几条
     * ã€Œé•¿æœŸä»»åŠ¡ / ä»»åŠ¡ç»„ / æ‰‹åŠ¨å»ºä»»åŠ¡ã€è·¯å¾„<b>不填在院维度</b>)统一处理:
     * <b>在院维度 4 åˆ—清空</b>(在院科室/在院病区只有 HIS é“¾è·¯èƒ½ä»Ž {@code pat_med_inhosp} æ‹¿åˆ°ï¼‰ï¼Œ
     * <b>科室 / ç—…区一律落离院维度</b>({@code leaveldeptcode/name}、{@code leavehospitaldistrictcode/name})。
     *
     * @param serviceTaskVO å»ºä»»åŠ¡å…¥å‚
     * @return å·²æŒ‰ç¦»é™¢ç»´åº¦å½’位的子任务对象(在院维度为空)
     */
    private ServiceSubtask toSubtaskFromTaskVO(ServiceTaskVO serviceTaskVO) {
        ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceSubtask.class);
        // â‘  åœ¨é™¢ç»´åº¦å¿…须清空:任务配置的科室不是患者本人的在院科室
        serviceSubtask.setDeptcode(null);
        serviceSubtask.setDeptname(null);
        serviceSubtask.setHospitaldistrictcode(null);
        serviceSubtask.setHospitaldistrictname(null);
        // â‘¡ ç§‘室 / ç—…区 â†’ ç¦»é™¢ç»´åº¦ï¼ˆå¤šé€‰ä¸²å–第一个,子任务是单值列)
        serviceSubtask.setLeaveldeptcode(firstValue(serviceTaskVO.getDeptcode()));
        serviceSubtask.setLeaveldeptname(firstValue(serviceTaskVO.getDeptname()));
        serviceSubtask.setLeavehospitaldistrictcode(firstValue(serviceTaskVO.getLeavehospitaldistrictcode()));
        serviceSubtask.setLeavehospitaldistrictname(firstValue(serviceTaskVO.getLeavehospitaldistrictname()));
        return serviceSubtask;
    }
    /**
     * å•一任务
     *
     * @return ç»“æžœ
@@ -1834,7 +1889,8 @@
//            }
            //将任务信息放到服务表中
            ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceSubtask.class);
            // ç§‘室/病区按「离院维度」归位(出院随访的科室病区就是离院科室/病区),见 toSubtaskFromTaskVO
            ServiceSubtask serviceSubtask = toSubtaskFromTaskVO(serviceTaskVO);
            serviceSubtask.setTaskid(serviceTask.getTaskid().longValue());
            serviceSubtask.setTemplatename(ObjectUtils.isNotEmpty(tempid) ? tempName : serviceTask.getTemplatename());
            serviceSubtask.setTemplateid(ObjectUtils.isNotEmpty(tempid) ? tempid : serviceTask.getTemplateid());
@@ -1855,15 +1911,18 @@
                    serviceSubtask.setInhospid(patTaskRelevance.getHospid());
                    //新建完成就是待发送状态
                    serviceSubtask.setSendstate(2L);
                    String subtaskDeptCode = patTaskRelevance.getDeptcode();
                    if (StringUtils.isEmpty(subtaskDeptCode) && StringUtils.isNotEmpty(serviceTaskVO.getDeptcode())) {
                        // service_subtask.leaveldeptcode ä¸ºå•值字段,不能写入任务的多科室拼接串,取第一个科室兜底
                        subtaskDeptCode = serviceTaskVO.getDeptcode().split(",")[0].trim();
                    }
                    serviceSubtask.setLeaveldeptcode(subtaskDeptCode);
                    serviceSubtask.setLeaveldeptname(StringUtils.isNotEmpty(patTaskRelevance.getDeptName()) ? patTaskRelevance.getDeptName() : serviceTaskVO.getDeptname());
                    serviceSubtask.setLeavehospitaldistrictcode(patTaskRelevance.getLeavehospitaldistrictcode());
                    serviceSubtask.setLeavehospitaldistrictname(patTaskRelevance.getLeavehospitaldistrictname());
                    // ç¦»é™¢ç»´åº¦ï¼ˆå‡ºé™¢éšè®¿ = å‡ºé™¢ç§‘室 / å‡ºé™¢ç—…区):
                    // æ‚£è€…自带的出院科室/病区优先,患者侧没带(前端手动勾选很常见)时回退到任务配置,
                    // ä¸èƒ½æ— æ¡ä»¶è¦†ç›– â€”— å¦åˆ™ä¼šæŠŠ toSubtaskFromTaskVO æŒ‰ä»»åŠ¡é…ç½®å…œå¥½çš„ç¦»é™¢ç»´åº¦æŠ¹æˆ null,
                    // ç»“果「任务配了科室病区、生成出来的子任务离院科室/病区却是空」。
                    serviceSubtask.setLeaveldeptcode(firstNonBlank(patTaskRelevance.getDeptcode(),
                            firstValue(serviceTaskVO.getDeptcode())));
                    serviceSubtask.setLeaveldeptname(firstNonBlank(patTaskRelevance.getDeptName(),
                            firstValue(serviceTaskVO.getDeptname())));
                    serviceSubtask.setLeavehospitaldistrictcode(firstNonBlank(patTaskRelevance.getLeavehospitaldistrictcode(),
                            firstValue(serviceTaskVO.getLeavehospitaldistrictcode())));
                    serviceSubtask.setLeavehospitaldistrictname(firstNonBlank(patTaskRelevance.getLeavehospitaldistrictname(),
                            firstValue(serviceTaskVO.getLeavehospitaldistrictname())));
                    serviceSubtask.setType(serviceTaskVO.getType());
                    serviceSubtask.setHospType(patTaskRelevance.getHospType());
                    serviceSubtask.setOpenid(patTaskRelevance.getOpenid());
@@ -2221,7 +2280,8 @@
            }
            if (CollectionUtils.isNotEmpty(serviceTaskVO.getPatTaskRelevances())) {
                for (PatTaskRelevance patTaskRelevance : serviceTaskVO.getPatTaskRelevances()) {
                    ServiceSubtask serviceSubtask = DtoConversionUtils.sourceToTarget(serviceTaskVO, ServiceSubtask.class);
                    // ç§‘室/病区按「离院维度」归位(出院随访的科室病区就是离院科室/病区),见 toSubtaskFromTaskVO
                    ServiceSubtask serviceSubtask = toSubtaskFromTaskVO(serviceTaskVO);
                    serviceSubtask.setLibtemplateid(ObjectUtils.isEmpty(serviceTaskVO.getLibtemplateid()) ? null : Long.valueOf(serviceTaskVO.getLibtemplateid()));
                    serviceSubtask.setLibtemplatename(serviceTaskVO.getLibtemplatename());
                    serviceSubtask.setTemplateid(serviceTask.getTemplateid());
@@ -2233,10 +2293,16 @@
                    serviceSubtask.setAddr(patTaskRelevance.getAddr());
                    serviceSubtask.setPatid(patTaskRelevance.getPatid());
                    serviceSubtask.setOpenid(patTaskRelevance.getOpenid());
                    serviceSubtask.setLeaveldeptcode(patTaskRelevance.getDeptcode());
                    serviceSubtask.setLeavehospitaldistrictname(patTaskRelevance.getLeavehospitaldistrictname());
                    serviceSubtask.setLeavehospitaldistrictcode(patTaskRelevance.getLeavehospitaldistrictcode());
                    serviceSubtask.setLeaveldeptname(patTaskRelevance.getDeptName());
                    // ç¦»é™¢ç»´åº¦ï¼šæ‚£è€…自带的出院科室/病区优先,没带时回退到任务配置(否则会把
                    // toSubtaskFromTaskVO æŒ‰ä»»åŠ¡é…ç½®å…œå¥½çš„å€¼æŠ¹æˆ null,出院随访就成「离院科室/病区为空」)
                    serviceSubtask.setLeaveldeptcode(firstNonBlank(patTaskRelevance.getDeptcode(),
                            firstValue(serviceTaskVO.getDeptcode())));
                    serviceSubtask.setLeaveldeptname(firstNonBlank(patTaskRelevance.getDeptName(),
                            firstValue(serviceTaskVO.getDeptname())));
                    serviceSubtask.setLeavehospitaldistrictcode(firstNonBlank(patTaskRelevance.getLeavehospitaldistrictcode(),
                            firstValue(serviceTaskVO.getLeavehospitaldistrictcode())));
                    serviceSubtask.setLeavehospitaldistrictname(firstNonBlank(patTaskRelevance.getLeavehospitaldistrictname(),
                            firstValue(serviceTaskVO.getLeavehospitaldistrictname())));
                    serviceSubtask.setType(serviceTaskVO.getType());
                    serviceSubtask.setCreateTime(DateUtils.getNowDate());
                    serviceSubtask.setDrname(patTaskRelevance.getDrname());
ruoyi-task/src/main/resources/mapper/task/ServiceSubtaskMapper.xml
@@ -109,6 +109,8 @@
        <result property="isManuallyCalled" column="is_manually_called"/>
        <result property="campusid" column="campusid"/>
        <result property="diagType" column="diag_type"/>
        <!-- 2026-11:重要性标记编码(日间手术/日间诊疗/无…),建任务时取自 pat_med_inhosp -->
        <result property="importanceFlagCode" column="importance_flag_code"/>
    </resultMap>
    <resultMap type="com.ruoyi.task.domain.ServiceSubtaskCount" id="ServiceSubtaskResult2">
@@ -244,6 +246,7 @@
               hospitaldistrictname,
               deptcode,
               deptname,
               importance_flag_code,
               stop_state,
               leavehospitaldistrictcode,
               leavehospitaldistrictname,
@@ -384,16 +387,34 @@
    <sql id="filterLeaveDimAnd">
        /* f-v3 */
        <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
            AND leavehospitaldistrictcode IN
            AND (
            leavehospitaldistrictcode IN
            <foreach collection="leavehospitaldistrictcodes" item="lvWardCodeItem" open="(" separator="," close=")">
                #{lvWardCodeItem}
            </foreach>
            <!-- å»¶ç»­æŠ¤ç†ä»»åŠ¡ï¼ˆservice_type='99')可以在患者还没出院时生成:
                 è¿™ç±»è®°å½•只有「在院维度」(hospitaldistrictcode / deptcode),出院维度是 NULL。
                 NULL ä¸åŒ¹é…ä»»ä½• IN,任务会「提示生成成功、列表里却查不到」,
                 æ‰€ä»¥å‡ºé™¢ç»´åº¦ä¸ºç©ºæ—¶ç”¨åŒä¸€å¥—编码体系的在院维度兜底。 -->
            OR (service_type = '99' AND (leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode = '')
                AND hospitaldistrictcode IN
                <foreach collection="leavehospitaldistrictcodes" item="lvWardCodeItem" open="(" separator="," close=")">
                    #{lvWardCodeItem}
                </foreach>)
            )
        </if>
        <if test="leaveldeptcodes != null and leaveldeptcodes.size() > 0">
            AND leaveldeptcode IN
            AND (
            leaveldeptcode IN
            <foreach collection="leaveldeptcodes" item="lvDeptCodeItem" open="(" separator="," close=")">
                #{lvDeptCodeItem}
            </foreach>
            OR (service_type = '99' AND (leaveldeptcode IS NULL OR leaveldeptcode = '')
                AND deptcode IN
                <foreach collection="leaveldeptcodes" item="lvDeptCodeItem" open="(" separator="," close=")">
                    #{lvDeptCodeItem}
                </foreach>)
            )
        </if>
    </sql>
@@ -434,20 +455,38 @@
                  or (leaveldeptcodes != null and leaveldeptcodes.size() > 0)">
            AND (
            <if test="leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0">
                (
                leavehospitaldistrictcode IN
                <foreach collection="leavehospitaldistrictcodes" item="lvWardCodeItem" open="(" separator="," close=")">
                    #{lvWardCodeItem}
                </foreach>
                <!-- å»¶ç»­æŠ¤ç†ä»»åŠ¡ï¼ˆservice_type='99')可以在患者还没出院时生成:
                     è¿™ç±»è®°å½•只有「在院维度」(hospitaldistrictcode / deptcode),出院维度是 NULL。
                     NULL ä¸åŒ¹é…ä»»ä½• IN,任务会「提示生成成功、列表里却查不到」,
                     æ‰€ä»¥å‡ºé™¢ç»´åº¦ä¸ºç©ºæ—¶ç”¨åŒä¸€å¥—编码体系的在院维度兜底。 -->
                OR (service_type = '99' AND (leavehospitaldistrictcode IS NULL OR leavehospitaldistrictcode = '')
                    AND hospitaldistrictcode IN
                    <foreach collection="leavehospitaldistrictcodes" item="lvWardCodeItem" open="(" separator="," close=")">
                        #{lvWardCodeItem}
                    </foreach>)
                )
            </if>
            <if test="(leavehospitaldistrictcodes != null and leavehospitaldistrictcodes.size() > 0)
                      and (leaveldeptcodes != null and leaveldeptcodes.size() > 0)">
                OR
            </if>
            <if test="leaveldeptcodes != null and leaveldeptcodes.size() > 0">
                (
                leaveldeptcode IN
                <foreach collection="leaveldeptcodes" item="lvDeptCodeItem" open="(" separator="," close=")">
                    #{lvDeptCodeItem}
                </foreach>
                OR (service_type = '99' AND (leaveldeptcode IS NULL OR leaveldeptcode = '')
                    AND deptcode IN
                    <foreach collection="leaveldeptcodes" item="lvDeptCodeItem" open="(" separator="," close=")">
                        #{lvDeptCodeItem}
                    </foreach>)
                )
            </if>
            )
        </if>
@@ -684,6 +723,26 @@
        <if test="operatorNo != null  and operatorNo != ''">and operator_no = #{operatorNo}</if>
        <if test="wechat != null  and wechat != ''">and wechat = #{wechat}</if>
        <if test="hospType != null  and hospType != ''">and hosp_type = #{hospType}</if>
        <!--
          2026-11:重要性标记筛选(对应 service_subtask.importance_flag_code,建任务时取自
          pat_med_inhosp.importance_flag_code)。两种写法:
            â‘  ç²¾ç¡®å•值  importanceFlagCode = 'FH0165.01'(或描述口径 '日间手术')
            â‘¡ ç²¾ç¡®å¤šå€¼  importanceFlagCodes = ['FH0165.01','FH0165.02']
          è¯¥åˆ—采集时就被拼成**描述串**(ImportFlagEnum çš„ desc),多值用英文逗号拼接,
          å¦‚ '无,日间手术'(见 ServiceSLTDHealthcareRecordServiceImpl#hospitalizedApply)——
          ç­‰å€¼/IN åªå‘½ä¸­å•值行;多值行(现场仅 7 æ¡ï¼Œéƒ½åœ¨å‡ºé™¢è®°å½•上)要筛全需自行写
          find_in_set。两种口径并存(有库存枚举编码、有库存中文描述),传什么按什么精确比,
          ä¸åšå€¼åŸŸå½’一。
        -->
        <if test="importanceFlagCode != null  and importanceFlagCode != ''">
            and importance_flag_code = #{importanceFlagCode}
        </if>
        <if test="importanceFlagCodes != null and importanceFlagCodes.size() > 0">
            AND importance_flag_code IN
            <foreach collection="importanceFlagCodes" item="impFlagItem" open="(" separator="," close=")">
                #{impFlagItem}
            </foreach>
        </if>
        <if test="libtemplateid != null ">and libtemplateid = #{libtemplateid}</if>
        <if test="libtemplatename != null ">and libtemplatename = #{libtemplatename}</if>
        <if test="openid != null ">and openid = #{openid}</if>
@@ -1172,6 +1231,8 @@
            <if test="hospitaldistrictname != null  and hospitaldistrictname != ''">hospitaldistrictname,</if>
            <if test="deptcode != null  and deptcode != ''">deptcode,</if>
            <if test="deptname != null  and deptname != ''">deptname,</if>
            <!-- 2026-11:重要性标记编码(日间手术/日间诊疗…),建任务时从 pat_med_inhosp åŒæ­¥ -->
            <if test="importanceFlagCode != null  and importanceFlagCode != ''">importance_flag_code,</if>
            <if test="labelstatus != null">labelstatus,</if>
            <if test="updateBy != null">update_by,</if>
            <if test="updateTime != null">update_time,</if>
@@ -1281,6 +1342,7 @@
            <if test="hospitaldistrictname != null  and hospitaldistrictname != ''">#{hospitaldistrictname},</if>
            <if test="deptcode != null  and deptcode != ''">#{deptcode},</if>
            <if test="deptname != null  and deptname != ''">#{deptname},</if>
            <if test="importanceFlagCode != null  and importanceFlagCode != ''">#{importanceFlagCode},</if>
            <if test="labelstatus != null">#{labelstatus},</if>
            <if test="updateBy != null">#{updateBy},</if>
            <if test="updateTime != null">#{updateTime},</if>
smartor/src/main/java/com/smartor/service/impl/PatMedInhospServiceImpl.java
@@ -828,6 +828,9 @@
        serviceSubtask.setLeaveicd10code(patMedInhosp1.getLeaveicd10code());
        serviceSubtask.setLeavediagname(patMedInhosp1.getLeavediagname());
        serviceSubtask.setDiagname(patMedInhosp1.getDiagname());
        // 2026-11:重要性标记(含「日间」)随任务走,与 ruoyi-inhospvisit çš„口径一致。
        // æœ¬æ¡é“¾è·¯æ˜¯ã€Œäººå·¥æ–°å¢žéšè®¿ / ç–¾ç—…维度」仍在用的遗留实现。
        serviceSubtask.setImportanceFlagCode(patMedInhosp1.getImportanceFlagCode());
        serviceSubtask.setTemplateid(serviceTask.getTemplateid());
        serviceSubtask.setTemplatename(serviceTask.getTemplatename());
        serviceSubtask.setPatid(patArchive.getId());
@@ -933,6 +936,8 @@
        serviceSubtask.setLeavehospitaldistrictname(patMedInhosp1.getLeavehospitaldistrictname());
        serviceSubtask.setLeaveicd10code(patMedInhosp1.getLeaveicd10code());
        serviceSubtask.setLeavediagname(patMedInhosp1.getLeavediagname());
        // 2026-11:重要性标记(含「日间」)随任务走(口径同上)
        serviceSubtask.setImportanceFlagCode(patMedInhosp1.getImportanceFlagCode());
        serviceSubtask.setTemplateid(serviceTask.getTemplateid());
        serviceSubtask.setTemplatename(serviceTask.getTemplatename());