jh-module-ecg/jh-module-ecg-api/src/main/java/cn/lihu/jh/module/ecg/enums/QueueStatusEnum.java
@@ -19,6 +19,7 @@ PASSED(5, "已过号"), PASSED_INSTALL(7, "已过号-安装"), WAITING(10, "排队中"), AFFINITY_ALREADY(12, "已亲和"), RECALLED(15, "已召回"), RECALLED_INSTALL(17, "已召回-安装"), READY(20, "候诊中"), jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/queue/vo/QueueSaveReqVO.java
@@ -1,11 +1,14 @@ package cn.lihu.jh.module.ecg.controller.admin.queue.vo; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import io.swagger.v3.oas.annotations.media.Schema; import lombok.*; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; import java.time.LocalDate; import java.util.List; @Schema(description = "管理后台 - 排队新增/修改 Request VO") @@ -73,4 +76,7 @@ @Schema(description = "诊疗床编号") private String bedNo; } @Schema(description = "亲和的检查项") private List<Integer> affinityItems; } jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/dataobject/queue/QueueDO.java
@@ -1,17 +1,19 @@ package cn.lihu.jh.module.ecg.dal.dataobject.queue; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; import lombok.*; import com.baomidou.mybatisplus.annotation.*; import cn.lihu.jh.framework.mybatis.core.dataobject.BaseDO; import java.time.LocalDate; import java.util.List; /** * 排队 DO * * @author 芋道源码 */ @TableName("queue") @TableName( value="queue", autoResultMap = true ) @KeySequence("queue_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 @Data @EqualsAndHashCode(callSuper = true) @@ -94,5 +96,10 @@ * 诊疗床编号 */ private String bedNo; /** * 亲和项 */ @TableField(typeHandler = JacksonTypeHandler.class) private List<Integer> affinityItems; } } jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/queue/QueueMapper.java
@@ -39,6 +39,9 @@ @Select("SELECT max(seq_num) FROM lihu.queue") Integer getMaxSeqNum(); @Select("SELECT * FROM lihu.queue where seq_num = #{seqNum}") QueueDO getQueueItemBySeqNum(@Param("seqNum")Integer seqNum); @Select("SELECT * FROM lihu.queue where pat_id = #{patId}") QueueDO getQueueByPatId(@Param("patId")String patId); @@ -64,6 +67,16 @@ @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>") List<QueueDO> getCurPatGivenCheckItems(@Param("patId")String patId, @Param("checkTypeList")Integer[] arrCheckType); @Select("<script>" + "SELECT * FROM lihu.queue " + "where id >= #{from} and status in (" + " <foreach collection='statusList' separator=',' item='status'>" + " #{status} " + jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/appointment/AppointmentServiceImpl.java
@@ -3,12 +3,14 @@ import cn.lihu.jh.framework.common.util.date.DateUtils; import cn.lihu.jh.framework.common.util.date.LocalDateTimeUtils; import cn.lihu.jh.module.ecg.controller.admin.queue.vo.QueueSaveReqVO; import cn.lihu.jh.module.ecg.dal.dataobject.checktype.CheckTypeDO; import cn.lihu.jh.module.ecg.feign.RemoteDataService; import cn.lihu.jh.module.ecg.feign.RestApiReqBodyVo; import cn.lihu.jh.module.ecg.feign.RestApiResult; import cn.lihu.jh.module.ecg.feign.dto.AppointmentExternal; import cn.lihu.jh.module.ecg.service.config.EcgConfigService; import cn.lihu.jh.module.ecg.service.queue.QueueService; import cn.lihu.jh.module.ecg.service.queue.QueueServiceTxFunctions; import cn.lihu.jh.module.ecg.service.queuesequence.QueueSequenceService; import lombok.extern.slf4j.Slf4j; import org.springframework.dao.DuplicateKeyException; @@ -211,6 +213,7 @@ if (null == appointment) throw exception(PATIENT_NOT_EXISTS); // 手动预约,直接设置预约日期为当天 if (confirmReqVO.getIsVip() == 1) { appointment.setBookDate( LocalDate.now() ); } jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceImpl.java
@@ -6,6 +6,7 @@ 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.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.devrent.DevRentMapper; @@ -317,7 +318,28 @@ @Override @Transactional public void queue(QueueSaveReqVO queueSaveReqVO) { queueSaveReqVO.setStatus(QueueStatusEnum.WAITING.getStatus()); //排队中 queueSaveReqVO.setStatus(QueueStatusEnum.WAITING.getStatus()); //默认状态: 排队中 // 处理 检查项目.亲和性 逻辑 CheckTypeDO checkTypeDO = queueServiceTxFunctions.getCheckTypeItem( queueSaveReqVO.getBookCheckType() ); if ( checkTypeDO.getAffinityCheckTypes().length > 0) { List<QueueDO> affinityItems = queueMapper.getCurPatGivenCheckItems(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()); //改变 排队状态 queueSaveReqVO.setRoomId(queueItem.getRoomId()); queueSaveReqVO.setRoomName(queueItem.getRoomName()); queueSaveReqVO.setBedNo(queueItem.getBedNo()); break; } } } QueueDO queue = BeanUtils.toBean(queueSaveReqVO, QueueDO.class); queueMapper.insert(queue); jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceTxFunctions.java
@@ -418,6 +418,20 @@ return; } // 抢到排队患者后,处理 检查项目.亲和性 逻辑 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()); for (int i = 0; i < affinityItems.size(); i++) { QueueDO queueItem = affinityItems.get(i); queueItem.setStatus(QueueStatusEnum.AFFINITY_ALREADY.getStatus()); //改变 排队状态 queueItem.setRoomId(queueItem.getRoomId()); queueItem.setRoomName(queueItem.getRoomName()); queueItem.setBedNo(queueItem.getBedNo()); } } curSeqNum.getAndIncrement(); // 可能已经【并发的】在 nextPatient 中改变了值 @@ -441,6 +455,10 @@ mapCheckTypeVsReadyMax = checkTypeDOList.stream().collect(Collectors.toMap(CheckTypeDO::getValue, checkType -> checkType)); } public CheckTypeDO getCheckTypeItem(Integer checkType) { return mapCheckTypeVsReadyMax.get( checkType ); } public BedQueueBO getBedQueueBO(Long roomId, String bedNo) { return mapBedVsQueue.get( Utils.formatRoomBed(roomId, bedNo) ); }