eight
2024-08-20 be69c3d9d175027cb8d43f60a7744dc6e8c52433
update
已添加2个文件
已修改4个文件
207 ■■■■■ 文件已修改
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/MySpringEventLister.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/doctor/DoctorController.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/queue/queueMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedQueueBO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/queueService.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/queueServiceImpl.java 74 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/MySpringEventLister.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package cn.lihu.jh.module.ecg;
import cn.lihu.jh.module.ecg.service.queue.QueueService;
import org.springframework.boot.context.event.ApplicationStartedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class MySpringEventLister implements ApplicationListener<ApplicationStartedEvent> {
    @Resource
    private QueueService queueService;
    @Override
    public void onApplicationEvent(ApplicationStartedEvent event) {
        System.out.println("应用启动完成,通知监听器执行缓存预加载操作");
        queueService.initQueue();
    }
}
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/controller/admin/doctor/DoctorController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package cn.lihu.jh.module.ecg.controller.admin.doctor;
import cn.lihu.jh.framework.apilog.core.annotation.ApiAccessLog;
import cn.lihu.jh.framework.common.pojo.CommonResult;
import cn.lihu.jh.framework.common.pojo.PageParam;
import cn.lihu.jh.framework.common.pojo.PageResult;
import cn.lihu.jh.framework.common.util.object.BeanUtils;
import cn.lihu.jh.framework.excel.core.util.ExcelUtils;
import cn.lihu.jh.module.ecg.controller.admin.queue.vo.QueuePageReqVO;
import cn.lihu.jh.module.ecg.controller.admin.queue.vo.QueueRespVO;
import cn.lihu.jh.module.ecg.controller.admin.queue.vo.QueueSaveReqVO;
import cn.lihu.jh.module.ecg.dal.dataobject.queue.QueueDO;
import cn.lihu.jh.module.ecg.enums.QueueStatusEnum;
import cn.lihu.jh.module.ecg.service.queue.QueueService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static cn.lihu.jh.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.lihu.jh.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - åŒ»ç”Ÿå«å·")
@RestController
@RequestMapping("/ecg/doctor")
@Validated
public class DoctorController {
    @Resource
    private QueueService queueService;
    @GetMapping("/nextpatient")
    @Operation(summary = "下一位患者")
    @Parameter(name = "roomId", description = "诊室编号", required = true, example = "116")
    @Parameter(name = "bedNo", description = "工位编号", required = true, example = "B2")
    @PreAuthorize("@ss.hasPermission('ecg:doctor:nextpatient')")
    public CommonResult<List<QueueRespVO>> nextPatient(
            @RequestParam("roomId") Long roomId,
            @RequestParam("bedNo") String bedNo)
    {
        queueService.nextPatient(roomId, bedNo);
        List<Byte> queueStatusList = new ArrayList<>();
        queueStatusList.add(QueueStatusEnum.READY.getStatus());
        queueStatusList.add(QueueStatusEnum.ONSTAGE.getStatus());
        queueStatusList.add(QueueStatusEnum.PASSED.getStatus());
        List<QueueDO> queueDOList = queueService.getDoctorQueueByStatus(roomId, bedNo, queueStatusList);
        return success(BeanUtils.toBean(queueDOList, QueueRespVO.class));
    }
    @GetMapping("/page")
    @Operation(summary = "获得排队分页")
    @PreAuthorize("@ss.hasPermission('ecg:queue:query')")
    public CommonResult<PageResult<QueueRespVO>> getqueuePage(@Valid QueuePageReqVO pageReqVO) {
        PageResult<QueueDO> pageResult = queueService.getqueuePage(pageReqVO);
        return success(BeanUtils.toBean(pageResult, QueueRespVO.class));
    }
    @GetMapping("/opening-setting")
    @Operation(summary = "开诊设置")
    @PreAuthorize("@ss.hasPermission('ecg:queue:setting')")
    public CommonResult<Integer> openingSetting() {
        queueService.initQueue();
        queueService.hurryup();
        return success(0);
    }
}
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/dal/mysql/queue/queueMapper.java
@@ -10,6 +10,7 @@
import cn.lihu.jh.module.ecg.controller.admin.queue.vo.*;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import java.util.List;
@@ -49,4 +50,24 @@
            " group by room_id, bed_no; "
            +"</script>")
    List<QueueStatisticDO> queueStatistic(@Param("statusList")List<Byte> statusList);
    //@Update("update lihu.queue set status = #{newStatus} where pat_id = #{patId} ans status = #{curStatus} ")
    @Update("update lihu.queue set status = #{newStatus} where 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 updateQueueStatus(@Param("roomId")Long roomId, @Param("bedNo")String bedNo, @Param("curStatus")Byte curStatus, @Param("newStatus")Byte newStatus);
    @Select("select * from lihu.queue where status = #{status} order by book_timeslot, create_time limit 1")
    QueueDO getFirstInQueueByStatus(Byte status);
    @Select("<script>" +
            "SELECT * FROM lihu.queue " +
            "where room_id = #{roomId} and bed_no = #{bedNo} and status in (" +
            " <foreach collection='statusList' separator=',' item='status'>" +
            " #{status} " +
            " </foreach> )" +
            " order by status desc" +
            "</script>")
    List<QueueDO> getDoctorQueueByStatus(@Param("roomId")Long roomId, @Param("bedNo")String bedNo, @Param("statusList")List<Byte> statusList);
}
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedQueueBO.java
@@ -3,16 +3,18 @@
import lombok.Data;
import org.jetbrains.annotations.NotNull;
import java.util.concurrent.atomic.AtomicInteger;
@Data
public class BedQueueBO implements Comparable<BedQueueBO> {
    String bedNo;
    Long roomId;
    String roomName;
    Integer queueNum;
    AtomicInteger queueNum = new AtomicInteger(0);
    Integer maxQueueNum;
    @Override
    public int compareTo(@NotNull BedQueueBO o) {
        return Integer.compare(this.queueNum, o.queueNum);
        return Integer.compare(this.queueNum.get(), o.queueNum.get());
    }
}
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/queueService.java
@@ -68,7 +68,14 @@
    void initQueue();
    /**
     *
     * æŠŠåŒ»ç”Ÿå€™è¯Šçš„队列塞满
     */
    void hurryup();
    /**
     * åŒ»ç”Ÿå«ä¸‹ä¸€ä½æ‚£è€…
     */
    void nextPatient(Long roomId, String bedNo);
    List<QueueDO> getDoctorQueueByStatus(Long roomId, String bedNo, List<Byte> statusList);
}
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/queueServiceImpl.java
@@ -21,6 +21,9 @@
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;
import static cn.lihu.jh.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.lihu.jh.module.ecg.enums.ErrorCodeConstants.*;
@@ -36,9 +39,10 @@
    final static Integer MAX_QUEUE_NUM = 2;
    Integer  curSeqNum = 0;
    AtomicInteger curSeqNum = new AtomicInteger(0);
    PriorityQueue<BedQueueBO> priorityQueue = new PriorityQueue<>();
    PriorityBlockingQueue<BedQueueBO> priorityQueue = new PriorityBlockingQueue<>();
    ConcurrentHashMap<String, BedQueueBO > mapBedVsQueue = new ConcurrentHashMap<>();
    @Resource
    private queueMapper queueMapper;
@@ -99,21 +103,21 @@
        if (null == bedQueueBO)
            return;
        if (bedQueueBO.queueNum == bedQueueBO.maxQueueNum) {
        if (bedQueueBO.queueNum.get() == bedQueueBO.maxQueueNum) {
            queueSaveReqVO.setStatus(QueueStatusEnum.WAITING.getStatus()); //排队中
            QueueDO queue = BeanUtils.toBean(queueSaveReqVO, QueueDO.class);
            queueMapper.insert(queue);  // queue.getId();
        } else if (bedQueueBO.queueNum < bedQueueBO.maxQueueNum) {
        } else if (bedQueueBO.queueNum.get() < bedQueueBO.maxQueueNum) {
            queueSaveReqVO.setStatus(QueueStatusEnum.READY.getStatus()); //候诊准备中
            queueSaveReqVO.setRoomId(bedQueueBO.getRoomId());
            queueSaveReqVO.setRoomName(bedQueueBO.getRoomName());
            queueSaveReqVO.setBedNo(bedQueueBO.getBedNo());
            queueSaveReqVO.setSeqNum(curSeqNum);
            queueSaveReqVO.setSeqNum(curSeqNum.get());
            QueueDO queue = BeanUtils.toBean(queueSaveReqVO, QueueDO.class);
            queueMapper.insert(queue);  // queue.getId();
            curSeqNum++;
            bedQueueBO.queueNum++;
            curSeqNum.getAndIncrement();
            bedQueueBO.queueNum.getAndIncrement();
            BedQueueBO bedQueueBO2 = priorityQueue.poll();
            priorityQueue.offer(bedQueueBO2);
        }
@@ -121,13 +125,15 @@
    }
    @PostConstruct
    public void initQueue() {
        priorityQueue.clear();
        mapBedVsQueue.clear();
        // ä»ŽDB èŽ·å– å·¥ä½åˆ—表
        List<RoomDO> roomDOList = roomMapper.simpleRoomList();
        List<BedQueueBO> bedQueueBOList = roomDOList.stream().map(item -> BeanUtils.toBean(item, BedQueueBO.class)).toList();
        // ä»ŽDB èŽ·å– é˜Ÿåˆ—中 å°±è¯Šå‡†å¤‡ä¸­äººå‘˜ åˆ—表
        List<Byte> queueStatusList = new ArrayList<>();
        queueStatusList.add(QueueStatusEnum.READY.getStatus());
        List<QueueStatisticDO> queueStatisticDOList = queueMapper.queueStatistic(queueStatusList);
@@ -135,12 +141,15 @@
        bedQueueBOList.forEach(item -> {
            item.maxQueueNum = MAX_QUEUE_NUM;
            Optional<QueueStatisticDO> queueStatisticDOOptional = queueStatisticDOList.stream().filter(it->it.getRoomId()==item.roomId && it.getBedNo().equals(item.getBedNo())).findFirst();
            item.queueNum = queueStatisticDOOptional.isPresent() ? queueStatisticDOOptional.get().getTotalInStatus() : 0;
            item.queueNum.set( queueStatisticDOOptional.isPresent() ? queueStatisticDOOptional.get().getTotalInStatus() : 0 );
            priorityQueue.offer(item);
            mapBedVsQueue.put(String.format("%09d%s", item.roomId, item.bedNo), item);
        });
        curSeqNum = queueMapper.getMaxSeqNum();
        curSeqNum = null == curSeqNum ? 1 : ++curSeqNum;
        Integer num = queueMapper.getMaxSeqNum();
        curSeqNum = new AtomicInteger(null == num ? 1 : ++num);
        hurryup();
    }
    /**
@@ -148,5 +157,48 @@
     * ç­‰åˆ°å–下一个 æŽ’队中人员 çš„逻辑完成后,再回来不错
     */
    public void hurryup() {
        while (true) {
            BedQueueBO bedQueueBO = priorityQueue.peek();
            if (null == bedQueueBO)
                return;
            if (bedQueueBO.queueNum.get() == bedQueueBO.maxQueueNum)
                return;
            QueueDO  queue = queueMapper.getFirstInQueueByStatus(QueueStatusEnum.WAITING.getStatus());
            if (null == queue)
                return;
            queue.setStatus(QueueStatusEnum.READY.getStatus()); //候诊准备中
            queue.setRoomId(bedQueueBO.getRoomId());
            queue.setRoomName(bedQueueBO.getRoomName());
            queue.setBedNo(bedQueueBO.getBedNo());
            queue.setSeqNum(curSeqNum.get());
            queueMapper.updateById(queue);  // queue.getId();
            curSeqNum.getAndIncrement();
            bedQueueBO.queueNum.getAndIncrement();
            BedQueueBO bedQueueBO2 = priorityQueue.poll();
            priorityQueue.offer(bedQueueBO2);
        }
    }
    public  void nextPatient(Long roomId, String bedNo) {
        // ä»Ž DB æŠŠ åºå·æœ€å°çš„ å°±è¯Šå‡†å¤‡ä¸­çš„人 è®¾ç½®ä¸ºå°±è¯Šä¸­
        queueMapper.updateQueueStatus(roomId, bedNo,
                QueueStatusEnum.READY.getStatus(), QueueStatusEnum.ONSTAGE.getStatus());
        // ä¼˜å…ˆé˜Ÿåˆ—中 è¯¥å·¥ä½ å°±è¯Šå‡†å¤‡ä¸­äººçš„æ•°é‡ å‡ä¸€
        BedQueueBO bo = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo));
        boolean breturn = priorityQueue.remove(bo);
        bo.queueNum.getAndDecrement();
        priorityQueue.offer(bo);
        hurryup();
    }
    public List<QueueDO> getDoctorQueueByStatus(Long roomId, String bedNo, List<Byte> statusList) {
        List<QueueDO> queueDOList = queueMapper.getDoctorQueueByStatus(roomId, bedNo, statusList);
        return queueDOList;
    }
}