package com.ruoyi.inhospvisit.mapper; import com.ruoyi.inhospvisit.domain.row.VisitInhospRow; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import java.util.List; /** * 出入院记录({@code pat_med_inhosp})随访侧 Mapper —— 出入院随访模块自带。 * *

⚠️ 与 smartor 的 {@code PatMedInhospMapper} 是两套查询(本模块唯一真正的 SQL 重复)

* 同一张表、两套 SQL,理由见 {@link VisitInhospRow} 的类注释。纪律: * * *

方法对应的原实现(@ b25c3b51)

* * * * * *
本方法原调用点
{@link #selectForScan}{@code PatMedInhospServiceImpl} L329/458/527/1195/1328/1438/1529/1598 * (都是 {@code selectPatMedInhospList})
{@link #selectByInhospid}L356/399/480/632/1409/1480/1505/1572/1632/1867/1915/1955/1968 * (都是 {@code selectPatMedInhospByInhospid})
{@link #updateFlags}{@code updatePatMedInhosp}(多处,只回写标志位与 reason)
*/ @Mapper public interface VisitInhospMapper { /** * 随访扫描/按标志位过滤(原 {@code PatMedInhospMapper#selectPatMedInhospList})。 *

* ⚠️ 必须逐字等价地保留原 SQL 的三处关键语义: *

    *
  1. JOIN {@code pat_archive} 且要求 {@code a.del_flag = 0}、{@code b.del_flag = 0}、 * {@code a.idcardno IS NOT NULL} —— 这三个条件决定"谁会被扫到";
  2. *
  3. {@code GROUP BY b.inhospid, a.age, a.age_unit, a.telcode, a.id, a.sex} —— 去重语义;
  4. *
  5. 排序:{@code cry=1/2/3} 时 {@code order by b.endtime desc}; * {@code cry=0} 时按 {@code bedSort} 三选一(含床位自然序的复杂表达式), * 默认 {@code order by b.starttime desc, b.bed_no asc}。 * 顺序会影响处理次序与最终结果(尤其再入院停机逻辑),不能简化。
  6. *
* * @param query 过滤条件(随访侧只用到 flag / inhospstate / fuflag / orgid / cry / bedSort / patid 等) * @return 匹配行 */ List selectForScan(VisitInhospRow query); /** * 按主键查(原 {@code PatMedInhospMapper#selectPatMedInhospByInhospid})。 * * @param inhospid 出入院记录ID * @return 记录行;不存在返回 {@code null} */ VisitInhospRow selectByInhospid(@Param("inhospid") Long inhospid); /** * 只回写随访标志位与 {@code long_task_reason}(原 {@code updatePatMedInhosp} 的随访用途子集)。 *

* ⚠️ 刻意不做成"全字段动态更新":原 {@code updatePatMedInhosp} 有近百个 * {@code },调用方传什么就更新什么。随访侧只写这几列, * 所以这里显式列出,避免"传了个半满的实体导致某些列被意外写空/漏写"。 *

* 传入的 {@code reason} 为 null 时不改动 {@code long_task_reason}(与原 {@code } 一致)。 * * @param inhospid 出入院记录ID * @param flagColumn 标志位列名,只允许 * {@code deptcheck_flag} / {@code wardcheck_flag} / {@code diagcheck_flag} / * {@code medcheck_flag} / {@code in_deptcheck_flag} / {@code in_wardcheck_flag} / * {@code schedulecheck_flag} * (白名单在 Service 层校验,SQL 里用 {@code } 展开成常量列名,不做字符串拼接) * @param flagValue 标志位值("0" / "1" / "2" …) * @param reason {@code long_task_reason} 的新值;null = 不改动 * @return 影响行数 */ int updateFlags(@Param("inhospid") Long inhospid, @Param("flagColumn") String flagColumn, @Param("flagValue") String flagValue, @Param("reason") String reason); /** * 只回写 {@code remark}(原 {@code updateCheckFlag} 的附带动作,L1680-1683)。 *

* 原实现是在同一个"整实体动态更新"里顺手写 remark 的: *

     * if (StringUtils.isNotEmpty(remark)) {
     *     updateObj.setRemark(remark + " (type=" + type + ")");
     * }
     * patMedInhospMapper.updatePatMedInhosp(updateObj);
     * 
* 因为 {@code updatePatMedInhosp} 是"每个字段各自 {@code }", * 所以拆成两次 update(flag 一次、remark 一次)与原来的"一次整实体更新"在结果上等价。 * * @param inhospid 出入院记录ID * @param remark 新的备注(覆盖式) * @return 影响行数 */ int updateRemark(@Param("inhospid") Long inhospid, @Param("remark") String remark); }