jh-module-ecg/jh-module-ecg-api/src/main/java/cn/lihu/jh/module/ecg/enums/QueueStatusEnum.java
@@ -19,7 +19,8 @@ PASSED(5, "已过号"), PASSED_INSTALL(7, "已过号-安装"), WAITING(10, "排队中"), AFFINITY_ALREADY(12, "已亲和"), AFFINITY_WAITING(12, "已亲和-排队中"), AFFINITY_RECEIVED(13, "已亲和-已领用"), RECALLED(15, "已召回"), RECALLED_INSTALL(17, "已召回-安装"), READY(20, "候诊中"), jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/queue/QueueMapper.java
@@ -73,7 +73,18 @@ " </foreach> )" + " and TO_DAYS(book_date) = TO_DAYS(NOW()) " + "</script>") List<QueueDO> getCurPatGivenCheckItems(@Param("patId")String patId, @Param("checkTypeList")Integer[] arrCheckType); List<QueueDO> getCurPatGivenCheckTypes(@Param("patId")String patId, @Param("checkTypeList")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>") List<QueueDO> getCurPatGivenCheckTypesAndStatus(@Param("patId")String patId, @Param("checkTypeList")Integer[] arrCheckType, @Param("status")Integer status); @Select("<script>" + "SELECT * FROM lihu.queue " + @@ -149,7 +160,10 @@ "</script>") List<QueueDO> getBedQueueByStatus(@Param("roomId")Long roomId, @Param("bedNo")String bedNo, @Param("statusList")List<Integer> statusList); @Update("update lihu.queue set status = #{newStatus} where seq_num = \n" + @Select("SELECT * from lihu.queue where room_id = #{roomId} and bed_no = #{bedNo} and status = #{curStatus} order by seq_num limit 1") QueueDO getFirstItemByBedAndStatus(@Param("roomId")Long roomId, @Param("bedNo")String bedNo, @Param("curStatus")Integer curStatus); @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); jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/devrent/DevRentServiceImpl.java
@@ -3,14 +3,17 @@ import cn.lihu.jh.framework.common.pojo.CommonResult; import cn.lihu.jh.framework.security.core.util.SecurityFrameworkUtils; import cn.lihu.jh.module.ecg.controller.admin.jobrecord.vo.JobRecordSaveReqVO; import cn.lihu.jh.module.ecg.dal.dataobject.checktype.CheckTypeDO; import cn.lihu.jh.module.ecg.dal.dataobject.devmanage.DeviceDO; import cn.lihu.jh.module.ecg.dal.dataobject.jobrecord.JobRecordDO; import cn.lihu.jh.module.ecg.dal.dataobject.queue.QueueDO; import cn.lihu.jh.module.ecg.dal.mysql.devmanage.DeviceMapper; import cn.lihu.jh.module.ecg.dal.mysql.jobrecord.JobRecordMapper; import cn.lihu.jh.module.ecg.dal.mysql.queue.QueueMapper; import cn.lihu.jh.module.ecg.enums.DevRentStateEnum; import cn.lihu.jh.module.ecg.enums.DevStateEnum; import cn.lihu.jh.module.ecg.enums.QueueStatusEnum; import cn.lihu.jh.module.ecg.service.queue.QueueServiceTxFunctions; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import org.springframework.transaction.annotation.Transactional; @@ -40,6 +43,9 @@ @Service @Validated public class DevRentServiceImpl implements DevRentService { @Resource QueueServiceTxFunctions queueServiceTxFunctions; @Resource private DevRentMapper devRentMapper; @@ -183,8 +189,39 @@ } // 更新..队列状态 queueMapper.updateBedQueueStatus(createReqVO.getRoomId(), createReqVO.getBedNo(), QueueStatusEnum.ONSTAGE.getStatus(), QueueStatusEnum.RECEIVED.getStatus()); //queueMapper.updateBedQueueStatus(createReqVO.getRoomId(), createReqVO.getBedNo(), // QueueStatusEnum.ONSTAGE.getStatus(), QueueStatusEnum.RECEIVED.getStatus()); QueueDO firstOnStageQueueItem = queueMapper.getFirstItemByBedAndStatus(createReqVO.getRoomId(), createReqVO.getBedNo(), QueueStatusEnum.ONSTAGE.getStatus()); CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem( firstOnStageQueueItem.getBookCheckType() ); // QueueStatusEnum.ONSTAGE => QueueStatusEnum.RECEIVED firstOnStageQueueItem.setStatus(QueueStatusEnum.RECEIVED.getStatus()); // 默认状态 设置 // 检查项目.亲和性 处理逻辑 if (checkTypeDO.getAffinityCheckTypes().length > 0) { List<QueueDO> affinityInstallingItems = queueMapper.getCurPatGivenCheckTypesAndStatus(firstOnStageQueueItem.getPatId(), checkTypeDO.getAffinityCheckTypes(), QueueStatusEnum.INSTALLING.getStatus()); if (!affinityInstallingItems.isEmpty()) { firstOnStageQueueItem.setStatus(QueueStatusEnum.AFFINITY_RECEIVED.getStatus()); } } queueMapper.updateById( firstOnStageQueueItem ); // 检查项目.亲和性 处理逻辑 if (checkTypeDO.getAffinityCheckTypes().length > 0) { List<QueueDO> affinityReadyItems = queueMapper.getCurPatGivenCheckTypesAndStatus(firstOnStageQueueItem.getPatId(), checkTypeDO.getAffinityCheckTypes(), QueueStatusEnum.READY.getStatus()); if (!affinityReadyItems.isEmpty()) { QueueDO tmpQueueDO = affinityReadyItems.get(0); tmpQueueDO.setStatus(QueueStatusEnum.ONSTAGE.getStatus()); queueMapper.updateById(tmpQueueDO); } else { List<QueueDO> affinityAffinityWaitingItems = queueMapper.getCurPatGivenCheckTypesAndStatus(firstOnStageQueueItem.getPatId(), checkTypeDO.getAffinityCheckTypes(), QueueStatusEnum.AFFINITY_WAITING.getStatus()); if (!affinityAffinityWaitingItems.isEmpty()) { QueueDO tmpQueueDO = affinityAffinityWaitingItems.get(0); tmpQueueDO.setStatus(QueueStatusEnum.ONSTAGE.getStatus()); queueMapper.updateById(tmpQueueDO); } } } return CommonResult.success(rent_id); } @@ -257,8 +294,25 @@ } // 更新..队列状态 queueMapper.updateBedQueueStatus(createReqVO.getRoomId(), createReqVO.getBedNo(), QueueStatusEnum.INSTALLING.getStatus(), QueueStatusEnum.FINISH.getStatus()); //queueMapper.updateBedQueueStatus(createReqVO.getRoomId(), createReqVO.getBedNo(), // QueueStatusEnum.INSTALLING.getStatus(), QueueStatusEnum.FINISH.getStatus()); QueueDO firstInstallingQueueItem = queueMapper.getFirstItemByBedAndStatus(createReqVO.getRoomId(), createReqVO.getBedNo(), QueueStatusEnum.INSTALLING.getStatus()); // QueueStatusEnum.INSTALLING => QueueStatusEnum.FINISH firstInstallingQueueItem.setStatus(QueueStatusEnum.FINISH.getStatus()); // 默认状态 设置 queueMapper.updateById( firstInstallingQueueItem ); // 检查项目.亲和性 处理逻辑 CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem( firstInstallingQueueItem.getBookCheckType() ); if (checkTypeDO.getAffinityCheckTypes().length > 0) { List<QueueDO> affinityAffinityReceivedItems = queueMapper.getCurPatGivenCheckTypesAndStatus(firstInstallingQueueItem.getPatId(), checkTypeDO.getAffinityCheckTypes(), QueueStatusEnum.AFFINITY_RECEIVED.getStatus()); if (!affinityAffinityReceivedItems.isEmpty()) { QueueDO tmpQueueDO = affinityAffinityReceivedItems.get(0); tmpQueueDO.setStatus(QueueStatusEnum.INSTALLING.getStatus()); queueMapper.updateById(tmpQueueDO); } } return CommonResult.success(rent_id); } jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceImpl.java
@@ -323,18 +323,19 @@ // 处理 检查项目.亲和性 逻辑 CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem( queueSaveReqVO.getBookCheckType() ); if ( checkTypeDO.getAffinityCheckTypes().length > 0) { List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckItems(queueSaveReqVO.getPatId(), checkTypeDO.getAffinityCheckTypes()); List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckTypes(queueSaveReqVO.getPatId(), checkTypeDO.getAffinityCheckTypes()); //List<Integer> affinityItemIDs = affinityItems.stream().map(queueItem -> queueItem.getId()).toList(); //queueSaveReqVO.setAffinityItems(affinityItemIDs); for (int i=0; i < affinityItems.size(); i++) { QueueDO queueItem = affinityItems.get(i); if (QueueStatusEnum.READY.getStatus() == queueItem.getStatus() || QueueStatusEnum.ONSTAGE.getStatus() == queueItem.getStatus()) { queueSaveReqVO.setStatus(QueueStatusEnum.AFFINITY_ALREADY.getStatus()); //改变 排队状态 || QueueStatusEnum.ONSTAGE.getStatus() == queueItem.getStatus()) { queueSaveReqVO.setStatus(QueueStatusEnum.AFFINITY_WAITING.getStatus()); //改变 排队状态 queueSaveReqVO.setRoomId(queueItem.getRoomId()); queueSaveReqVO.setRoomName(queueItem.getRoomName()); queueSaveReqVO.setBedNo(queueItem.getBedNo()); queueSaveReqVO.setSeqNum(queueItem.getSeqNum()); break; } } jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceTxFunctions.java
@@ -30,7 +30,6 @@ import static cn.lihu.jh.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.lihu.jh.framework.common.pojo.CommonResult.error; import static cn.lihu.jh.module.ecg.Constants.*; import static cn.lihu.jh.module.ecg.enums.ErrorCodeConstants.*; /** @@ -243,6 +242,7 @@ return GlobalErrorCodeConstants.SUCCESS; } /* 2024.11.11 // 常规 或者 领用 时 医生 取下一位患者 public ErrorCode nextPatient(Long roomId, String bedNo) { // 从 DB 把该工位.序号最小的 [就诊准备中] 的人 设置为 [就诊中] (或领用中) @@ -251,6 +251,39 @@ // 该工位 没有 [就诊准备中] 人员 if (null == updateNum || 0 == updateNum) { return QUEUE_NOT_READY_PATIENT; } // 优先队列中 该工位 就诊准备中人的数量 减一 BedQueueBO bo = mapBedVsQueue.get( Utils.formatRoomBed( roomId, bedNo ) ); bo.queueNum.getAndDecrement(); // 可能已经【并发的】在 hurry-up 中改变了值 refreshPriorityQueue(bo); return GlobalErrorCodeConstants.SUCCESS; } */ // 常规 或者 领用 时 医生 取下一位患者 public ErrorCode nextPatient(Long roomId, String bedNo) { QueueDO firstReadyQueueItem = queueMapper.getFirstItemByBedAndStatus(roomId, bedNo, QueueStatusEnum.READY.getStatus()); // 该工位 没有 [就诊准备中] 人员 if (null == firstReadyQueueItem) { return QUEUE_NOT_READY_PATIENT; } // QueueStatusEnum.READY => QueueStatusEnum.ONSTAGE firstReadyQueueItem.setStatus(QueueStatusEnum.ONSTAGE.getStatus()); queueMapper.updateById( firstReadyQueueItem ); // 检查项目.亲和性 处理逻辑 CheckTypeDO checkTypeDO = getCheckTypeItem( firstReadyQueueItem.getBookCheckType() ); if (checkTypeDO.getAffinityCheckTypes().length > 0) { List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckTypesAndStatus(firstReadyQueueItem.getPatId(), checkTypeDO.getAffinityCheckTypes(), QueueStatusEnum.AFFINITY_WAITING.getStatus()); if (!affinityItems.isEmpty()) { QueueDO tmpQueueDO = affinityItems.get(0); tmpQueueDO.setStatus( QueueStatusEnum.READY.getStatus() ); queueMapper.updateById( tmpQueueDO ); return GlobalErrorCodeConstants.SUCCESS; // 准备中 数量没有变化,故直接返回 } } // 优先队列中 该工位 就诊准备中人的数量 减一 @@ -422,10 +455,11 @@ QueueDO queueDO = queueMapper.getQueueItemBySeqNum(curSeqNum.get() + 1); CheckTypeDO checkTypeDO = getCheckTypeItem( queueDO.getBookCheckType() ); if ( checkTypeDO.getAffinityCheckTypes().length > 0) { List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckItems(queueDO.getPatId(), checkTypeDO.getAffinityCheckTypes()); List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckTypesAndStatus(queueDO.getPatId(), checkTypeDO.getAffinityCheckTypes(), QueueStatusEnum.WAITING.getStatus()); for (int i = 0; i < affinityItems.size(); i++) { QueueDO queueItem = affinityItems.get(i); queueItem.setStatus(QueueStatusEnum.AFFINITY_ALREADY.getStatus()); //改变 排队状态 queueItem.setStatus(QueueStatusEnum.AFFINITY_WAITING.getStatus()); //改变 排队状态 queueItem.setRoomId(queueItem.getRoomId()); queueItem.setRoomName(queueItem.getRoomName()); queueItem.setBedNo(queueItem.getBedNo());