From 68ff33beff11310e830b0615b5a81f83fad0f683 Mon Sep 17 00:00:00 2001
From: yxh <172933527@qq.com>
Date: 星期日, 08 十一月 2026 23:33:14 +0800
Subject: [PATCH] ai优化

---
 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/room/RoomMapper.java |  207 +++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 197 insertions(+), 10 deletions(-)

diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/room/RoomMapper.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/room/RoomMapper.java
index cb951c8..1bc582b 100644
--- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/room/RoomMapper.java
+++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/room/RoomMapper.java
@@ -19,16 +19,64 @@
 @Mapper
 public interface RoomMapper extends BaseMapperX<RoomDO> {
 
+    /**
+     * 璇婂宸ヤ綅鍒嗛〉锛堣瘖瀹ょ鐞嗗垪琛� / 瀵煎嚭鍏辩敤锛夈��
+     *
+     * <p>鎺掑簭锛堟湰闇�姹傦級锛�**璇婂缂栧彿鍗囧簭 鈫� 宸ヤ綅鍙峰崌搴�**锛屽悓涓�璇婂鏈夊涓伐浣嶆椂椤哄簭绋冲畾銆�
+     * 鍘熷疄鐜版槸 {@code orderByDesc(id)}锛堝悗鍔犵殑鎺掓渶鍓嶏級锛屼笌"鎸夎瘖瀹ょ紪鍙风湅"鐨勭幇鍦轰範鎯笉绗︺��
+     */
     default PageResult<RoomDO> selectPage(RoomPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<RoomDO>()
                 .eqIfPresent(RoomDO::getRoomId, reqVO.getRoomId())
                 .eqIfPresent(RoomDO::getBedNo, reqVO.getBedNo())
                 .betweenIfPresent(RoomDO::getCreateTime, reqVO.getCreateTime())
-                .orderByDesc(RoomDO::getId));
+                .orderByAsc(RoomDO::getRoomId)
+                .orderByAsc(RoomDO::getBedNo));
     }
 
-    @Select("select * from lihu.clinic_room where ip = #{ip}")
+    /**
+     * 鎸� IP 鏌ヨ IP 涓�**鍙敤**鐨勫伐浣嶏紙渚�"鎸塈P鑷姩鍖归厤宸ヤ綅"浣跨敤锛夈��
+     *
+     * <p>涓夋潯杩囨护缂轰竴涓嶅彲锛�
+     * <ul>
+     *   <li>{@code deleted = 0}锛氬師瀹炵幇鏄8鏌ワ紝宸插垹闄ょ殑宸ヤ綅涔熶細琚尮閰嶅埌鈥斺��
+     *       涓�鏃︽煇 IP 琚洖鏀跺啀鍒嗛厤缁欐柊宸ヤ綅锛屽氨浼氳嚜鍔ㄥ叆搴у埌鍘嗗彶鑴忓伐浣嶄笂锛�</li>
+     *   <li>{@code status != 0(宸插叧闂�)}锛氬凡鍏抽棴鐨勫伐浣嶄笉璇ヨ鑷姩鍏ュ骇锛堝惁鍒欎汉鍧愪笂鍘诲嵈娌℃湁鍊欒瘖闃熷垪锛岀湅鐫�鍍�"娌$梾浜�"锛夛紱</li>
+     *   <li>{@code ip <> ''}锛氱┖ IP 涓嶅仛鍖归厤锛堥伩鍏嶅巻鍙茬┖鍊艰琚壂鍒帮級銆�</li>
+     * </ul>
+     * 鐘舵�佸彇鍊艰 {@link cn.lihu.jh.module.ecg.enums.BedStatusEnum}锛�0宸插叧闂� / 10宸插紑閫� / 20鏈夊尰鐢� / 30鏆傚仠銆�</p>
+     */
+    @Select("select * from lihu.clinic_room " +
+            " where ip = #{ip} and deleted = 0 and coalesce(status, 0) <> 0")
+    @Results({
+            @Result(property = "checkTypes", column = "check_types", typeHandler = com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler.class)
+    })
     List<RoomDO> queueByIp(@Param("ip") String ip);
+
+    /**
+     * 璇� IP 鏄惁宸茬粦瀹氬湪**鍒殑**宸ヤ綅涓婏紙鐢ㄤ簬"閫夋嫨宸ヤ綅妯″紡"閲屽啓 IP 鍓嶇殑鍐茬獊妫�娴嬶級銆�
+     * <p>涓�涓伐浣嶅彧鏈変竴涓� ip 瀛楁锛岃嫢涓ゅ彴鐢佃剳璧板悓涓�鍑哄彛 IP锛屽悗缁戝畾鐨勪細鎶婂墠闈㈢殑鎶㈣蛋锛�
+     * 鎵�浠ヨ鐩栧墠瑕佸厛璁╃敤鎴风‘璁わ紙鍓嶇鎷垮埌鍐茬獊宸ヤ綅鍚庡脊纭锛屽啀甯� force 閲嶈皟锛夈��</p>
+     *
+     * @param ip        寰呯粦瀹氱殑 IP
+     * @param excludeId 鎺掗櫎鐨勫伐浣嶄富閿紙閫氬父鏄湰娆¤缁戝畾鐨勯偅涓級锛屽彲涓虹┖
+     */
+    @Select("<script> " +
+            "SELECT * FROM lihu.clinic_room " +
+            " WHERE deleted = 0 AND ip = #{ip} " +
+            " <if test='excludeId != null'> AND id != #{excludeId} </if> " +
+            " ORDER BY id" +
+            "</script>")
+    @Results({
+            @Result(property = "checkTypes", column = "check_types", typeHandler = com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler.class)
+    })
+    List<RoomDO> listByIpExcludeId(@Param("ip") String ip, @Param("excludeId") Integer excludeId);
+
+    /**
+     * 鎶婃湰鏈� IP 鍐欏埌鎸囧畾宸ヤ綅锛堝彧鏀� ip 涓�涓瓧娈碉紝渚�"閫夋嫨宸ヤ綅妯″紡 2/3"浣跨敤锛夈��
+     */
+    @Update("update lihu.clinic_room set ip = #{ip} where id = #{id} and deleted = 0")
+    Integer updateIpById(@Param("id") Integer id, @Param("ip") String ip);
 
     @Update("<script> " +
             "update lihu.clinic_room set status=#{newStatus}, doc_id=null, doc_name=null " +
@@ -61,6 +109,38 @@
 
     @Select("SELECT * FROM lihu.clinic_room where doc_id=#{docId}")
     List<RoomDO> getRoomByDocId(@Param("docId")Long docId);
+
+    /**
+     * 銆愭湰闇�姹偮蜂竴浜哄宸ヤ綅銆戣鍖荤敓**褰撳墠鏈夋晥**鍗犵敤鐨勫叏閮ㄥ伐浣嶃��
+     *
+     * <p>姣� {@link #getRoomByDocId} 澶氫簡涓や釜杩囨护锛�
+     * <ul>
+     *   <li>{@code deleted = 0}锛氭帓闄ゅ巻鍙查�昏緫鍒犻櫎琛岋紙鍘� SQL 娌℃湁锛屽彲鑳借繑鍥炶剰琛岋級锛�</li>
+     *   <li>{@code status in (20,30)}锛氬彧鍙栥�屽尰鐢熷湪搴�(DOCTOR_ON) / 鍖荤敓鏆傚仠(DOCTOR_PAUSE)銆嶏紝
+     *       鎺掗櫎鏁版嵁涓嶄竴鑷存畫鐣欑殑"doc_id 杩樺湪浣嗙姸鎬佸凡鍥炵┖闂�"銆備袱涓�间互甯搁噺浼犲叆锛岄伩鍏嶇‖缂栫爜銆�</li>
+     * </ul>
+     */
+    @Select("<script> " +
+            "SELECT * FROM lihu.clinic_room where doc_id = #{docId} and deleted = 0 " +
+            " and status in ( " +
+            "  <foreach collection='statusList' separator=',' item='st'>#{st}</foreach> " +
+            " ) order by room_id, bed_no " +
+            "</script>")
+    List<RoomDO> getMyActiveBeds(@Param("docId") Long docId, @Param("statusList") List<Integer> statusList);
+
+    /**
+     * 銆愭湰闇�姹偮风粺璁℃寜浜哄悎骞躲�戝綋鍓�**鍦ㄥ骇鍖荤敓鏁�**锛堟寜 doc_id 鍘婚噸锛夈��
+     *
+     * <p>涓�浜哄宸ヤ綅鍚庯紝"鍦ㄥ骇宸ヤ綅鏁�"浼氭寜宸ヤ綅绱锛堟暟鍊兼湰韬纭級锛�
+     * 浣嗙洃鎺ч〉杩橀渶瑕�"鍒板簳鍑犱釜鍖荤敓鍦ㄥ矖"锛岀敤瀹冭ˉ涓�涓寚鏍囥��
+     */
+    @Select("<script> " +
+            "select count(distinct doc_id) from lihu.clinic_room " +
+            " where doc_id is not null and deleted = 0 and status in ( " +
+            "  <foreach collection='statusList' separator=',' item='st'>#{st}</foreach> " +
+            " ) " +
+            "</script>")
+    Integer countSeatedDoctors(@Param("statusList") List<Integer> statusList);
 
     @Update("<script> " +
             "update lihu.clinic_room set status=#{newStatus.status} " +
@@ -103,23 +183,130 @@
     Integer setBedStopReady(@Param("roomId")Long roomId, @Param("bedNo")String bedNo,
                             @Param("stopReady")Integer stopReady);
 
+    /**
+     * 鍏ュ骇锛氭妸璇ュ伐浣嶇殑**涓讳汉**璁句负鎴戯紙鎸� room_id + bed_no 瀹氫綅锛夈��
+     *
+     * <p>銆愭湰娆℃斁瀹� + 淇銆�
+     * <ul>
+     *   <li>鍙叆搴ф潯浠剁粺涓�涓猴細<b>锛堟棤涓讳汉 鎴� 涓讳汉鏄垜锛変笖 鐘舵�� 鈭� claimableStatusList</b>銆�
+     *       鐘舵�侀泦鍚堢敱璋冪敤鏂逛紶 {宸插紑閫�, 鏈夊尰鐢�, 鏆傚仠}锛�**鎺掗櫎"宸插叧闂�"**锛夈��<br>
+     *       鍘熸潵"鏃犱富浜�"鏃跺彧璁�"宸插紑閫�"锛氫竴鏃︽暟鎹噷鍑虹幇"doc_id 涓虹┖浣嗙姸鎬佷粛鏄湁鍖荤敓/鏆傚仠"
+     *       杩欑涓嶄竴鑷达紝鍖荤敓绔欏湪宸ヤ綅鍓嶅嵈濮嬬粓鍧愪笉涓婏紝鍙姤"鐘舵�佸紓甯�"锛岀幇鍦烘棤浠庡鐞嗐��</li>
+     *   <li>涓讳汉鏄垜鏃跺悓鏍锋斁琛� 鈫� 涓婃娌℃甯哥搴э紙鍏虫祻瑙堝櫒/瓒呮椂锛変篃鑳藉潗鍥炶嚜宸辩殑宸ヤ綅銆�</li>
+     *   <li>涓讳汉鏄�**鍒汉**鏃舵洿鏂� 0 琛岋紝璋冪敤鏂规嵁姝ゆ嫆缁濓紙涓嶆尋鎺夋鍦ㄦ搷浣滅殑浜猴級銆�</li>
+     * </ul>
+     */
     @Update("<script> " +
-            "update lihu.clinic_room set status=#{newStatus.status}, doc_id=#{docId}, doc_name=#{docName} " +
-            "where room_id=#{roomId} and bed_no=#{bedNo} and isNull(doc_id)" +
-            "and status in ( " +
-            " <foreach collection='curStatusList' separator=',' item='curStatus'>" +
-            "  #{curStatus.status} " +
-            " </foreach> );" +
+            "update lihu.clinic_room set status=#{newStatus.status}, doc_id=#{docId}, doc_name=#{docName}, update_time=NOW() " +
+            "where room_id=#{roomId} and bed_no=#{bedNo} and deleted = 0 " +
+            "  and ( isNull(doc_id) or doc_id = #{docId} ) " +
+            "  and status in ( " +
+            "      <foreach collection='claimableStatusList' separator=',' item='curStatus'>#{curStatus.status}</foreach> );" +
             "</script>")
-    Integer setBedDoctorOn(@Param("roomId")Long roomId, @Param("bedNo")String bedNo, @Param("docId")Long docId, @Param("docName")String docName, @Param("newStatus") BedStatusEnum newStatus, @Param("curStatusList") List<BedStatusEnum> curStatusList);
+    Integer setBedDoctorOn(@Param("roomId")Long roomId, @Param("bedNo")String bedNo, @Param("docId")Long docId, @Param("docName")String docName,
+                           @Param("newStatus") BedStatusEnum newStatus,
+                           @Param("claimableStatusList") List<BedStatusEnum> claimableStatusList);
+
+    /**
+     * 鍏ュ骇锛氬悓涓婏紝浣嗘寜**涓婚敭 id** 瀹氫綅銆�
+     *
+     * <p>銆愭湰娆′慨澶嶃�戠幇鍦哄嚭鐜拌繃"宸ヤ綅鍦ㄥ簱閲屾槑鏄庢槸绌洪棽鐨勶紝鍏ュ骇鍗存洿鏂� 0 琛� 鈫� 鎶ョ姸鎬佸紓甯�"銆�
+     * 宸茬‘璁や笉鏄鍗犵敤锛涘墿涓嬬殑鍙兘鏄� {@code bed_no} 涓庤姹傚�煎瓨鍦ㄨ倝鐪奸毦杈ㄧ殑宸紓
+     * 锛堢粨灏剧┖鏍笺�佸ぇ灏忓啓銆佸叏瑙掔瓑 鈥斺�� JSON 涓庡鍒剁矘璐撮兘鐪嬩笉鍑烘潵锛夈��
+     * 鍓嶇璇锋眰閲屾湰鏉ュ氨甯� {@code id}锛屽洜姝や紭鍏堟寜涓婚敭鏇存柊锛屽交搴曠粫寮�杩欑被闂銆�
+     */
+    @Update("<script> " +
+            "update lihu.clinic_room set status=#{newStatus.status}, doc_id=#{docId}, doc_name=#{docName}, update_time=NOW() " +
+            "where id=#{id} and deleted = 0 " +
+            "  and ( isNull(doc_id) or doc_id = #{docId} ) " +
+            "  and status in ( " +
+            "      <foreach collection='claimableStatusList' separator=',' item='curStatus'>#{curStatus.status}</foreach> );" +
+            "</script>")
+    Integer setBedDoctorOnById(@Param("id")Integer id, @Param("docId")Long docId, @Param("docName")String docName,
+                               @Param("newStatus") BedStatusEnum newStatus,
+                               @Param("claimableStatusList") List<BedStatusEnum> claimableStatusList);
+
+    /**
+     * 璇婃柇鐢細鍙栧伐浣�**鍘熷琛�**锛堝惈 {@code bed_no} 鐨勯暱搴︿笌鍗佸叚杩涘埗锛岀敤浜庡彂鐜扮粨灏剧┖鏍�/鍏ㄨ宸紓锛夈��
+     *
+     * <p>浼犲叆 id 鏃舵寜 id 鏌ワ紙鍚凡鍒犻櫎琛岋級锛涘惁鍒欐寜 room_id + {@code TRIM(bed_no)} 瀹芥澗鏌ャ��
+     * 杩斿洖 Map 鑰屼笉鏄� DO锛氳繖閲岃鎶� {@code deleted}銆侀暱搴︺�丠EX 杩欎簺"闈炲疄浣撳瓧娈�"涓�璧峰甫鍑烘潵銆�
+     */
+    @Select("<script>" +
+            "select id, room_id, room_name, bed_no," +
+            "       CHAR_LENGTH(bed_no) as bed_no_len, HEX(bed_no) as bed_no_hex," +
+            "       ip, status, doc_id, doc_name, op_type, deleted, update_time" +
+            "  from lihu.clinic_room" +
+            " where 1 = 1" +
+            " <if test='id != null'> and id = #{id} </if>" +
+            " <if test='id == null'> and room_id = #{roomId} and TRIM(bed_no) = TRIM(#{bedNo}) </if>" +
+            " order by deleted, id" +
+            "</script>")
+    List<Map<String, Object>> selectBedRawState(@Param("id") Integer id, @Param("roomId") Long roomId, @Param("bedNo") String bedNo);
+
+    /**
+     * 銆愭湰闇�姹傘�戜竴涓敤鎴峰彧鍏佽鍗犱竴涓伐浣嶏細鍏ュ骇鎴愬姛鍚庯紝鎶�**鎴戠殑鍏跺畠宸ヤ綅**閲婃斁鎺夈��
+     *
+     * <p>鍙竻 {@code doc_id/doc_name} 骞舵妸鐘舵�佺疆鍥�"宸插紑閫�"锛屼笉鍔� check_types / ip / stop_ready锛�
+     * 鐢� {@code not (room_id = ? and bed_no = ?)} 鎺掗櫎鏈鍏ュ骇鐨勫伐浣嶏紝閬垮厤鎶婅嚜宸卞垰鍧愪笂鐨勪篃娓呮帀銆�
+     *
+     * @param keepRoomId 鏈鍏ュ骇鐨勮瘖瀹ょ紪鍙凤紙淇濈暀涓嶅姩锛�
+     * @param keepBedNo  鏈鍏ュ骇鐨勫伐浣嶅彿锛堜繚鐣欎笉鍔級
+     */
+    @Update("<script> " +
+            "update lihu.clinic_room set status=#{newStatus.status}, doc_id=null, doc_name=null, update_time=NOW() " +
+            "where doc_id=#{docId} and deleted = 0 " +
+            "<if test='keepRoomId != null and keepBedNo != null'>" +
+            "  and not (room_id = #{keepRoomId} and bed_no = #{keepBedNo}) " +
+            "</if>" +
+            "</script>")
+    Integer releaseOtherBedsOfDoc(@Param("docId")Long docId, @Param("keepRoomId")Long keepRoomId,
+                                  @Param("keepBedNo")String keepBedNo, @Param("newStatus") BedStatusEnum newStatus);
 
     @Update("<script> " +
             "update lihu.clinic_room set status=#{newStatus.status}, doc_id=null, doc_name=null " +
-            "where room_id=#{roomId} and bed_no=#{bedNo} " +
+            "where room_id=#{roomId} and bed_no=#{bedNo} and doc_id=#{docId} " +
             "and status in ( " +
             " <foreach collection='curStatusList' separator=',' item='curStatus'>" +
             "  #{curStatus.status} " +
             " </foreach> );" +
             "</script>")
     Integer setBedDoctorOff(@Param("roomId")Long roomId, @Param("bedNo")String bedNo, @Param("docId")Long docId, @Param("newStatus") BedStatusEnum newStatus, @Param("curStatusList") List<BedStatusEnum> curStatusList);
+
+    /**
+     * 銆愭湰娆¢渶姹傘�戦棴璇婃椂娓呯┖**鎵�鏈夎鍖荤敓鍗犵敤**鐨勫伐浣嶏紙doc_id 闈炵┖锛屼笖鐘舵�佷负銆屽尰鐢熷湪宀� / 鏆傚仠銆嶏級銆�
+     * <p>
+     * 鑳屾櫙锛氬伐浣嶄笉鍐嶅洜銆岀┖闂茶秴鏃� / 浠ょ墝澶辨晥 / 鍒锋柊椤甸潰銆嶈閲婃斁锛堥伩鍏嶅尰鐢熺寮�涓�浼氬効灏变涪宸ヤ綅锛夛紝
+     * 鍥犳闇�瑕佷竴涓厹搴曪紝闃叉鍖荤敓涓嬬彮蹇樼搴у鑷村伐浣嶉暱鏈熻鍗犵敤 鈥斺�� 闂瘖鏃剁粺涓�娓呯┖褰撶彮宸ヤ綅銆�
+     *
+     * @param newStatus     娓呯┖鍚庣疆涓虹殑鐘舵�侊紙绌洪棽 / 宸插紑閫氾級
+     * @param curStatusList 鍏佽琚竻绌虹殑褰撳墠鐘舵�侀泦鍚�
+     */
+    @Update("<script> " +
+            "update lihu.clinic_room set status=#{newStatus.status}, doc_id=null, doc_name=null, update_time=NOW() " +
+            "where deleted = 0 and doc_id is not null " +
+            "and status in ( " +
+            " <foreach collection='curStatusList' separator=',' item='curStatus'>" +
+            "  #{curStatus.status} " +
+            " </foreach> )" +
+            "</script>")
+    Integer clearAllBedDoctors(@Param("newStatus") BedStatusEnum newStatus, @Param("curStatusList") List<BedStatusEnum> curStatusList);
+
+    /**
+     * 銆愭湰娆¢渶姹傘�戠鐞嗗憳寮哄埗娓呯┖鏌愪釜宸ヤ綅銆�
+     * <p>
+     * 涓� {@link #setBedDoctorOff} 鐨勫敮涓�鍖哄埆锛�**涓嶅甫 `doc_id = ?` 鏉′欢**锛�
+     * 鍥犳鍙互鎶�"鍒汉鍗犵敤涓�"鐨勫伐浣嶆竻鎺夛紙鍖荤敓涓嬬彮蹇樼搴с�佹崲浜轰娇鐢ㄥ悓涓�宸ヤ綅鏃剁敤锛夈��
+     * 浠嶇劧瑕佹眰褰撳墠鐘舵�佹槸銆屽尰鐢熷湪宀� / 鏆傚仠銆嶄笖 doc_id 闈炵┖锛岄伩鍏嶈娓呯┖闂插伐浣嶃��
+     */
+    @Update("<script> " +
+            "update lihu.clinic_room set status=#{newStatus.status}, doc_id=null, doc_name=null, update_time=NOW() " +
+            "where room_id=#{roomId} and bed_no=#{bedNo} and doc_id is not null " +
+            "and status in ( " +
+            " <foreach collection='curStatusList' separator=',' item='curStatus'>" +
+            "  #{curStatus.status} " +
+            " </foreach> )" +
+            "</script>")
+    Integer setBedDoctorOffAdmin(@Param("roomId")Long roomId, @Param("bedNo")String bedNo,
+                                 @Param("newStatus") BedStatusEnum newStatus, @Param("curStatusList") List<BedStatusEnum> curStatusList);
 }

--
Gitblit v1.9.3