liusheng
4 天以前 0bbbd746e8c39d91ad7b47a4e36e29ab972dc98c
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
package com.ruoyi.inhospvisit.api;
 
import com.ruoyi.common.core.service.dto.PatMedReq;
import com.ruoyi.common.core.service.dto.PatMedRes;
import com.ruoyi.inhospvisit.domain.PatMedInhosp;
import com.ruoyi.inhospvisit.domain.PatMedInhospDTO;
import com.ruoyi.inhospvisit.domain.PatMedInhospVO;
 
import java.util.Date;
import java.util.List;
import java.util.Map;
 
/**
 * 出入院模块对外<b>基础出入院信息</b>数据访问契约。
 *
 * <h3>为什么单独一个契约,而不是塞进 {@link InhospVisitApi}</h3>
 * 两者管辖范围不同:
 * <ul>
 *   <li>{@link InhospVisitApi} —— <b>随访业务能力</b>(生成任务/子任务、滚动任务组周期、
 *       宣教回调)。受 {@code sys_config} 的 {@code inhospvisit.enabled} 开关管辖,
 *       关闭后各方法返回安全空值。</li>
 *   <li>{@link InhospVisitDataService}(本接口)—— <b>基础出入院信息的读写</b>,
 *       即 {@code pat_med_inhosp} 这一张表的增删改查。
 *       <b>刻意不受随访开关管辖</b>:HIS 采集({@code CollectHISServiceImpl})与
 *       档案汇聚({@code HNGatherPatArchiveServiceImpl})都依赖它写入院记录,
 *       若把开关一并套上,关闭随访生成会连带让数据采集瘫痪 —— 那是两件事。</li>
 * </ul>
 *
 * <h3>独占边界(本次改造的目标)</h3>
 * {@code PatMedInhospMapper} 与其 1181 行 XML 已搬入本模块,
 * 其它模块<b>不得</b>再直接注入该 Mapper;一律经由本契约访问。
 * 这样"出入院信息只有一处实现"成为编译期可验证的事实。
 *
 * <h3>⚠️ 与原 Mapper 的语义一致性</h3>
 * 本契约的每个方法都是 {@code PatMedInhospMapper} 对应方法的<b>纯转发</b>:
 * 不加工参数、不补默认值、不改时间戳(调用方原本就自行 {@code setCreateTime} 等),
 * 因此逐方法语义与搬迁前完全一致。
 */
public interface InhospVisitDataService {
 
    // ==================== 查询 ====================
 
    /**
     * 按主键查询出入院记录。
     *
     * @param inhospid 出入院记录主键
     * @return 记录,不存在返回 {@code null}
     */
    PatMedInhosp selectPatMedInhospByInhospid(Long inhospid);
 
    /**
     * 按实体字段做等值条件查询。
     *
     * @param patMedInhosp 查询条件(非 null 字段参与过滤)
     * @return 记录集合,无匹配返回空集合
     */
    List<PatMedInhosp> selectPatMedInhosp(PatMedInhosp patMedInhosp);
 
    /**
     * 按患者编号 + 出院日期查询出院记录(出院时间只比较到天)。
     *
     * @param patno    患者编号
     * @param dayStart 查询日期当天 00:00:00
     * @param dayEnd   查询日期的次日 00:00:00
     * @return 出院记录集合,按 inhospid 倒序
     */
    List<PatMedInhosp> selectOutInhospByPatnoAndOutDate(String patno, Date dayStart, Date dayEnd);
 
    /**
     * 查询患者标签(单患者,GROUP_CONCAT 拼接)。
     *
     * @param patid 患者档案id
     * @return 标签串,无标签返回 {@code null}
     */
    String getTagnameBypatid(Long patid);
 
    /**
     * 批量查询患者标签。
     *
     * @param patids 患者档案id集合,调用方须保证非空且已去重
     * @return 每行含 {@code patid}、{@code tagname} 两个 key
     */
    List<Map<String, Object>> getTagnameByPatids(List<Long> patids);
 
    /**
     * 通用列表查询(最常用入口)。
     *
     * @param patMedInhosp 查询条件
     * @return 记录集合
     */
    List<PatMedInhosp> selectPatMedInhospList(PatMedInhosp patMedInhosp);
 
    /**
     * 按住院流水号查询。
     *
     * @param patMedInhosp 查询条件(含 serialnum)
     * @return 记录集合
     */
    List<PatMedInhosp> selectPatMedInhospListBySerialnum(PatMedInhosp patMedInhosp);
 
    /**
     * 查询某机构下全部在院记录("在院信息刷新"的取数入口)。
     * <p>
     * 只查 {@code pat_med_inhosp} 自身、只取刷新要用的列(inhospid / serialnum / orgid /
     * campusid / 科室三列 / 病区三列 / bed_no),<b>不 join 档案表、不按证件号过滤</b> ——
     * 否则证件号未补全的在院患者会被静默漏刷新。
     * <p>
     * 在院口径:{@code inhospstate='0' and del_flag='0'}(与门户"在院患者"列表一致,
     * 实测在院行 endtime 恒为 null)。
     *
     * @param orgid 机构ID(如 20001001)
     * @return 在院记录集合,按 inhospid 升序;无数据返回空集合
     */
    List<PatMedInhosp> selectInhospRefreshCandidates(String orgid);
 
    /**
     * 按 VO 条件查询(支持多科室/多病区集合条件)。
     *
     * @param patMedInhospVO 查询条件
     * @return 记录集合
     */
    List<PatMedInhosp> selectPatMedInhospListByCondition(PatMedInhospVO patMedInhospVO);
 
    /**
     * 出院/入院人数与随访人次统计(首页 ECharts 用)。
     *
     * @param patMedReq 统计条件
     * @return 统计结果
     */
    PatMedRes selectPatMedInhospCount(PatMedReq patMedReq);
 
    /**
     * 查询三个维度里任意一个仍未处理的出院患者。
     *
     * @return 待处理记录集合
     */
    List<PatMedInhosp> selectNeedProcessList();
 
    /**
     * 查询患者住院记录(通过入院申请单信息),返回 DTO 列表。
     * <p>
     * ⚠️ <b>本方法原样保留了一个原代码缺陷</b>,未做修正:
     * <pre>
     * List&lt;PatMedInhosp&gt; rows = selectPatMedInhospList(query);
     * if (!CollectionUtils.isEmpty(rows)) {
     *     return null;          // ← 查到记录反而返回 null,条件写反了
     * }
     * </pre>
     * 后果:查到记录时恒返回 {@code null};查不到记录时返回空列表。
     * 也就是说<b>原实现里那段"给每条记录补 finishFlag(是否宣教过)"的循环永远不会执行</b>,
     * 因此本方法不依赖 {@code service_subtask}(随访子任务表)。
     * <p>
     * 若将来要修这个缺陷,除了把条件改成 {@code isEmpty},还需要恢复那段补
     * {@code finishFlag} 的逻辑(判据:该患者是否存在 {@code service_type="4"} 的子任务),
     * 届时需要给本模块补一个查询子任务的能力。
     * <p>
     * 前端当前<b>没有</b>调用该端点(已核对 {@code smartor-web/src})。
     *
     * @param patMedInhosp 查询条件
     * @return 见上;缺陷保留,故查到记录时为 {@code null}
     */
    List<PatMedInhospDTO> selectPatMedInhospByApplication(PatMedInhosp patMedInhosp);
 
    // ==================== 写入 ====================
 
    /**
     * 新增出入院记录。
     *
     * @param patMedInhosp 记录({@code createTime}/{@code updateTime} 由调用方设置,
     *                     本方法不代填 —— 与搬迁前一致)
     * @return 影响行数
     */
    int insertPatMedInhosp(PatMedInhosp patMedInhosp);
 
    /**
     * 批量新增出入院记录。
     *
     * @param list 记录集合
     * @return 影响行数
     */
    int insertPatMedInhospBatch(List<PatMedInhosp> list);
 
    /**
     * 修改出入院记录("传什么更新什么")。
     *
     * @param patMedInhosp 记录(须含主键)
     * @return 影响行数
     */
    int updatePatMedInhosp(PatMedInhosp patMedInhosp);
 
    /**
     * 按主键删除。
     *
     * @param inhospid 主键
     * @return 影响行数
     */
    int deletePatMedInhospByInhospid(Long inhospid);
 
    /**
     * 按住院编码删除。
     *
     * @param inhospno 住院编码
     * @return 影响行数
     */
    int deletePatMedInhospByInhospno(String inhospno);
 
    /**
     * 按主键集合批量删除。
     *
     * @param inhospids 主键集合
     * @return 影响行数
     */
    int deletePatMedInhospByInhospids(Long[] inhospids);
}