yxh
昨天 fce96ef468291fb9a0e6a4d34ab371315e9485d4
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
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
package cn.lihu.jh.module.ecg.dal.mysql.queue;
 
import cn.lihu.jh.framework.common.pojo.PageResult;
import cn.lihu.jh.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.lihu.jh.framework.mybatis.core.mapper.BaseMapperX;
import cn.lihu.jh.module.ecg.dal.dataobject.queue.QueueDO;
import cn.lihu.jh.module.ecg.dal.dataobject.queue.BedQueueStatisticDO;
import cn.lihu.jh.module.ecg.dal.dataobject.queue.QueueStatisticDO;
import org.apache.ibatis.annotations.*;
import cn.lihu.jh.module.ecg.controller.admin.queue.vo.*;
 
import java.util.List;
 
/**
 * 排队 Mapper
 *
 * @author 芋道源码
 */
@Mapper
public interface QueueMapper extends BaseMapperX<QueueDO> {
 
    default PageResult<QueueDO> selectPage(QueuePageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<QueueDO>()
                .eqIfPresent(QueueDO::getPatId, reqVO.getPatId())
                .likeIfPresent(QueueDO::getPatName, reqVO.getPatName())
                .eqIfPresent(QueueDO::getPatGender, reqVO.getPatGender())
                .eqIfPresent(QueueDO::getBookTimeslot, reqVO.getBookTimeslot())
                .eqIfPresent(QueueDO::getBookCheckType, reqVO.getBookCheckType())
                .eqIfPresent(QueueDO::getSeqNum, reqVO.getSeqNum())
                .inIfPresent(QueueDO::getStatus, reqVO.getStatus())
                .eqIfPresent(QueueDO::getPassed, reqVO.getPassed())
                .eqIfPresent(QueueDO::getExpired, reqVO.getExpired())
                .eqIfPresent(QueueDO::getRoomId, reqVO.getRoomId())
                .eqIfPresent(QueueDO::getBedNo, reqVO.getBedNo())
                .betweenIfPresent(QueueDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(QueueDO::getId));
    }
 
    @Select("SELECT max(seq_num) FROM lihu.queue")
    Integer getMaxSeqNum();
 
    @Select("SELECT * FROM lihu.queue where seq_num = #{seqNum}")
    @Results({
            @Result(property = "patDetails", column = "pat_details", typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler.class)
    })
    QueueDO getQueueItemBySeqNum(@Param("seqNum")Integer seqNum);
 
    @Select("SELECT * FROM lihu.queue where pat_id = #{patId} and book_check_type = #{bookCheckType}")
    @Results({
            @Result(property = "patDetails", column = "pat_details", typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler.class)
    })
    QueueDO getQueueByPatId(@Param("patId")String patId, @Param("bookCheckType")Integer bookCheckType);
 
    @Select("""
            <script>
                SELECT * FROM lihu.queue
                where room_id = #{roomId} and deleted = 0 and status in (
                 <foreach collection='statusList' separator=',' item='status'>
                   #{status} 
                 </foreach> )
                order by case
                           when status = 30 then 0
                           when status in (3, 5) then 1
                           else 2
                         end,
                         seq_num, book_timeslot
            </script>
            """)
    @Results({
            @Result(property = "patDetails", column = "pat_details", typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler.class)
    })
    List<QueueDO> getRoomQueueByStatus(@Param("roomId")Long roomId, @Param("statusList")List<Integer> statusList);
 
    /**
     * 大屏取数。
     * <p>
     * 排序规则(需求8):**就诊中(30) 置顶 → 过号(3/5) 与等候(10/15/20/12) 按排队序号 seq_num 升序混排**。
     * 原先用 {@code order by status desc},会把过号(3/5)排到每一列最底部,
     * 在 {@code overflow-y:auto} 的列里滚不到,等同于"过号不显示"。
     * <p>
     * 同时补上 {@code deleted = 0}:本方法是自定义 {@code @Select},
     * 会绕过 MyBatis-Plus 的 {@code @TableLogic} 逻辑删除过滤。
     */
    @Select("""
            <script>
                SELECT * FROM lihu.queue
                where deleted = 0 and status in (
                 <foreach collection='statusList' separator=',' item='status'>
                   #{status} 
                 </foreach> )
                order by case
                           when status = 30 then 0
                           when status in (3, 5) then 1
                           else 2
                         end,
                         seq_num, book_timeslot
            </script>
            """)
    @Results({
            @Result(property = "patDetails", column = "pat_details", typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler.class)
    })
    List<QueueDO> getBigScreenQueueByStatus(@Param("statusList")List<Integer> statusList);
 
    @Select("<script>" +
            "SELECT * FROM lihu.queue " +
            "where pat_id = #{patId} " +
            "  and book_check_type in (" +
            "    <foreach collection='arrCheckType' separator=',' item='checkType'>" +
            "      #{checkType} " +
            "    </foreach> )" +
            "  and TO_DAYS(book_date) = TO_DAYS(NOW()) " +
            "</script>")
    @Results({
            @Result(property = "patDetails", column = "pat_details", typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler.class)
    })
    List<QueueDO> getCurPatGivenCheckTypes(@Param("patId")String patId, @Param("arrCheckType")Integer[] arrCheckType);
 
    @Select("<script>" +
            "SELECT * FROM lihu.queue " +
            "where pat_id = #{patId} " +
            "  and book_check_type in (" +
            "    <foreach collection='arrCheckType' separator=',' item='_checkType'>" +
            "      #{_checkType} " +
            "    </foreach> ) " +
            "  and status = #{status} " +
            "  and TO_DAYS(book_date) = TO_DAYS(NOW()) " +
            "</script>")
    @Results({
            @Result(property = "patDetails", column = "pat_details", typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler.class)
    })
    List<QueueDO> getCurPatGivenCheckTypesAndStatus(@Param("patId")String patId, @Param("arrCheckType")Integer[] arrCheckType, @Param("status")Integer status);
 
    @Select("<script>" +
            "SELECT * FROM lihu.queue " +
            "where pat_id = #{patId} " +
            "  and book_check_type in (" +
            "    <foreach collection='arrCheckType' separator=',' item='_checkType'>" +
            "      #{_checkType} " +
            "    </foreach> ) " +
            "  and status in (" +
            "    <foreach collection='statusList' separator=',' item='_status'>" +
            "      #{_status} " +
            "    </foreach> ) " +
            "  and TO_DAYS(book_date) = TO_DAYS(NOW()) " +
            "</script>")
    @Results({
            @Result(property = "patDetails", column = "pat_details", typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler.class)
    })
    List<QueueDO> getCurPatGivenCheckTypesAndStatusList(@Param("patId")String patId, @Param("arrCheckType")Integer[] arrCheckType, @Param("statusList")List<Integer> statusList);
 
    @Select("<script>" +
            "SELECT * FROM lihu.queue " +
            "where id >= #{from} and status in (" +
            " <foreach collection='statusList' separator=',' item='status'>" +
            "  #{status} " +
            " </foreach> )" +
            " limit #{size} " +
            " order by id" +
            "</script>")
    @Results({
            @Result(property = "patDetails", column = "pat_details", typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler.class)
    })
    List<QueueDO> getPartialQueueByStatus( @Param("statusList")List<Integer> statusList, @Param("from") Integer from, @Param("size") Integer size);
 
    @Select("<script>" +
            "SELECT count(1) as total_in_status FROM lihu.queue where status in (" +
            " <foreach collection='statusList' separator=',' item='status'>" +
            "  #{status} " +
            " </foreach> );" +
            "</script>")
    Integer statusStatistic(@Param("statusList")List<Integer> statusList);
 
    @Select("<script>" +
            "SELECT count(1) as total_in_status FROM lihu.queue where " +
            " deleted = 0 and book_date = CURDATE() and " +
            " status in ( " +
            " <foreach collection='statusList' separator=',' item='status'>" +
            "  #{status} " +
            " </foreach> ) " +
            " and book_check_type in ( " +
            " <foreach collection='checkTypes' separator=',' item='checkType'>" +
            "  #{checkType} " +
            " </foreach> ) " +
            "</script>")
    Integer checkTypeAndStatusStatistic( @Param("checkTypes")Integer[] checkTypes, @Param("statusList")List<Integer> statusList );
 
    @Select("<script>" +
            "SELECT room_id, bed_no, count(1) as total_in_status FROM lihu.queue where status in (" +
            " <foreach collection='statusList' separator=',' item='status'>" +
            " #{status} " +
            " </foreach> )" +
            " group by room_id, bed_no; "
            +"</script>")
    List<QueueStatisticDO> queueStatistic(@Param("statusList")List<Integer> statusList);
 
    @Select("<script>" +
            "SELECT status, count(1) as total_in_status FROM lihu.queue where " +
            " deleted = 0 and book_date = CURDATE() and " +
            " room_id = #{roomId} and bed_no = #{bedNo} " +
            " group by status " +
            "</script>")
    List<BedQueueStatisticDO> bedQueueStatistic(@Param("roomId")Long roomId, @Param("bedNo")String bedNo);
 
    @Select("<script>" +
            "SELECT status, count(1) as total_in_status FROM lihu.queue where " +
            " deleted = 0 and book_date = CURDATE() and " +
            " room_id = #{roomId} " +
            " group by status " +
            "</script>")
    List<BedQueueStatisticDO> roomQueueStatistic(@Param("roomId")Long roomId);
 
    @Select("<script>" +
            "SELECT count(1) FROM lihu.queue " +
            "where deleted = 0 and book_date = CURDATE() and " +
            " room_id = #{roomId} and bed_no = #{bedNo} and status in (" +
            " <foreach collection='statusList' separator=',' item='status'>" +
            "   #{status} " +
            " </foreach> )" +
            "</script>")
    Integer bedQueueStatisticByStatus(@Param("roomId")Long roomId, @Param("bedNo")String bedNo, @Param("statusList")List<Integer> statusList);
 
    @Select("""
            <script>
                SELECT * FROM lihu.queue 
                where deleted = 0 and room_id = #{roomId} and bed_no = #{bedNo} and status in (
                  <foreach collection='statusList' separator=',' item='status'>
                    #{status} 
                  </foreach> ) 
                order by status desc, seq_num, book_timeslot 
            </script>
            """)
    @Results({
            @Result(property = "patDetails", column = "pat_details", typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler.class)
    })
    List<QueueDO> getBedQueueByStatus(@Param("roomId")Long roomId, @Param("bedNo")String bedNo, @Param("statusList")List<Integer> statusList);
 
    @Select("""
            SELECT * from lihu.queue where room_id = #{roomId} and bed_no = #{bedNo}
               and status = #{curStatus} order by seq_num, book_timeslot limit 1
            """)
    QueueDO getBedFirstQueueItemByStatus(@Param("roomId")Long roomId, @Param("bedNo")String bedNo, @Param("curStatus")Integer curStatus);
 
    /**
     * 【需求2 相关缺陷修复】按「工位 + 患者 + 检查类型 + 状态」**精确**定位队列行。
     * <p>
     * 用于替代 {@link #getBedFirstQueueItemByStatus}:后者只按"工位 + 状态取 seq_num 最小的一条",
     * 当医生先点"放弃检查"(会把该患者置为 40)后再点"检查完成"时,
     * 会取到**下一位患者**并把他误置为已完成(详见 DevRentServiceImpl.routineFinishOperation)。
     */
    @Select("""
            SELECT * from lihu.queue
            where room_id = #{roomId} and bed_no = #{bedNo}
              and status = #{curStatus}
              and pat_id = #{patId}
              and book_check_type = #{checkType}
              and TO_DAYS(book_date) = TO_DAYS(NOW())
            order by seq_num limit 1
            """)
    @Results({
            @Result(property = "patDetails", column = "pat_details", typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler.class)
    })
    QueueDO getBedQueueItemByPatAndStatus(@Param("roomId")Long roomId, @Param("bedNo")String bedNo,
                                          @Param("patId")String patId, @Param("checkType")Integer checkType,
                                          @Param("curStatus")Integer curStatus);
 
    /**
     * 按工位 + 状态 + 今日取**最近更新**的一条。
     * <p>
     * 比「seq_num 最小」更贴合"当前正在就诊/装机的那位患者":seq_num 最小是本时段最早排队的,
     * 而 update_time 最新才是刚被叫号推进到该状态的。
     */
    @Select("""
            SELECT * from lihu.queue
            where room_id = #{roomId} and bed_no = #{bedNo}
              and status = #{curStatus}
              and TO_DAYS(book_date) = TO_DAYS(NOW())
            order by update_time desc, seq_num limit 1
            """)
    @Results({
            @Result(property = "patDetails", column = "pat_details", typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler.class)
    })
    QueueDO getBedLatestQueueItemByStatus(@Param("roomId")Long roomId, @Param("bedNo")String bedNo,
                                          @Param("curStatus")Integer curStatus);
 
    @Select("""
            SELECT * from lihu.queue where apply_no = #{applyNo} and status = #{curStatus}  order by seq_num, book_timeslot limit 1
            """)
    QueueDO getBedFirstQueueItemByApplyNo(@Param("applyNo")String applyNo, @Param("curStatus")Integer curStatus);
 
    // 某个诊室范围内 [已领用] [已召回-安装] 人员 抢占, 会更新 [工位号]
    // 没有限定检查类型,不要使用时间槽
    @Select("<script> " +
            "select * from lihu.queue where room_id = #{roomId} and status in ( " +
            "       <foreach collection='curStatusList' separator=',' item='status'>" +
            "           #{status} " +
            "       </foreach> )" +
            "       order by seq_num, book_timeslot limit 1 " +
            "</script>" )
    QueueDO getRoomFirstQueueItemByStatus(@Param("roomId")Long roomId, @Param("curStatusList")List<Integer> curStatusList);
 
    @Select("<script> " +
            "select * from lihu.queue where appoint_id in ( " +
            "       <foreach collection='appointIdList' separator=',' item='appointId'>" +
            "           #{appointId} " +
            "       </foreach> )" +
            "</script>" )
    List<QueueDO> selectBookSeqNumByAppointIdList(@Param("appointIdList") List<Long> appointIdList);
 
/*
    @Select("select * from lihu.queue where room_id = #{roomId} and bed_no = #{bedNo} " +
            " and status = #{curStatus} and pat_id = #{patId} and book_check_type=#{checkType}")
    QueueDO XXX(@Param("roomId")Long roomId, @Param("bedNo")String bedNo,
                                       @Param("patId")String patId, @Param("checkType")Integer checkType,
                                       @Param("curStatus")Integer curStatus);
*/
 
    @Update("update lihu.queue set status = #{newStatus} where pat_id = #{patId} and book_check_type = #{checkType} and status = #{curStatus}; " )
    Integer updatePatientQueueStatus(@Param("patId")String patId, @Param("checkType")Integer checkType, @Param("curStatus")Integer curStatus, @Param("newStatus")Integer newStatus);
 
    @Update("update lihu.queue set status = #{newStatus} where status = #{curStatus} and seq_num = \n" +
            "(select a.min_seq_num from \n" +
            " (select min(seq_num) as min_seq_num from lihu.queue where room_id = #{roomId} and bed_no = #{bedNo} and status = #{curStatus}) a )")
    Integer updateBedQueueStatus(@Param("roomId")Long roomId, @Param("bedNo")String bedNo, @Param("curStatus")Integer curStatus, @Param("newStatus")Integer newStatus);
 
    // 弃用原因:需要先获取,判断逻辑处理后,再更新
    // 某个诊室范围内 [已领用] [已召回-安装] 人员 抢占, 会更新 [工位号]
    // 没有限定检查类型,不要使用时间槽
    @Update("<script> " +
            "update lihu.queue set status = #{newStatus}, bed_no = #{bedNo} where id = \n" +
            "  (select a.id from \n" +
            "    (select id from lihu.queue where room_id = #{roomId} " +
            "       and status in ( " +
            "           <foreach collection='curStatusList' separator=',' item='status'>" +
            "             #{status} " +
            "           </foreach> )" +
            "       order by seq_num, book_timeslot limit 1 " +
            "    ) a " +
            "  )" +
            "</script>"
    )
    Integer preemptToBeInstalledPatient(@Param("roomId")Long roomId, @Param("bedNo")String bedNo, @Param("curStatusList")List<Integer> curStatusList, @Param("newStatus")Integer newStatus);
 
    // 整个系统范围内 [排队中]人员 [被工位医生]抢占
    @Update("update lihu.queue set status = #{newStatus}, room_id = #{roomId}, room_name = #{roomName}, \n" +
            " bed_no = #{bedNo}, seq_num = #{seqNum} where id = \n" +
            "  (select a.id from \n" +
            "    (select id from lihu.queue where status = #{curStatus} and book_check_type= #{checkType} order by jump_flag desc, book_timeslot, create_time limit 1) a)")
    Integer preemptWaitingPatient(@Param("roomId")Long roomId, @Param("roomName")String roomName, @Param("bedNo")String bedNo,
                                  @Param("seqNum")Integer seqNum, @Param("curStatus")Integer curStatus, @Param("newStatus")Integer newStatus,
                                  @Param("checkType")Integer checkType);
 
    // 整个系统范围内 [排队中]人员 [被工位医生]抢占 根据 多个检查项目
    @Update("<script>" +
            "update lihu.queue set status = #{newStatus}, room_id = #{roomId}, room_name = #{roomName}, \n" +
            " bed_no = #{bedNo}, seq_num = #{seqNum} where id = \n" +
            "  (select a.id from \n" +
            "    (select id from lihu.queue where status = #{curStatus} " +
            "       and book_check_type in ( " +
            "           <foreach collection='checkTypeArray' separator=',' item='_checkType'>" +
            "             #{_checkType} " +
            "           </foreach> )" +
            "       order by jump_flag desc, book_timeslot, create_time limit 1) a) " +
            "</script>")
    Integer preemptWaitingPatientWithBedCheckTypes(@Param("roomId")Long roomId, @Param("roomName")String roomName, @Param("bedNo")String bedNo,
                                  @Param("seqNum")Integer seqNum, @Param("curStatus")Integer curStatus, @Param("newStatus")Integer newStatus,
                                  @Param("checkTypeArray")Integer[] checkTypeArray);
 
    @Update("update lihu.queue set status = #{newStatus}, seq_num = #{seqNum} " +
            " where id = " +
            "  (select a.id from \n" +
            "    (select id from lihu.queue where room_id = #{roomId} and bed_no = #{bedNo} and status = #{curStatus} " +
            "      order by seq_num, book_timeslot limit 1" +
            "    ) a" +
            "  )" )
    Integer queueRecalledPatient(@Param("roomId")Long roomId, @Param("roomName")String roomName, @Param("bedNo")String bedNo,
                                 @Param("seqNum")Integer seqNum, @Param("curStatus")Integer curStatus, @Param("newStatus")Integer newStatus);
 
    // 常规检查 或 领用 的患者召回, 原工位处理
    @Update("update lihu.queue set status = #{newStatus}, passed = 1 " +
            " where room_id = #{roomId} and bed_no = #{bedNo} and status = #{curStatus} and pat_id = #{patId} and book_check_type=#{checkType}")
    Integer recallPassedPatient(@Param("roomId")Long roomId, @Param("bedNo")String bedNo,
                                @Param("patId")String patId, @Param("checkType")Integer checkType,
                                @Param("curStatus")Integer curStatus, @Param("newStatus")Integer newStatus);
 
    // 装机医生 允许抢占 本科室 [安装过号] 的患者
    @Update("update lihu.queue set status = #{newStatus}, bed_no = #{bedNo}, passed = 1 " +
            " where room_id = #{roomId} and status = #{curStatus} and pat_id = #{patId} and book_check_type=#{checkType}")
    Integer recallPassedInstallPatient(@Param("roomId")Long roomId, @Param("bedNo")String bedNo,
                                       @Param("patId")String patId, @Param("checkType")Integer checkType,
                                @Param("curStatus")Integer curStatus, @Param("newStatus")Integer newStatus);
 
    @Update("update lihu.queue set jump_flag = #{jumped} " +
            " where status = #{curStatus} and pat_id = #{patId} and book_check_type=#{bookCheckType}")
    Integer queueJump(@Param("patId")String patId, @Param("bookCheckType")Integer bookCheckType,
                      @Param("curStatus")Integer curStatus, @Param("jumped")Byte jumped );
 
    // ==================== 需求2:误点「叫号 / 检查完成」的撤销 ====================
 
    /**
     * 撤销「检查完成」:把本工位今日的**指定患者**从 已就诊(40) 退回 候诊中(20)。
     * <p>
     * 必须按 {@code pat_id + book_check_type + 今日} 精确定位,**不能**只按
     * "工位 + status=40 取第一条"——那会在期间已叫下一位患者时误改他人(见
     * {@code DevRentServiceImpl.routineFinishOperation} 的既有缺陷)。
     * <p>
     * {@code passed = 0} 是为了让患者重新回到正常候诊序列(非"过号"态)。
     */
    @Update("update lihu.queue set status = #{newStatus}, passed = 0 " +
            " where room_id = #{roomId} and bed_no = #{bedNo} and status = #{curStatus} " +
            "   and pat_id = #{patId} and book_check_type = #{checkType} " +
            "   and TO_DAYS(book_date) = TO_DAYS(NOW())")
    Integer undoFinishPatient(@Param("roomId")Long roomId, @Param("bedNo")String bedNo,
                              @Param("patId")String patId, @Param("checkType")Integer checkType,
                              @Param("curStatus")Integer curStatus, @Param("newStatus")Integer newStatus);
 
    /**
     * 撤销「误点叫号」:把本工位当前 就诊中(30) 的患者退回 候诊中(20)。
     * <p>
     * 仅按工位+状态定位("当前正在就诊的那一位"),不使用 seq_num 子查询,
     * 避免与 {@code updateBedQueueStatus} 的写法混淆。
     */
    @Update("update lihu.queue set status = #{newStatus} " +
            " where id = " +
            "  (select a.id from " +
            "    (select id from lihu.queue where room_id = #{roomId} and bed_no = #{bedNo} " +
            "       and status = #{curStatus} and TO_DAYS(book_date) = TO_DAYS(NOW()) " +
            "       order by seq_num, book_timeslot limit 1) a)")
    Integer undoCallPatient(@Param("roomId")Long roomId, @Param("bedNo")String bedNo,
                            @Param("curStatus")Integer curStatus, @Param("newStatus")Integer newStatus);
 
    /**
     * 取本工位今日**最近一位已完成**的患者(用于界面提示"可撤销的是谁")。
     */
    @Select("SELECT * FROM lihu.queue where room_id = #{roomId} and bed_no = #{bedNo} " +
            " and status = #{status} and TO_DAYS(book_date) = TO_DAYS(NOW()) " +
            " order by update_time desc, seq_num desc limit 1")
    @Results({
            @Result(property = "patDetails", column = "pat_details", typeHandler=com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler.class)
    })
    QueueDO getBedLastFinishedQueueItem(@Param("roomId")Long roomId, @Param("bedNo")String bedNo,
                                        @Param("status")Integer status);
 
    //@Update("TRUNCATE TABLE lihu.queue")
    @Delete("delete from lihu.queue where TO_DAYS(book_date) != TO_DAYS(NOW())")
    void clearQueue();
}