liusheng
10 小时以前 c24d16a37523a49080392610357872ce580cbc38
ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/support/VisitSubtaskFactory.java
@@ -48,6 +48,13 @@
 * 方案原计划叫 {@code VisitSubtaskFactory} 并同时承载 {@code writeInSubTask}。
 * 实际实现时把它收窄为"纯组装 + 纯工具",因为 {@code writeInSubTask}(232 行)里有大量
 * 写库与去重编排,混在一起会让本类的 A 档逐行等价探针失去意义。
 *
 * <h3>⚠️ 唯一的"非搬运"行:{@code hospno}</h3>
 * {@link #boxedServiceSubtask} 里多了一句 {@code d.setHospno(inhosp.getInhospno())}。
 * 原实现确实<b>没有</b>这一句,所以出院链路的 {@code service_subtask.hospno} 一直落空;
 * 而 {@code ServiceSubtask.hospno} 的语义就是"就诊编号(对应的 outhospno、inhospno)"。
 * 这是<b>有意补齐</b>,不是抄漏 —— 反向探针({@code verify_inhospvisit_boxed_fields.py})
 * 只校验"原 setter 是否都有对应调用",不会因此报错。
 */
@Slf4j
@Component
@@ -104,16 +111,32 @@
        d.setNurseId(inhosp.getNurseId());
        d.setNurseName(inhosp.getNurseName());
        d.setInhospid(inhosp.getInhospid());
        // ⚠️ 这一行是【补的】,不是搬运:
        //   原 boxedServiceSubtask 从未设 hospno,而 ServiceSubtask.hospno 的语义是
        //   "就诊编号(对应的 outhospno、inhospno)"(见 ServiceSubtask 字段注释)。
        //   结果就是出院链路的 service_subtask.hospno 一直是 NULL,与门诊链路不一致。
        //   取值:pat_med_inhosp.inhospno(门诊侧取 pat_med_outhosp.outhospno,见 OuthospSubtaskDraft)。
        d.setHospno(inhosp.getInhospno());
        d.setDrcode(inhosp.getDrcode());
        d.setDrname(inhosp.getDrname());
        d.setDeptcode(inhosp.getLeaveldeptcode());
        d.setDeptname(inhosp.getLeaveldeptname());
        d.setLeaveldeptcode(inhosp.getLeaveldeptcode());
        d.setLeaveldeptname(inhosp.getLeaveldeptname());
        d.setLeavehospitaldistrictcode(inhosp.getLeavehospitaldistrictcode());
        d.setLeavehospitaldistrictname(inhosp.getLeavehospitaldistrictname());
        // ---- 2026-11 新增:在院维度落「复用列」 ----
        //   背景:service_subtask 的 deptcode/deptname 改名 leaveldeptcode/leaveldeptname,
        //         原 sendlimitabegin/aend、sendlimitpbegin/pend 四个空列复用为
        //         hospitaldistrictcode/name(在院病区)、deptcode/name(在院科室)。
        //   口径:出院维度仍按原写法落 leavel*(下面 type 4/5 的覆盖也保持原样,落库位置不变),
        //         这里只是把 pat_med_inhosp 的「在院科室 / 在院病区」额外存一份,便于按在院维度统计。
        d.setDeptcode(inhosp.getDeptcode());
        d.setDeptname(inhosp.getDeptname());
        d.setHospitaldistrictcode(inhosp.getHospitaldistrictcode());
        d.setHospitaldistrictname(inhosp.getHospitaldistrictname());
        // ---- 原 L1128-1134:type 4/5 改用入院维度 ----
        if (type != null && (type == 4 || type == 5)) {
            d.setDeptcode(inhosp.getDeptcode());
            d.setDeptname(inhosp.getDeptname());
            d.setLeaveldeptcode(inhosp.getDeptcode());
            d.setLeaveldeptname(inhosp.getDeptname());
            d.setLeavehospitaldistrictcode(inhosp.getHospitaldistrictcode());
            d.setLeavehospitaldistrictname(inhosp.getHospitaldistrictname());
        }
@@ -253,8 +276,13 @@
        d.setInhospid(inhosp.getInhospid());
        d.setDrcode(inhosp.getDrcode());
        d.setDrname(inhosp.getDrname());
        d.setDeptcode(inhosp.getLeaveldeptcode());
        d.setDeptname(inhosp.getLeaveldeptname());
        d.setLeaveldeptcode(inhosp.getLeaveldeptcode());
        d.setLeaveldeptname(inhosp.getLeaveldeptname());
        // 2026-11:入院/在院维度落「复用列」(口径同 boxedServiceSubtask)
        d.setDeptcode(inhosp.getDeptcode());
        d.setDeptname(inhosp.getDeptname());
        d.setHospitaldistrictcode(inhosp.getHospitaldistrictcode());
        d.setHospitaldistrictname(inhosp.getHospitaldistrictname());
        d.setLeavehospitaldistrictcode(inhosp.getLeavehospitaldistrictcode());
        d.setLeavehospitaldistrictname(inhosp.getLeavehospitaldistrictname());
        // ---- 原 L1242-1251 ----