liusheng
5 天以前 cc479e6a056785103996cc7ea67dbd5faa3e800e
ruoyi-inhospvisit/src/main/java/com/ruoyi/inhospvisit/domain/row/VisitInhospRow.java
@@ -16,6 +16,12 @@
 *       {@code sql/_probe/verify_inhospvisit_mapper.py}(接口↔XML 一致性)与
 *       {@code sql/_probe/verify_inhospvisit_sql_expansion.py}(展开后逐条比对,AND 顺序无关)
 *       双向把关。改任一边都必须同步改另一边并重跑这两个探针。</li>
 *   <li>⚠️ 还有一条更硬的纪律:<b>XML 里出现的每个属性,本类都必须有 getter</b>。
 *       因为"逐条等价"意味着 XML 保留了原文件的全部 {@code <if test=...>}(含随访链上
 *       不可达的那些),而 MyBatis 用 OGNL 求值这些 {@code test}——
 *       缺 getter 会直接抛 {@code ReflectionException}(不是"条件不成立")。
 *       2026-10 就是这么把 {@code dealOutHospInfo} 整条打停的(缺 {@code startOutHospTime}
 *       等 15 个过滤属性)。守卫:{@code sql/_probe/verify_mapper_ognl_params.py}(全仓)。</li>
 *   <li>另一种做法是把查询"包一层端口"委托回 smartor,但那样本模块就只剩编排逻辑、
 *       CRUD 全靠回调,反而更碎。这里选择了"重复但可验证"。</li>
 * </ul>
@@ -484,16 +490,31 @@
    // 以下字段【不是 pat_med_inhosp 的列】,只作为 selectForScan 的过滤条件/排序开关。
    // 放在同一个行对象里,是为了让"查询条件"与"结果行"共用一套属性名 ——
    // 与原实现"用 PatMedInhosp 当查询入参"的写法保持一致,避免两套类来回映射出错。
    //
    // ⚠️⚠️ 这一组【必须有 getter】,哪怕随访生成链上一个都不设它:
    //     `VisitInhospMapper.xml#selectForScan` 是从原 `PatMedInhospMapper.xml` 逐条照抄的,
    //     里面保留了原文件的全部 `<if test="xxx != null">`(含随访链上不可达的那些)。
    //     MyBatis 用 OGNL 求值 `test`,**读不到 getter 不是"条件不成立",而是直接抛**:
    //       ReflectionException: There is no getter for property named 'startOutHospTime'
    //       in 'class com.ruoyi.inhospvisit.domain.row.VisitInhospRow'
    //     后果是 `InhospVisitTaskService#dealOutHospInfo` 在第一次 `selectForScan` 就中断,
    //     一条随访任务都不生成(2026-10 实机踩到,`sys_job_log` 里表现为
    //     `InvocationTargetException`,很容易误判成模块开关没开)。
    //     守卫:`sql/_probe/verify_mapper_ognl_params.py`(全仓)
    //     (XML 引用属性 ⊆ 参数类 getter,缺一个就 FAIL)。
    // ==========================================================================
    /**
     * 出院/在院维度开关(原 {@code PatMedInhosp.cry}):
     * 0=在院({@code endtime is null})、1=已出院、2=转科、3=预入院。
     * <p>
     * ⚠️ 类型与原实体一致是 {@code Integer},因为 XML 里是**数值比较**
     * ({@code cry == 0/1/2/3})—— 写成 String 会让 OGNL 靠隐式转换去比,语义不明确。
     * <p>
     * ⚠️ 它同时决定排序:{@code cry=1/2/3} → {@code order by endtime desc};
     * {@code cry=0} → 按 {@link #bedSort} 三选一。
     */
    private String cry;
    private Integer cry;
    /**
     * 在院患者({@code cry=0})的床位排序方向:"asc" / "desc";其它值走默认排序。
@@ -502,6 +523,40 @@
     * 床位按自然序排(空床位最后 → 纯数字按数值 → 带字母按长度+字符串 → inhospid 兜底)。
     */
    private String bedSort;
    // ---- 时间区间过滤(原 PatMedInhospMapper.xml 的 4 个 <if>) ----
    /** 过滤:出院时间区间下界 */
    private Date startOutHospTime;
    /** 过滤:出院时间区间上界 */
    private Date endOutHospTime;
    /** 过滤:入院时间区间下界 */
    private Date startInHospTime;
    /** 过滤:入院时间区间上界 */
    private Date endInHospTime;
    // ---- 单值过滤(随访链不可达,但 XML 里保留了条件) ----
    /** 过滤:导诊挂号标识(原 {@code inhosp_myd_flag}) */
    private String inhospMydFlag;
    /** 过滤:床位号(原 {@code bed_no}) */
    private String bedNo;
    /** 过滤:离院方式ID */
    private String outWayId;
    /** 过滤:离院方式名称 */
    private String outWayName;
    /** 过滤:就诊来源ID */
    private String encounterSourceId;
    /** 过滤:重要程度代码 */
    private String importanceFlagCode;
    /** 过滤:急诊分级代码 */
    private String emergencyLevelCode;
    /** 过滤:医院名称(原 XML 里该列未加表别名) */
    private String hospitalname;
    /** 过滤:药品名称(省立同德药品宣教) */
    private String medicalName;
    /** 过滤:药品公司(省立同德药品宣教) */
    private String medicalCompany;
    /** 过滤:排班状态(原类型 {@code Long}) */
    private Long schemestatus;
    /** 过滤:离院科室编码列表(原 {@code leaveldeptcodes}) */
    private java.util.List<String> leaveldeptcodes;
@@ -514,11 +569,11 @@
    /** 过滤:离院 ICD10 编码列表(原 {@code icd10codeList}) */
    private java.util.List<String> icd10codeList;
    public String getCry() {
    public Integer getCry() {
        return cry;
    }
    public void setCry(String cry) {
    public void setCry(Integer cry) {
        this.cry = cry;
    }
@@ -530,6 +585,126 @@
        this.bedSort = bedSort;
    }
    public Date getStartOutHospTime() {
        return startOutHospTime;
    }
    public void setStartOutHospTime(Date startOutHospTime) {
        this.startOutHospTime = startOutHospTime;
    }
    public Date getEndOutHospTime() {
        return endOutHospTime;
    }
    public void setEndOutHospTime(Date endOutHospTime) {
        this.endOutHospTime = endOutHospTime;
    }
    public Date getStartInHospTime() {
        return startInHospTime;
    }
    public void setStartInHospTime(Date startInHospTime) {
        this.startInHospTime = startInHospTime;
    }
    public Date getEndInHospTime() {
        return endInHospTime;
    }
    public void setEndInHospTime(Date endInHospTime) {
        this.endInHospTime = endInHospTime;
    }
    public String getInhospMydFlag() {
        return inhospMydFlag;
    }
    public void setInhospMydFlag(String inhospMydFlag) {
        this.inhospMydFlag = inhospMydFlag;
    }
    public String getBedNo() {
        return bedNo;
    }
    public void setBedNo(String bedNo) {
        this.bedNo = bedNo;
    }
    public String getOutWayId() {
        return outWayId;
    }
    public void setOutWayId(String outWayId) {
        this.outWayId = outWayId;
    }
    public String getOutWayName() {
        return outWayName;
    }
    public void setOutWayName(String outWayName) {
        this.outWayName = outWayName;
    }
    public String getEncounterSourceId() {
        return encounterSourceId;
    }
    public void setEncounterSourceId(String encounterSourceId) {
        this.encounterSourceId = encounterSourceId;
    }
    public String getImportanceFlagCode() {
        return importanceFlagCode;
    }
    public void setImportanceFlagCode(String importanceFlagCode) {
        this.importanceFlagCode = importanceFlagCode;
    }
    public String getEmergencyLevelCode() {
        return emergencyLevelCode;
    }
    public void setEmergencyLevelCode(String emergencyLevelCode) {
        this.emergencyLevelCode = emergencyLevelCode;
    }
    public String getHospitalname() {
        return hospitalname;
    }
    public void setHospitalname(String hospitalname) {
        this.hospitalname = hospitalname;
    }
    public String getMedicalName() {
        return medicalName;
    }
    public void setMedicalName(String medicalName) {
        this.medicalName = medicalName;
    }
    public String getMedicalCompany() {
        return medicalCompany;
    }
    public void setMedicalCompany(String medicalCompany) {
        this.medicalCompany = medicalCompany;
    }
    public Long getSchemestatus() {
        return schemestatus;
    }
    public void setSchemestatus(Long schemestatus) {
        this.schemestatus = schemestatus;
    }
    public java.util.List<String> getLeaveldeptcodes() {
        return leaveldeptcodes;
    }