From fce96ef468291fb9a0e6a4d34ab371315e9485d4 Mon Sep 17 00:00:00 2001
From: yxh <172933527@qq.com>
Date: 星期六, 03 十月 2026 00:59:44 +0800
Subject: [PATCH] ai优化

---
 jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceImpl.java |  481 +++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 372 insertions(+), 109 deletions(-)

diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceImpl.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceImpl.java
index fa7b920..4b6f9e4 100644
--- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceImpl.java
+++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceImpl.java
@@ -6,13 +6,19 @@
 
 import cn.lihu.jh.module.ecg.Utils;
 import cn.lihu.jh.module.ecg.controller.admin.room.vo.MonitorInfoVO;
+import cn.lihu.jh.module.ecg.dal.dataobject.appointment.AppointmentDO;
 import cn.lihu.jh.module.ecg.dal.dataobject.checktype.CheckTypeDO;
 import cn.lihu.jh.module.ecg.dal.dataobject.devrent.DevRentDO;
-import cn.lihu.jh.module.ecg.dal.mysql.call.CallMapper;
+import cn.lihu.jh.module.ecg.dal.mysql.appointment.AppointmentMapper;
+import cn.lihu.jh.module.ecg.dal.mysql.checktype.CheckTypeMapper;
 import cn.lihu.jh.module.ecg.dal.mysql.devrent.DevRentMapper;
+import cn.lihu.jh.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.lihu.jh.module.ecg.enums.DevRentStateEnum;
 import cn.lihu.jh.module.system.api.oauth2.OAuth2TokenApi;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.cxf.common.util.CollectionUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
@@ -29,6 +35,7 @@
 import cn.lihu.jh.framework.common.pojo.PageResult;
 import cn.lihu.jh.framework.common.util.object.BeanUtils;
 import cn.lihu.jh.module.ecg.dal.mysql.queue.QueueMapper;
+
 import static cn.lihu.jh.module.ecg.enums.ErrorCodeConstants.*;
 import static cn.lihu.jh.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.lihu.jh.framework.common.pojo.CommonResult.error;
@@ -57,10 +64,17 @@
     private RoomMapper roomMapper;
 
     @Resource
-    private CallMapper callMapper;
+    private AppointmentMapper appointmentMapper;
 
     @Resource
     private DevRentMapper devRentMapper;
+
+    /**
+     * 鐢ㄤ簬銆岃澶囬鐢�/瑁呮満銆嶅彇鏁版椂杩囨护鍑� {@code need_dev_ready = 1} 鐨勬鏌ラ」鐩�
+     * 锛堣 {@link #filterNeedDevReady}锛夈��
+     */
+    @Resource
+    private CheckTypeMapper checkTypeMapper;
 
     ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
 
@@ -84,6 +98,24 @@
         queueMapper.updateById(updateObj);
     }
 
+    public void updateStop(long roomId,String bedNo) {
+        // 鏍¢獙瀛樺湪
+       if(ObjectUtils.isNotEmpty(roomId)) {
+           QueueDO updateObj=new QueueDO();
+           updateObj.setStatus(40);
+           UpdateWrapper<QueueDO> wrapper=new UpdateWrapper<>();
+           wrapper.eq("room_id",roomId).eq("bed_no",bedNo).eq("status","30");
+           queueMapper.update(updateObj,wrapper);
+
+           QueueDO updateObj1=new QueueDO();
+           updateObj1.setRoomId(0l);
+           updateObj1.setBedNo(" ");
+           UpdateWrapper<QueueDO> wrapper1=new UpdateWrapper<>();
+           wrapper1.eq("room_id",roomId).eq("bed_no",bedNo).eq("status","20");
+           queueMapper.update(updateObj1,wrapper1);
+       }
+    }
+
     @Override
     public void deletequeue(Integer id) {
         // 鏍¢獙瀛樺湪
@@ -94,7 +126,7 @@
 
     @Override
     public ErrorCode startBedOpen(Long roomId, String roomName, String bedNo) {
-        Future<ErrorCode> future = singleThreadExecutor.submit( new BedOpenCallable(queueServiceTxFunctions, roomId, roomName, bedNo));
+        Future<ErrorCode> future = singleThreadExecutor.submit(new BedOpenCallable(queueServiceTxFunctions, roomId, roomName, bedNo));
 
         try {
             ErrorCode ret = future.get();
@@ -111,7 +143,7 @@
 
     @Override
     public ErrorCode startBedClose(Long roomId, String bedNo) {
-        Future<ErrorCode> future = singleThreadExecutor.submit( new BedCloseCallable(queueServiceTxFunctions, roomId, bedNo));
+        Future<ErrorCode> future = singleThreadExecutor.submit(new BedCloseCallable(queueServiceTxFunctions, roomId, bedNo));
 
         try {
             ErrorCode ret = future.get();
@@ -128,9 +160,7 @@
 
     @Override
     public ErrorCode startBedDoctorPause(Long roomId, String bedNo, Long docId, String docName) {
-        Future<ErrorCode> future = singleThreadExecutor.submit(
-            new BedDoctorPauseCallable(queueServiceTxFunctions, roomId, bedNo, docId, docName)
-        );
+        Future<ErrorCode> future = singleThreadExecutor.submit(new BedDoctorPauseCallable(queueServiceTxFunctions, roomId, bedNo, docId, docName));
 
         try {
             ErrorCode ret = future.get();
@@ -147,9 +177,7 @@
 
     @Override
     public ErrorCode startBedDoctorResume(Long roomId, String bedNo, Long docId, String docName) {
-        Future<ErrorCode> future = singleThreadExecutor.submit(
-            new BedDoctorResumeCallable(queueServiceTxFunctions, roomId, bedNo, docId, docName)
-        );
+        Future<ErrorCode> future = singleThreadExecutor.submit(new BedDoctorResumeCallable(queueServiceTxFunctions, roomId, bedNo, docId, docName));
 
         try {
             ErrorCode ret = future.get();
@@ -166,9 +194,7 @@
 
     @Override
     public ErrorCode startBedDoctorOn(Long roomId, String bedNo, Long docId, String docName) {
-        Future<ErrorCode> future = singleThreadExecutor.submit(
-            new BedDoctorOnCallable(queueServiceTxFunctions, roomId, bedNo, docId, docName)
-        );
+        Future<ErrorCode> future = singleThreadExecutor.submit(new BedDoctorOnCallable(queueServiceTxFunctions, roomId, bedNo, docId, docName));
 
         try {
             ErrorCode ret = future.get();
@@ -185,9 +211,7 @@
 
     @Override
     public ErrorCode startBedDoctorOff(Long roomId, String bedNo, Long docId, String docName) {
-        Future<ErrorCode> future = singleThreadExecutor.submit(
-            new BedDoctorOffCallable(queueServiceTxFunctions, roomId, bedNo, docId, docName)
-        );
+        Future<ErrorCode> future = singleThreadExecutor.submit(new BedDoctorOffCallable(queueServiceTxFunctions, roomId, bedNo, docId, docName));
 
         try {
             ErrorCode ret = future.get();
@@ -204,9 +228,7 @@
 
     @Override
     public ErrorCode startNextPatient(Long roomId, String bedNo) {
-        Future<ErrorCode> future = singleThreadExecutor.submit(
-                new BedDoctorNextPatientCallable(queueServiceTxFunctions, roomId, bedNo)
-        );
+        Future<ErrorCode> future = singleThreadExecutor.submit(new BedDoctorNextPatientCallable(queueServiceTxFunctions, roomId, bedNo));
 
         try {
             ErrorCode ret = future.get();
@@ -223,9 +245,7 @@
 
     @Override
     public ErrorCode startNextInstallPatient(Long roomId, String bedNo) {
-        Future<ErrorCode> future = singleThreadExecutor.submit(
-                new BedDoctorNextInstallPatientCallable(queueServiceTxFunctions, roomId, bedNo)
-        );
+        Future<ErrorCode> future = singleThreadExecutor.submit(new BedDoctorNextInstallPatientCallable(queueServiceTxFunctions, roomId, bedNo));
 
         try {
             ErrorCode ret = future.get();
@@ -242,21 +262,21 @@
 
     @Override
     public void startHurryUpOneBed(Long roomId, String bedNo) {
-        singleThreadExecutor.execute( () -> {
+        singleThreadExecutor.execute(() -> {
             queueServiceTxFunctions.hurryupOneBed(roomId, bedNo);
         });
     }
 
     @Override
     public void startHurryUpOneCheckType(Integer checkType) {
-        singleThreadExecutor.execute( () -> {
-            queueServiceTxFunctions.hurryupOneCheckType( checkType );
+        singleThreadExecutor.execute(() -> {
+            queueServiceTxFunctions.hurryupOneCheckType(checkType);
         });
     }
 
     @Override
     public void startBedReload() {
-        singleThreadExecutor.execute( () -> {
+        singleThreadExecutor.execute(() -> {
             queueServiceTxFunctions.bedReload();
             queueServiceTxFunctions.hurryupAllBed();
             queueServiceTxFunctions.monitorInfo();
@@ -265,7 +285,7 @@
 
     @Override
     public void startResetRoom(Boolean needCloseBed) {
-        singleThreadExecutor.execute( () -> {
+        singleThreadExecutor.execute(() -> {
             queueServiceTxFunctions.resetRoom(needCloseBed);
             queueServiceTxFunctions.bedReload();
             queueServiceTxFunctions.monitorInfo();
@@ -284,8 +304,8 @@
             return error(ROOM_NOT_SIT);
         }
 
-        BedQueueBO bedQueueBO = queueServiceTxFunctions.getBedQueueBO(roomId, bedNo);
-        if (null == bedQueueBO) {
+        BedBO bedBO = queueServiceTxFunctions.getBedQueueBO(roomId, bedNo);
+        if (null == bedBO) {
             log.error("getRoom mapBedVsQueue DONOT existed. " + roomId + " " + bedNo);
             return error(QUEUE_BED_NOT_EXIST);
         }
@@ -307,12 +327,15 @@
 
     @Override
     public PageResult<QueueDO> getqueuePage(QueuePageReqVO pageReqVO) {
-        return queueMapper.selectPage(pageReqVO);
+        PageResult<QueueDO> queueDOPageResult = queueMapper.selectPage(pageReqVO);
+        fillAppointmentInfo(queueDOPageResult.getList());
+        return queueDOPageResult;
     }
 
 
     /**
      * 棰勭害纭鍚庣殑鎺掗槦
+     *
      * @param queueSaveReqVO
      */
     @Override
@@ -322,21 +345,28 @@
         queueSaveReqVO.setStatus(QueueStatusEnum.WAITING.getStatus());
 
         // 澶勭悊 妫�鏌ラ」鐩�.浜插拰鎬� 閫昏緫
-        CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem( queueSaveReqVO.getBookCheckType() );
-        if ( checkTypeDO.getAffinityCheckTypes().length > 0) {
-            procAffinityWhenQueue(queueSaveReqVO, checkTypeDO.getAffinityCheckTypes());
+        CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem(queueSaveReqVO.getBookCheckType());
+        if (checkTypeDO.getAffinityCheckTypes().length > 0) {
+            procAffinityWhenQueue(/*IN,OUT*/queueSaveReqVO, checkTypeDO.getAffinityCheckTypes());
         }
 
         QueueDO queue = BeanUtils.toBean(queueSaveReqVO, QueueDO.class);
         queueMapper.insert(queue);
 
         DevRentDO devRent = BeanUtils.toBean(queueSaveReqVO, DevRentDO.class);
-        devRent.setState( DevRentStateEnum.FREE.getState() );
-        devRent.setPatDetails( queueSaveReqVO.getPatDetails() );
-        devRent.setCheckType( queueSaveReqVO.getBookCheckType() );
+        devRent.setApplyNo(queueSaveReqVO.getApplyNo());
+        devRent.setEpisodeId(queueSaveReqVO.getEpisodeId());
+        devRent.setState(DevRentStateEnum.FREE.getState());
+        devRent.setPatDetails(queueSaveReqVO.getPatDetails());
+        devRent.setCheckType(queueSaveReqVO.getBookCheckType());
         devRentMapper.insert(devRent);
 
-        startHurryUpOneCheckType( queue.getBookCheckType() );
+        startHurryUpOneCheckType(queue.getBookCheckType());
+    }
+
+    @Override
+    public List<QueueDO> selectBookSeqNumByAppointIdList(List<Long> appointIdList) {
+        return queueMapper.selectBookSeqNumByAppointIdList(appointIdList);
     }
 
     // 甯歌妫�鏌� 鍙彿
@@ -350,8 +380,7 @@
         List<Integer> queueStatusList = new ArrayList<>();
         queueStatusList.add(QueueStatusEnum.ONSTAGE.getStatus());
         Integer num = queueMapper.bedQueueStatisticByStatus(roomId, bedNo, queueStatusList);
-        if ( num != null && num > 0)
-            return;
+        if (num != null && num > 0) return;
 
         startNextPatient(roomId, bedNo);
     }
@@ -363,8 +392,7 @@
         List<Integer> queueStatusList = new ArrayList<>();
         queueStatusList.add(QueueStatusEnum.ONSTAGE.getStatus());
         Integer num = queueMapper.bedQueueStatisticByStatus(roomId, bedNo, queueStatusList);
-        if ( num != null && num > 0)
-            return;
+        if (num != null && num > 0) return;
 
         startNextPatient(roomId, bedNo);
     }
@@ -376,16 +404,20 @@
         List<Integer> queueStatusList = new ArrayList<>();
         queueStatusList.add(QueueStatusEnum.INSTALLING.getStatus());
         Integer num = queueMapper.bedQueueStatisticByStatus(roomId, bedNo, queueStatusList);
-        if ( num != null && num > 0)
-            return;
+        if (num != null && num > 0) return;
 
         startNextInstallPatient(roomId, bedNo);
     }
 
+    @Override
+    public void passWaitingPatient(String patId, Integer bookCheckType) {
+        // 浠� DB 鎶� 鎺掗槦涓殑浜� 璁剧疆涓� 杩囧彿-鎺掗槦涓�
+        Integer ret = queueMapper.updatePatientQueueStatus(patId, bookCheckType, QueueStatusEnum.WAITING.getStatus(), QueueStatusEnum.PASSED_WAITING.getStatus());
+    }
+
     public void passNextPatient(Long roomId, String bedNo) {
         // 浠� DB 鎶� 灏辫瘖涓殑浜� 璁剧疆涓鸿繃鍙�
-        Integer ret =  queueMapper.updateBedQueueStatus(roomId, bedNo,
-                QueueStatusEnum.ONSTAGE.getStatus(), QueueStatusEnum.PASSED.getStatus());
+        Integer ret = queueMapper.updateBedQueueStatus(roomId, bedNo, QueueStatusEnum.ONSTAGE.getStatus(), QueueStatusEnum.PASSED.getStatus());
 
         startNextPatient(roomId, bedNo);
     }
@@ -393,20 +425,65 @@
     @Override
     public void passInstallNextPatient(Long roomId, String bedNo) {
         // 浠� DB 鎶� [瀹夎涓璢鐨勪汉 璁剧疆涓� [杩囧彿-瀹夎]
-        Integer ret =  queueMapper.updateBedQueueStatus(roomId, bedNo,
-                QueueStatusEnum.INSTALLING.getStatus(), QueueStatusEnum.PASSED_INSTALL.getStatus());
+        Integer ret = queueMapper.updateBedQueueStatus(roomId, bedNo, QueueStatusEnum.INSTALLING.getStatus(), QueueStatusEnum.PASSED_INSTALL.getStatus());
 
         startNextPatient(roomId, bedNo);
     }
 
     public List<QueueDO> getBedQueueByStatus(Long roomId, String bedNo, List<Integer> statusList) {
         List<QueueDO> queueDOList = queueMapper.getBedQueueByStatus(roomId, bedNo, statusList);
+        fillAppointmentInfo(queueDOList);
         return queueDOList;
     }
 
+    /**
+     * 浠庨绾﹀崟琛ラ綈 queue 琛ㄤ笂娌℃湁鐨勬偅鑰呬俊鎭��
+     *
+     * queue 琛ㄤ笉瀛樿繖浜涘瓧娈碉紝浣嗗尰鐢熺鍒楄〃鎺ュ彛闇�瑕佸睍绀猴紝鎵�浠ユ煡璇㈠悗鎸� applyNo 鍥炴煡棰勭害鍗曞~鍏咃細
+     * 澶氳�愯嵂銆佹�у埆銆佸嚭鐢熸棩鏈熴�佺櫥璁版椂闂淬�佸紑鍗曞尰甯堛�佸紑鍗曟棩鏈熴��
+     */
     @Override
+    public void fillAppointmentInfo(List<QueueDO> queueDOList) {
+        if (CollectionUtils.isEmpty(queueDOList)) {
+            return;
+        }
+        queueDOList.forEach(queueDO -> {
+            if (null == queueDO.getApplyNo() || queueDO.getApplyNo().isEmpty()) {
+                return;
+            }
+            AppointmentDO appointment = appointmentMapper.getByApplyNo(queueDO.getApplyNo());
+            if (null == appointment) {
+                return;
+            }
+            queueDO.setTolerance(appointment.getTolerance());
+            // 闇�姹�2锛氬簥杈规爣璁帮紙HIS zdy.ISCB锛夈�俼ueue 琛ㄥ凡鏈夎鍒楋紝
+            // 浣嗗銆�22_* 鑴氭湰鎵ц鍓嶅氨宸插叆闃熴�嶇殑琛岋紝闈犺繖閲屽洖鏌ヨˉ濉紝淇濊瘉灞忓箷/椤甸潰鑳界湅鍒般��
+            if (queueDO.getIsBedside() == null) {
+                queueDO.setIsBedside(appointment.getIsBedside());
+            }
+            queueDO.setPatGender(appointment.getPatGender());
+            queueDO.setPatBirthday(appointment.getPatBirthday());
+            queueDO.setRegisterDate(appointment.getRegisterDate());
+            queueDO.setDoctor(appointment.getDoctor());
+            queueDO.setDoctorTime(appointment.getDoctorTime());
+            // 闇�姹�1锛氳ˉ骞抽摵鐨勬偅鑰呬俊鎭潵婧愬瓧娈碉紙鐥呭巻鍖�/搴婂彿/鐢佃瘽/鏉ユ簮/灏辫瘖鍗″彿绛夛級
+            queueDO.setPatSrc(appointment.getPatSrc());
+            queueDO.setPatMobile(appointment.getPatMobile());
+            queueDO.setPatPhone(appointment.getPatPhone());
+            queueDO.setPatWardDesc(appointment.getPatWardDesc());
+            queueDO.setPatBedNo(appointment.getPatBedNo());
+            queueDO.setMedicalCard(appointment.getMedicalCard());
+            queueDO.setDoctorAdviceNo(appointment.getDoctorAdviceNo());
+            queueDO.setOutpatientNo(appointment.getOutpatientNo());
+            queueDO.setPatIdentityId(appointment.getPatIdentityId());
+        });
+    }
+
+    @Override
+
     public List<QueueDO> getRoomQueueByStatus(Long roomId, List<Integer> statusList) {
         List<QueueDO> queueDOList = queueMapper.getRoomQueueByStatus(roomId, statusList);
+        fillAppointmentInfo(queueDOList);
         return queueDOList;
     }
 
@@ -419,18 +496,33 @@
                 patientStatisticVO.setReadyNum(item.getTotalInStatus());
             } else if (QueueStatusEnum.FINISH.getStatus() == item.getStatus()) {
                 patientStatisticVO.setFinishedNum(item.getTotalInStatus());
-            } else if (QueueStatusEnum.PASSED.getStatus() == item.getStatus()) {
-                patientStatisticVO.setPassedNum(item.getTotalInStatus());
+            } else if (QueueStatusEnum.PASSED.getStatus() == item.getStatus()
+                    || QueueStatusEnum.PASSED_WAITING.getStatus() == item.getStatus()) {
+                // 銆愰渶姹�4 鍙e緞缁熶竴銆戣繃鍙� = 宸茶繃鍙�(5) + 宸茶繃鍙�-鎺掗槦(3)銆�
+                // 鍘熷厛鍙畻 5锛岃�屽垪琛ㄤ笌灞忓箷閮藉惈 3锛屽鑷�"杩囧彿"鏁板瓧姣斿疄闄呭皯銆�
+                int cur = patientStatisticVO.getPassedNum() == null ? 0 : patientStatisticVO.getPassedNum();
+                patientStatisticVO.setPassedNum(cur + item.getTotalInStatus());
             }
         });
 
         // 缁熻 璇ュ伐浣嶇被鍨嬬殑銆愭帓闃熶腑銆戜汉鍛樻暟閲�
+        // 銆怮7 纭銆戞澶勫埢鎰忕粺璁�**鍏ㄩ」鐩�**锛堣宸ヤ綅鎵�鍚鏌ョ被鍨嬶級鐨�"鎺掗槦涓�"鎬绘暟锛�
+        // 璇箟涓�"鍏ㄩ櫌杩樻湁澶氬皯浜虹瓑鐫�鍋氳繖绫绘鏌�"锛屼笌"鏈伐浣嶄竴鐪煎彲瑙佺殑鍊欒瘖浜烘暟"浜掕ˉ銆�
+        // 涓斿凡琛� deleted=0 / book_date=浠婃棩锛堣 QueueMapper.checkTypeAndStatusStatistic锛夈��
         RoomDO roomDO = getRoomDO(roomId, bedNo);
         Integer[] checkTypes = roomDO.getCheckTypes();
-        List<Integer> statusList = new ArrayList<>();
-        statusList.add(QueueStatusEnum.WAITING.getStatus());
-        Integer num = queueMapper.checkTypeAndStatusStatistic(checkTypes, statusList);
-        patientStatisticVO.setQueuingNum(num);
+        int queuingNum = 0;
+        // 銆愰槻寰°�慶heckTypes 涓虹┖鏃朵笉鑳芥嫾 `book_check_type in ()`锛圡ySQL 璇硶閿欒锛夈��
+        // 瀹炴祴璇ュ満鏅細璁╃粺璁℃帴鍙� 500锛岃繘鑰屽鑷村尰鐢熺椤堕儴缁熻鏁村潡鎶ラ敊銆�
+        if (checkTypes != null && checkTypes.length > 0) {
+            List<Integer> statusList = new ArrayList<>();
+            statusList.add(QueueStatusEnum.WAITING.getStatus());
+            Integer num = queueMapper.checkTypeAndStatusStatistic(checkTypes, statusList);
+            queuingNum = num == null ? 0 : num;
+        } else {
+            log.warn("[getPatientStatistic][宸ヤ綅鏈厤缃鏌ョ被鍨嬶紝鎺掗槦涓寜 0 璁 roomId={} bedNo={}", roomId, bedNo);
+        }
+        patientStatisticVO.setQueuingNum(queuingNum);
 
         return patientStatisticVO;
     }
@@ -447,15 +539,23 @@
         });
 
         // 瑁呮満鐣岄潰锛氱粺璁� 璇ヨ瘖瀹� [宸查鐢╙ 鐨勬暟閲�, 鍥犱负瀹夎宸ヤ綅鐪嬩笉鍒� [宸查鐢╙ 鎮h�咃紝鎵�浠ユ棤娉曟牴鎹鏈哄伐浣嶆潵缁熻锛屽彧鑳芥寜璇婂缁熻
-        patientStatisticVO.setReceivedNum( 0 );
+        patientStatisticVO.setReceivedNum(0);
         List<BedQueueStatisticDO> roomQueueStatisticDOList = queueMapper.roomQueueStatistic(roomId);
         roomQueueStatisticDOList.forEach(item -> {
             if (QueueStatusEnum.RECEIVED.getStatus() == item.getStatus()) {
-                patientStatisticVO.setReceivedNum( patientStatisticVO.getReceivedNum() + item.getTotalInStatus() );
+                patientStatisticVO.setReceivedNum(patientStatisticVO.getReceivedNum() + item.getTotalInStatus());
             }
         });
 
         return patientStatisticVO;
+    }
+
+    @Override
+    public Integer recallPassWaitingPatient(String patId, Integer bookCheckType) {
+        // 浠� DB 鎶� 杩囧彿-鎺掗槦涓殑浜� 璁剧疆涓� 鎺掗槦涓�
+        Integer ret = queueMapper.updatePatientQueueStatus(patId, bookCheckType, QueueStatusEnum.PASSED_WAITING.getStatus(), QueueStatusEnum.WAITING.getStatus());
+
+        return ret;
     }
 
     public PatientStatisticVO getBedDevReadyStatistic(Long roomId, String bedNo) {
@@ -464,42 +564,59 @@
         bedQueueStatisticDOList.forEach(item -> {
             if (QueueStatusEnum.READY.getStatus() == item.getStatus()) {
                 patientStatisticVO.setReadyNum(item.getTotalInStatus());
-            } else if (QueueStatusEnum.PASSED.getStatus() == item.getStatus()) {
-                patientStatisticVO.setPassedNum(item.getTotalInStatus());
+            } else if (QueueStatusEnum.PASSED.getStatus() == item.getStatus()
+                    || QueueStatusEnum.PASSED_WAITING.getStatus() == item.getStatus()) {
+                // 銆愰渶姹�4 鍙e緞缁熶竴銆戣繃鍙� = 宸茶繃鍙�(5) + 宸茶繃鍙�-鎺掗槦(3)銆�
+                //
+                // 涓� getPatientStatistic 淇濇寔鍚屼竴鍙e緞銆傚師瀹炵幇鍙垽 PASSED(5)锛�
+                // 鑰岄鐢ㄧ晫闈㈢殑鍒楄〃/灞忓箷閮藉惈 status=3锛屽鑷淬�岃繃鍙枫�嶆暟瀛楁瘮瀹為檯灏�
+                // 鈥斺�� 杩欐鏄敤鎴峰弽棣堢殑銆岀粺璁′笌瀹為檯涓嶇銆嶃��
+                //
+                // 鍙︼細鍘熷疄鐜扮敤 setPassedNum(item.getTotalInStatus())锛�**瑕嗙洊**鑰岄潪绱姞锛夛紝
+                // 鍥� SQL 鏄� group by status锛宻tatus=3 涓� status=5 鏄袱琛岋紝
+                // 瑕嗙洊浼氬彧淇濈暀鏈�鍚庝竴琛� 鈫� 鏀逛负绱姞銆�
+                int cur = patientStatisticVO.getPassedNum() == null ? 0 : patientStatisticVO.getPassedNum();
+                patientStatisticVO.setPassedNum(cur + item.getTotalInStatus());
             }
         });
 
         // 棰嗙敤鐣岄潰锛氱粺璁� 璇ヨ瘖瀹� [宸查鐢╙ 鐨勬暟閲�, 鍥犱负瀹夎鏃舵偅鑰呭綊灞炲伐浣嶄粠棰嗙敤宸ヤ綅鍙樻洿鍒板畨瑁呭伐浣嶏紝鎵�浠ユ棤娉曟牴鎹鐢ㄥ伐浣嶆潵缁熻锛屽彧鑳芥寜璇婂缁熻
-        patientStatisticVO.setReceivedNum( 0 );
+        patientStatisticVO.setReceivedNum(0);
         List<BedQueueStatisticDO> roomQueueStatisticDOList = queueMapper.roomQueueStatistic(roomId);
         roomQueueStatisticDOList.forEach(item -> {
             if (QueueStatusEnum.RECEIVED.getStatus() == item.getStatus()) {
-                patientStatisticVO.setReceivedNum( patientStatisticVO.getReceivedNum() + item.getTotalInStatus() );
+                patientStatisticVO.setReceivedNum(patientStatisticVO.getReceivedNum() + item.getTotalInStatus());
             } else if (QueueStatusEnum.INSTALLING.getStatus() == item.getStatus()) {
-                patientStatisticVO.setReceivedNum( patientStatisticVO.getReceivedNum() + item.getTotalInStatus() );
+                patientStatisticVO.setReceivedNum(patientStatisticVO.getReceivedNum() + item.getTotalInStatus());
             } else if (QueueStatusEnum.FINISH.getStatus() == item.getStatus()) {
-                patientStatisticVO.setReceivedNum(patientStatisticVO.getReceivedNum() + item.getTotalInStatus() );
+                patientStatisticVO.setReceivedNum(patientStatisticVO.getReceivedNum() + item.getTotalInStatus());
             }
         });
 
         // 缁熻 璇ュ伐浣嶇被鍨嬬殑銆愭帓闃熶腑銆戜汉鍛樻暟閲�
         RoomDO roomDO = getRoomDO(roomId, bedNo);
         Integer[] checkTypes = roomDO.getCheckTypes();
-        List<Integer> statusList = new ArrayList<>();
-        statusList.add(QueueStatusEnum.WAITING.getStatus());
-        Integer num = queueMapper.checkTypeAndStatusStatistic(checkTypes, statusList);
-        patientStatisticVO.setQueuingNum(num);
+        Integer num = 0;
+        // 銆愰槻寰°�慶heckTypes 涓虹┖鏃朵笉鑳芥嫾 `book_check_type in ()`锛圡ySQL 璇硶閿欒锛夛紝
+        // 瀹炴祴璇ュ満鏅細璁╃粺璁℃帴鍙� 500銆佸尰鐢熺椤堕儴缁熻鏁村潡鎶ラ敊銆備笌 getPatientStatistic 淇濇寔涓�鑷淬��
+        if (checkTypes != null && checkTypes.length > 0) {
+            List<Integer> statusList = new ArrayList<>();
+            statusList.add(QueueStatusEnum.WAITING.getStatus());
+            num = queueMapper.checkTypeAndStatusStatistic(checkTypes, statusList);
+        } else {
+            log.warn("[getBedDevReadyStatistic][宸ヤ綅鏈厤缃鏌ョ被鍨嬶紝鎺掗槦涓寜 0 璁 roomId={} bedNo={}", roomId, bedNo);
+        }
+        patientStatisticVO.setQueuingNum(num == null ? 0 : num);
 
         return patientStatisticVO;
     }
 
     public void initCheckType() {
-        queueServiceTxFunctions.initCheckType( );
+        queueServiceTxFunctions.initCheckType();
     }
 
     public void startBiz() {
-        if (1 == queueServiceTxFunctions.getOpeningFlag())
-            return;
+        if (1 == queueServiceTxFunctions.getOpeningFlag()) return;
 
         queueServiceTxFunctions.setOpeningFlag(1);
         startBedReload();
@@ -512,8 +629,7 @@
 
     @Override
     public Integer recallPatient(Long roomId, String bedNo, String patId, Integer checkType) {
-        Integer updateNum = queueMapper.recallPassedPatient(roomId, bedNo, patId, checkType,
-                QueueStatusEnum.PASSED.getStatus(), QueueStatusEnum.RECALLED.getStatus());
+        Integer updateNum = queueMapper.recallPassedPatient(roomId, bedNo, patId, checkType, QueueStatusEnum.PASSED.getStatus(), QueueStatusEnum.RECALLED.getStatus());
 
         // 妫�鏌ラ」鐩�.浜插拰鎬� 涓嶉渶瑕佸湪杩欓噷澶勭悊
         // 浼氬湪 HurryUpOnBed 閲岄潰澶勭悊 妫�鏌ラ」鐩�.浜插拰鎬�
@@ -522,15 +638,81 @@
         return updateNum;
     }
 
+    // ==================== 闇�姹�2锛氭挙閿�銆屽彨鍙� / 妫�鏌ュ畬鎴愩�� ====================
+
+    /**
+     * 鎾ら攢銆屾鏌ュ畬鎴愩�嶏細鎶婃湰宸ヤ綅浠婃棩鐨勬寚瀹氭偅鑰呬粠 宸插氨璇�(40) 閫�鍥� **鍊欒瘖涓�(20)**銆�
+     * <p>
+     * <b>Q9 纭</b>锛氭挙閿�鍚庡洖鍒�**鍊欒瘖鍖�**锛堣�岄潪"灏辫瘖涓�"锛夛紝渚夸簬鍖荤敓閲嶆柊鍙彿銆�
+     * <p>
+     * 鏀跺熬蹇呴』璋� {@link #startHurryUpOneBed}锛氬畠浼氶噸鏂拌绠楄宸ヤ綅鐨�
+     * {@code readyPatNum} 骞跺埛鏂板垎娴侀槦鍒椾紭鍏堢骇銆傝嫢涓嶅悓姝ュ唴瀛樿鏁帮紝
+     * {@code hurryupOneCheckType} 浼氭姏鍑� {@code exceed max queue number}銆�
+     *
+     * @return 鍙楀奖鍝嶈鏁帮紙0 琛ㄧず娌℃壘鍒拌鎮h�呬粖鏃ョ殑宸插畬鎴愯褰曪級
+     */
+    @Override
+    public Integer undoFinishPatient(Long roomId, String bedNo, String patId, Integer checkType) {
+        Integer updateNum = queueMapper.undoFinishPatient(roomId, bedNo, patId, checkType,
+                QueueStatusEnum.FINISH.getStatus(), QueueStatusEnum.READY.getStatus());
+        if (null != updateNum && updateNum > 0) {
+            startHurryUpOneBed(roomId, bedNo);
+        }
+        return updateNum;
+    }
+
+    /**
+     * 鎾ら攢銆岃鐐瑰彨鍙枫�嶏細鎶婃湰宸ヤ綅褰撳墠 灏辫瘖涓�(30) 鐨勬偅鑰呴��鍥� **鍊欒瘖涓�(20)**銆�
+     *
+     * @return 鍙楀奖鍝嶈鏁帮紙0 琛ㄧず褰撳墠娌℃湁灏辫瘖涓殑鎮h�咃級
+     */
+    @Override
+    public Integer undoCallPatient(Long roomId, String bedNo) {
+        Integer updateNum = queueMapper.undoCallPatient(roomId, bedNo,
+                QueueStatusEnum.ONSTAGE.getStatus(), QueueStatusEnum.READY.getStatus());
+        if (null != updateNum && updateNum > 0) {
+            startHurryUpOneBed(roomId, bedNo);
+        }
+        return updateNum;
+    }
+
+    @Override
+    public QueueDO getBedLastFinishedQueueItem(Long roomId, String bedNo) {
+        return queueMapper.getBedLastFinishedQueueItem(roomId, bedNo, QueueStatusEnum.FINISH.getStatus());
+    }
+
+    // ==================== 闇�姹�3锛氬仠姝㈠�欒瘖寮�鍏� ====================
+
+    @Override
+    public ErrorCode setStopReady(Long roomId, String bedNo, boolean stop) {
+        // 璧板崟绾跨▼鎵ц鍣紝涓� bedDoctorPause/Resume 淇濇寔涓�鑷寸殑涓茶鍖栧鐞嗭紝
+        // 閬垮厤涓庡垎娴侀槦鍒楃殑骞跺彂淇敼鍐茬獊銆�
+        Future<ErrorCode> future = singleThreadExecutor.submit(
+                () -> queueServiceTxFunctions.setStopReady(roomId, bedNo, stop));
+        try {
+            return future.get();
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            log.error("[setStopReady] 琚腑鏂� roomId={} bedNo={}", roomId, bedNo, e);
+        } catch (ExecutionException e) {
+            log.error("[setStopReady] 鎵ц寮傚父 roomId={} bedNo={}", roomId, bedNo, e);
+        }
+        return ECG_INNER_ERROR;
+    }
+
+    @Override
+    public Boolean getStopReady(Long roomId, String bedNo) {
+        return queueServiceTxFunctions.getStopReady(roomId, bedNo);
+    }
+
     @Override
     public Integer recallInstallPatient(Long roomId, String bedNo, String patId, Integer checkType, Long roomId_operator, String bedNo_operator) {
-        Integer updateNum = queueMapper.recallPassedInstallPatient(roomId, bedNo_operator, patId, checkType,
-                QueueStatusEnum.PASSED_INSTALL.getStatus(), QueueStatusEnum.RECALLED_INSTALL.getStatus());
+        Integer updateNum = queueMapper.recallPassedInstallPatient(roomId, bedNo_operator, patId, checkType, QueueStatusEnum.PASSED_INSTALL.getStatus(), QueueStatusEnum.RECALLED_INSTALL.getStatus());
 
         // 妫�鏌ラ」鐩�.浜插拰鎬� 澶勭悊
         if (null != updateNum && 1 == updateNum) {
-            CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem( checkType );
-            if ( checkTypeDO.getAffinityCheckTypes().length > 0) {
+            CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem(checkType);
+            if (checkTypeDO.getAffinityCheckTypes().length > 0) {
                 procAffinityWhenInstallRecall(patId, checkTypeDO.getAffinityCheckTypes(), roomId_operator, bedNo_operator);
             }
         }
@@ -540,34 +722,46 @@
         return updateNum;
     }
 
+    /**
+     * 鍔犳��
+     *
+     * @param patId
+     * @param jumped
+     * @return
+     */
     @Override
-    public Integer patientJump(String patId, Byte jumped) {
-        Integer updateNum = queueMapper.queueJump(patId, QueueStatusEnum.WAITING.getStatus(), jumped);
+    public Integer patientJump(String patId, Integer bookCheckType, Byte jumped) {
+        Integer updateNum = queueMapper.queueJump(patId, bookCheckType, QueueStatusEnum.WAITING.getStatus(), jumped);
 
-        QueueDO queueDO = queueMapper.getQueueByPatId(patId);
+        QueueDO queueDO = queueMapper.getQueueByPatId(patId, bookCheckType);
         startHurryUpOneCheckType(Integer.valueOf(queueDO.getBookCheckType()));
         return updateNum;
     }
 
     @Override
-    public RoomDO getDocRoomInfo(Long docId) {
+    public List<RoomDO> getDocRoomInfo(Long docId) {
         return roomMapper.getRoomByDocId(docId);
     }
 
     /**
-     * 鑾峰彇 鎸囧畾宸ヤ綅 寰呮鏌寰呴鐢ㄧ殑浜�
+     * 鑾峰彇 鎸囧畾宸ヤ綅  銆愭鏌棰嗙敤銆戠浉鍏崇殑鎮h��
+     *
      * @param roomId
      * @param bedNo
      * @return
      */
     @Override
-    public List<QueueDO> getToBeCheckedPatient(Long roomId, String bedNo) {
+    public List<QueueDO> getCheckRelatedPatient(Long roomId, String bedNo) {
         List<Integer> queueStatusList = new ArrayList<>();
         queueStatusList.add(QueueStatusEnum.RECALLED.getStatus());
         queueStatusList.add(QueueStatusEnum.READY.getStatus());
         queueStatusList.add(QueueStatusEnum.ONSTAGE.getStatus());
         queueStatusList.add(QueueStatusEnum.PASSED.getStatus());
-        queueStatusList.add(QueueStatusEnum.AFFINITY_WAITING.getStatus());
+        // 銆愰渶姹�4 鍙e緞缁熶竴銆戣ˉ涓� PASSED_WAITING(3)銆屽凡杩囧彿-鎺掗槦銆嶃��
+        // 鍘熷厛鍒楄〃鍙惈 5锛岃�屽ぇ灞�/璇婇棿灞忔煡璇㈠惈 3锛屽鑷村悓涓�鎮h�呭湪涓嶅悓鐣岄潰鍑虹幇涓庡惁涓嶄竴鑷达紱
+        // 缁熻渚т篃灏� 3 璁″叆"杩囧彿"锛堣 getPatientStatistic / getBedDevReadyStatistic锛夈��
+        queueStatusList.add(QueueStatusEnum.PASSED_WAITING.getStatus());
+        queueStatusList.add(QueueStatusEnum.AFFINITY.getStatus());
         List<QueueDO> queueDOList = getBedQueueByStatus(roomId, bedNo, queueStatusList);
 
         //鎶� [浜插拰鐨刔 鎸埌涓婚」鍚庨潰
@@ -575,14 +769,14 @@
         ListIterator<QueueDO> iterator = queueDOList.listIterator();
         while (iterator.hasNext()) {
             QueueDO item = iterator.next();
-            if (item.getStatus() == QueueStatusEnum.AFFINITY_WAITING.getStatus()) {
+            if (item.getStatus() == QueueStatusEnum.AFFINITY.getStatus()) {
                 iterator.remove();
                 affinityWaitingList.add(item);
             }
         }
-        affinityWaitingList.forEach( affinityWaitingItem -> {
-            for (int i = queueDOList.size()-1; i >= 0; i--) {
-                if ( affinityWaitingItem.getSeqNum() == queueDOList.get(i).getSeqNum() ) {
+        affinityWaitingList.forEach(affinityWaitingItem -> {
+            for (int i = queueDOList.size() - 1; i >= 0; i--) {
+                if (affinityWaitingItem.getSeqNum() == queueDOList.get(i).getSeqNum()) {
                     queueDOList.add(i + 1, affinityWaitingItem);
                     break;
                 }
@@ -592,69 +786,138 @@
         return queueDOList;
     }
 
+    /**
+     * 鑾峰彇 鎸囧畾宸ヤ綅  銆愬畨瑁呫�戠浉鍏崇殑鎮h��
+     *
+     * @param roomId
+     * @param bedNo
+     * @return
+     */
     @Override
-    public List<QueueDO> getToBeInstalledPatient(Long roomId, String bedNo) {
+    public List<QueueDO> getInstallRelatedPatient(Long roomId, String bedNo) {
         List<Integer> queueStatusList = new ArrayList<>();
         queueStatusList.add(QueueStatusEnum.RECEIVED.getStatus());
         queueStatusList.add(QueueStatusEnum.PASSED_INSTALL.getStatus());
-        queueStatusList.add(QueueStatusEnum.AFFINITY_RECEIVED.getStatus());
-        List<QueueDO> queueDOList = getRoomQueueByStatus(roomId, queueStatusList);
+        queueStatusList.add(QueueStatusEnum.AFFINITY_INSTALL.getStatus());
+        queueStatusList.add(QueueStatusEnum.RECALLED_INSTALL.getStatus());
+        List<QueueDO> queueDOList = getRoomQueueByStatus(roomId, queueStatusList); // 鍙互鐪嬪埌鏈瘖瀹� 寰呭畨瑁呯殑鎮h��
 
         queueStatusList.clear();
         queueStatusList.add(QueueStatusEnum.INSTALLING.getStatus());
-        queueStatusList.add(QueueStatusEnum.RECALLED_INSTALL.getStatus());
-        queueDOList.addAll(0, getBedQueueByStatus(roomId, bedNo, queueStatusList) );
+        queueDOList.addAll(0, getBedQueueByStatus(roomId, bedNo, queueStatusList)); // 褰撳墠宸ヤ綅鐨�
+
+        // ======================================================================
+        // 銆愪慨澶嶃�戝彧淇濈暀銆岄渶瑕佽澶囬鐢ㄣ�嶇殑妫�鏌ラ」鐩��
+        //
+        // 鑳屾櫙锛氫笂闈袱澶勬煡璇㈢殑鏉′欢鏄� `room_id = ? AND status IN (...)`
+        // 锛坓etRoomQueueByStatus 鐢氳嚦**涓嶅惈 bed_no**锛夛紝**瀹屽叏涓嶇湅 book_check_type**銆�
+        // 鑰岃嚜鍔ㄥ垎娴侊紙preemptWaitingPatientWithBedCheckTypes锛夋槸**鎸夊伐浣� checkTypes 杩囨护**鐨勶紝
+        // 鎵�浠ュ彧鏈�"浜哄伐鎶婃偅鑰呮媺杩涙潵"杩欐潯璺緞浼氭紡 鈥斺�� 琛ㄧ幇涓�
+        // 銆岃澶囬鐢ㄣ�嶉〉閿欒鍑虹幇甯歌蹇冪數鍥�(100)銆佸钩鏉胯繍鍔ㄥ績鐢�(400)绛�**涓嶉渶棰嗙敤璁惧**鐨勬偅鑰呫��
+        //
+        // 鍒ゅ畾渚濇嵁鐢ㄩ厤缃� `check_type.need_dev_ready`锛�
+        //   1 = 闇�瑕佽澶囬鐢紙濡� 鍔ㄦ�佸績鐢� 200銆佸姩鎬佽鍘� 300锛�
+        //   0 = 涓嶉渶瑕侊紙甯歌蹇冪數鍥俱�佸钩鏉胯繍鍔ㄥ績鐢� 鈥︼級
+        //
+        // 鏀惧湪鏈嶅姟灞傝�屼笉鏄敼 SQL锛氫竴娆℃煡璇㈠緱鍒伴泦鍚堝悗鍦ㄥ唴瀛樿繃婊わ紝閫昏緫闆嗕腑銆佹槗璇伙紝
+        // 涓斾笉闇�瑕佷负澶氭暟鎹簮/鍔ㄦ�佽〃鍚嶉澶栬皟鏁� SQL銆傛湰璇婂寰呭畨瑁呮偅鑰呴噺绾у緢灏忥紙鍑犲崄琛岋級銆�
+        // ======================================================================
+        queueDOList = filterNeedDevReady(queueDOList);
+
+        // 娉ㄦ剰锛氫笅闈㈢敤 lambda锛屾崟鑾风殑鍙橀噺蹇呴』鏄� effectively final锛�
+        // 鏁呰繖閲屽彟璧蜂竴涓� final 鍙橀噺锛岃�屼笉鏄鐢ㄤ笂闈㈢殑 queueDOList锛堝畠宸茶閲嶆柊璧嬪�硷級銆�
+        final List<QueueDO> installQueueList = queueDOList;
 
         //鎶� [浜插拰鐨刔 鎸埌涓婚」鍚庨潰
         List<QueueDO> affinityReceivedList = new ArrayList<>();
-        ListIterator<QueueDO> iterator = queueDOList.listIterator();
+        ListIterator<QueueDO> iterator = installQueueList.listIterator();
         while (iterator.hasNext()) {
             QueueDO item = iterator.next();
-            if (item.getStatus() == QueueStatusEnum.AFFINITY_RECEIVED.getStatus()) {
+            if (item.getStatus() == QueueStatusEnum.AFFINITY_INSTALL.getStatus()) {
                 iterator.remove();
                 affinityReceivedList.add(item);
             }
         }
-        affinityReceivedList.forEach( affinityReceivedItem -> {
-            for (int i = queueDOList.size()-1; i >= 0; i--) {
-                if ( affinityReceivedItem.getSeqNum() == queueDOList.get(i).getSeqNum() ) {
-                    queueDOList.add(i + 1, affinityReceivedItem);
+        affinityReceivedList.forEach(affinityReceivedItem -> {
+            for (int i = installQueueList.size() - 1; i >= 0; i--) {
+                if (affinityReceivedItem.getSeqNum() == installQueueList.get(i).getSeqNum()) {
+                    installQueueList.add(i + 1, affinityReceivedItem);
                     break;
                 }
             }
         });
 
-        return queueDOList;
+        return installQueueList;
+    }
+
+    /**
+     * 鍙繚鐣欍�岄渶瑕佽澶囬鐢ㄣ�嶏紙{@code check_type.need_dev_ready = 1}锛夌殑妫�鏌ラ」鐩殑鎮h�呫��
+     *
+     * <p>鐢ㄤ簬銆岃澶囬鐢� / 瑁呮満銆嶅彇鏁帮細杩欎簺宸ヤ綅鍙簲澶勭悊闇�瑕侀鐢ㄨ澶囩殑妫�鏌ラ」鐩紝
+     * 鍚﹀垯浼氬嚭鐜板父瑙勫績鐢靛浘绛夋偅鑰呮贩鍏ヨ澶囨祦绋嬨��
+     *
+     * <p>閰嶇疆寮傚父锛堟煡涓嶅埌妫�鏌ラ」鐩級鏃�**杩斿洖鍘熷垪琛�**锛屽畞鍙鏄剧ず涔熶笉瑕佹妸鎮h��"钘忚捣鏉�"銆�
+     */
+    private List<QueueDO> filterNeedDevReady(List<QueueDO> queueDOList) {
+        if (null == queueDOList || queueDOList.isEmpty()) {
+            return queueDOList;
+        }
+        List<CheckTypeDO> needDevList = checkTypeMapper.selectList(
+                new LambdaQueryWrapperX<CheckTypeDO>().eq(CheckTypeDO::getNeedDevReady, 1));
+        if (null == needDevList || needDevList.isEmpty()) {
+            log.warn("[filterNeedDevReady] 鏈厤缃换浣昜闇�瑕佽澶囬鐢╙鐨勬鏌ラ」鐩紝璺宠繃杩囨护浠ュ厤鎮h�呭叏閮ㄤ笉鍙");
+            return queueDOList;
+        }
+        Set<Integer> needDevCheckTypes = new HashSet<>();
+        needDevList.forEach(ct -> {
+            if (null != ct.getValue()) {
+                needDevCheckTypes.add(ct.getValue());
+            }
+        });
+
+        List<QueueDO> filtered = new ArrayList<>();
+        for (QueueDO item : queueDOList) {
+            if (needDevCheckTypes.contains(item.getBookCheckType())) {
+                filtered.add(item);
+            } else {
+                log.info("[filterNeedDevReady] 杩囨护鎺変笉闇�瑕佽澶囬鐢ㄧ殑鎮h��. patId={} 妫�鏌ラ」鐩�={} 鐘舵��={}",
+                        item.getPatId(), item.getBookCheckType(), item.getStatus());
+            }
+        }
+        return filtered;
     }
 
     private RoomDO getRoomDO(Long roomId, String bedNo) {
-        RoomDO roomDO = mapRoomBed.get( Utils.formatRoomBed(roomId, bedNo) );
-        if ( null == roomDO)
-            roomDO = roomMapper.getRoom(roomId, bedNo);
+        RoomDO roomDO = mapRoomBed.get(Utils.formatRoomBed(roomId, bedNo));
+        if (null == roomDO) roomDO = roomMapper.getRoom(roomId, bedNo);
 
         return roomDO;
     }
 
+    /**
+     * 瑁呮満鍙洖锛屾槸鎶㈠崰寮忕殑锛屼細鏀瑰彉瑁呮満宸ヤ綅
+     */
     private void procAffinityWhenInstallRecall(String patId, Integer[] affinityCheckTypes, Long roomId_operator, String bedNo_operator) {
-        List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckTypesAndStatus(
-                        patId, affinityCheckTypes, QueueStatusEnum.AFFINITY_RECEIVED.getStatus());
+        List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckTypesAndStatus(patId, affinityCheckTypes, QueueStatusEnum.AFFINITY_INSTALL.getStatus());
         for (int i = 0; i < affinityItems.size(); i++) {
             QueueDO queueItem = affinityItems.get(i);
-            queueItem.setRoomId( roomId_operator );
-            queueItem.setBedNo( bedNo_operator );
+            queueItem.setRoomId(roomId_operator);
+            queueItem.setBedNo(bedNo_operator);
             //queueItem.setSeqNum( preemptQueueItem.getSeqNum() );  // 瑁呮満鏃� 鍐呴儴搴忓彿涓嶅彉 鏁呬笉闇�鏇存柊
             queueMapper.updateById(queueItem);
         }
     }
 
+    /**
+     * 棰勭害纭鍚庯紝涓诲姩瀵绘眰渚濋檮
+     */
     private void procAffinityWhenQueue(/*IN, OUT*/QueueSaveReqVO queueSaveReqVO, Integer[] affinityCheckTypes) {
-        // 濡傛灉瀛樺湪 澶勪簬 [灏辫瘖鍑嗗涓璢 | [灏辫瘖涓璢 鐨勪翰鍜岄」锛屽垯璺熼殢鍏朵腑涓�涓翰鍜岄」
-        List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckTypesAndStatusList(
-                queueSaveReqVO.getPatId(), affinityCheckTypes,
-                List.of(QueueStatusEnum.READY.getStatus(), QueueStatusEnum.ONSTAGE.getStatus()));
+        // 濡傛灉瀛樺湪 [鍊欒瘖涓璢 [灏辫瘖涓璢 [杩囧彿] [宸插彫鍥瀅 鑳借渚濋檮鐨勬鏌ラ」锛屽垯渚濋檮鍒板叾涓竴涓�
+        List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckTypesAndStatusList(queueSaveReqVO.getPatId(), affinityCheckTypes, List.of(QueueStatusEnum.READY.getStatus(), QueueStatusEnum.ONSTAGE.getStatus(), QueueStatusEnum.PASSED.getStatus(), QueueStatusEnum.RECALLED.getStatus()));
         if (!affinityItems.isEmpty()) {
             QueueDO queueItem = affinityItems.get(0);
-            queueSaveReqVO.setStatus(QueueStatusEnum.AFFINITY_WAITING.getStatus()); // [浜插拰-鎺掗槦] 鐘舵��
+            queueSaveReqVO.setStatus(QueueStatusEnum.AFFINITY.getStatus()); // [浜插拰-鎺掗槦] 鐘舵��
+            queueSaveReqVO.setAffinityItem(1);
             queueSaveReqVO.setRoomId(queueItem.getRoomId());
             queueSaveReqVO.setRoomName(queueItem.getRoomName());
             queueSaveReqVO.setBedNo(queueItem.getBedNo());

--
Gitblit v1.9.3