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} 的类注释。纪律:
*
* - 两边的 SQL 必须逐条等价;
* - 由 {@code sql/_probe/verify_inhospvisit_sql_expansion.py} 把两边的 WHERE/GROUP BY/ORDER BY
* 动态展开后逐条比对(AND 顺序无关、{@code #{}}→{@code ?}、列清单折叠);
* - 由 {@code sql/_probe/verify_inhospvisit_mapper.py} 校验接口方法↔XML statement 一一对应;
* - 改任一边必须同步改另一边,并重跑这两个探针。
*
*
* 方法对应的原实现(@ 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 的三处关键语义:
*
* - JOIN {@code pat_archive} 且要求 {@code a.del_flag = 0}、{@code b.del_flag = 0}、
* {@code a.idcardno IS NOT NULL} —— 这三个条件决定"谁会被扫到";
* - {@code GROUP BY b.inhospid, a.age, a.age_unit, a.telcode, a.id, a.sex} —— 去重语义;
* - 排序:{@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}。
* 顺序会影响处理次序与最终结果(尤其再入院停机逻辑),不能简化。
*
*
* @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);
}