liusheng
8 天以前 34f78281cf395a24e1f3f1c3b861186ff8a03b7b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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 —— 出入院随访模块自带。
 *
 * <h3>⚠️ 与 smartor 的 {@code PatMedInhospMapper} 是两套查询(本模块唯一真正的 SQL 重复)</h3>
 * 同一张表、两套 SQL,理由见 {@link VisitInhospRow} 的类注释。纪律:
 * <ul>
 *   <li>两边的 SQL 必须<b>逐条等价</b>;</li>
 *   <li>由 {@code sql/_probe/verify_inhospvisit_sql_expansion.py} 把两边的 WHERE/GROUP BY/ORDER BY
 *       动态展开后逐条比对(AND 顺序无关、{@code #{}}→{@code ?}、列清单折叠);</li>
 *   <li>由 {@code sql/_probe/verify_inhospvisit_mapper.py} 校验接口方法↔XML statement 一一对应;</li>
 *   <li><b>改任一边必须同步改另一边</b>,并重跑这两个探针。</li>
 * </ul>
 *
 * <h3>方法对应的原实现(@ b25c3b51)</h3>
 * <table border="1">
 *   <tr><th>本方法</th><th>原调用点</th></tr>
 *   <tr><td>{@link #selectForScan}</td><td>{@code PatMedInhospServiceImpl} L329/458/527/1195/1328/1438/1529/1598
 *       (都是 {@code selectPatMedInhospList})</td></tr>
 *   <tr><td>{@link #selectByInhospid}</td><td>L356/399/480/632/1409/1480/1505/1572/1632/1867/1915/1955/1968
 *       (都是 {@code selectPatMedInhospByInhospid})</td></tr>
 *   <tr><td>{@link #updateFlags}</td><td>{@code updatePatMedInhosp}(多处,只回写标志位与 reason)</td></tr>
 * </table>
 */
@Mapper
public interface VisitInhospMapper {
 
    /**
     * 随访扫描/按标志位过滤(原 {@code PatMedInhospMapper#selectPatMedInhospList})。
     * <p>
     * ⚠️ <b>必须逐字等价地保留原 SQL 的三处关键语义</b>:
     * <ol>
     *   <li>JOIN {@code pat_archive} 且要求 {@code a.del_flag = 0}、{@code b.del_flag = 0}、
     *       {@code a.idcardno IS NOT NULL} —— 这三个条件决定"谁会被扫到";</li>
     *   <li>{@code GROUP BY b.inhospid, a.age, a.age_unit, a.telcode, a.id, a.sex} —— 去重语义;</li>
     *   <li>排序:{@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}。
     *       <b>顺序会影响处理次序与最终结果</b>(尤其再入院停机逻辑),不能简化。</li>
     * </ol>
     *
     * @param query 过滤条件(随访侧只用到 flag / inhospstate / fuflag / orgid / cry / bedSort / patid 等)
     * @return 匹配行
     */
    List<VisitInhospRow> selectForScan(VisitInhospRow query);
 
    /**
     * 按主键查(原 {@code PatMedInhospMapper#selectPatMedInhospByInhospid})。
     *
     * @param inhospid 出入院记录ID
     * @return 记录行;不存在返回 {@code null}
     */
    VisitInhospRow selectByInhospid(@Param("inhospid") Long inhospid);
 
    /**
     * 只回写随访标志位与 {@code long_task_reason}(原 {@code updatePatMedInhosp} 的随访用途子集)。
     * <p>
     * ⚠️ <b>刻意不做成"全字段动态更新"</b>:原 {@code updatePatMedInhosp} 有近百个
     * {@code <if test="xxx != null">},调用方传什么就更新什么。随访侧只写这几列,
     * 所以这里显式列出,避免"传了个半满的实体导致某些列被意外写空/漏写"。
     * <p>
     * 传入的 {@code reason} 为 null 时<b>不改动</b> {@code long_task_reason}(与原 {@code <if>} 一致)。
     *
     * @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 <choose>} 展开成常量列名,不做字符串拼接)
     * @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)。
     * <p>
     * 原实现是在同一个"整实体动态更新"里顺手写 remark 的:
     * <pre>
     * if (StringUtils.isNotEmpty(remark)) {
     *     updateObj.setRemark(remark + " (type=" + type + ")");
     * }
     * patMedInhospMapper.updatePatMedInhosp(updateObj);
     * </pre>
     * 因为 {@code updatePatMedInhosp} 是"每个字段各自 {@code <if test="xxx != null">}",
     * 所以拆成两次 update(flag 一次、remark 一次)与原来的"一次整实体更新"在结果上等价。
     *
     * @param inhospid 出入院记录ID
     * @param remark   新的备注(覆盖式)
     * @return 影响行数
     */
    int updateRemark(@Param("inhospid") Long inhospid, @Param("remark") String remark);
}