| | |
| | | * {@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> |
| | |
| | | // 以下字段【不是 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";其它值走默认排序。 |
| | |
| | | * 床位按自然序排(空床位最后 → 纯数字按数值 → 带字母按长度+字符串 → 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; |
| | |
| | | /** 过滤:离院 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; |
| | | } |
| | | |
| | |
| | | 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; |
| | | } |