eight
2024-09-01 810eb6e9b8bacbc1bbdab537c8f1f2081943946e
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/queueServiceImpl.java
@@ -7,8 +7,10 @@
import javax.annotation.Resource;
import cn.lihu.jh.module.ecg.Utils;
import cn.lihu.jh.module.ecg.config.DynamicSchedulingConfig;
import cn.lihu.jh.module.ecg.dal.dataobject.room.RoomDO;
import cn.lihu.jh.module.ecg.service.room.RoomService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.config.CronTask;
import org.springframework.scheduling.config.ScheduledTask;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
@@ -45,20 +47,14 @@
 */
@Service
@Validated
@Slf4j
public class QueueServiceImpl implements QueueService {
    @Resource
    private ConfigApi configApi;
    @Resource
    private ScheduledTaskRegistrar taskRegistrar;
    @Resource
    private QueueService queueService;
    @Resource
    private RoomService roomService;
    @Resource
    private queueMapper queueMapper;
@@ -115,6 +111,7 @@
            e.printStackTrace();
        }
        System.out.println("startBedOpen ========");
        return ECG_INNER_ERROR;
    }
@@ -131,6 +128,7 @@
            e.printStackTrace();
        }
        System.out.println("startBedClose ========");
        return ECG_INNER_ERROR;
    }
@@ -149,6 +147,7 @@
            e.printStackTrace();
        }
        System.out.println("startBedDoctorPause ========");
        return ECG_INNER_ERROR;
    }
@@ -167,6 +166,7 @@
            e.printStackTrace();
        }
        System.out.println("startBedDoctorResume ========");
        return ECG_INNER_ERROR;
    }
@@ -185,6 +185,7 @@
            e.printStackTrace();
        }
        System.out.println("startBedDoctorOn ========");
        return ECG_INNER_ERROR;
    }
@@ -203,6 +204,26 @@
            e.printStackTrace();
        }
        System.out.println("startBedDoctorOff ========");
        return ECG_INNER_ERROR;
    }
    @Override
    public ErrorCode startNextPatient(Long roomId, String bedNo) {
        Future<ErrorCode> future = singleThreadExecutor.submit(
                new BedDoctorNextPatientCallable(this, roomId, bedNo)
        );
        try {
            ErrorCode ret = future.get();
            return ret;
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("startNextPatient ========");
        return ECG_INNER_ERROR;
    }
@@ -233,7 +254,7 @@
        bedQueueBO.setBedNo(bedNo);
        bedQueueBO.setMaxQueueNum(queueReadyMax);
        bedQueueBO.setQueueNum(new AtomicInteger(queueDOList.size()));
        bedQueueBO.setStatusEnum(BedStatusEnum.OPENING);
        bedQueueBO.setStatus(BedStatusEnum.OPENING.getStatus());
        priorityQueue.offer(bedQueueBO);
        mapBedVsQueue.put(String.format("%09d%s", roomId, bedNo), bedQueueBO);
        return SUCCESS;
@@ -245,11 +266,16 @@
        if (null == bedQueueBO)
            return QUEUE_BED_ABNORMAL;
        if (bedQueueBO.getQueueNum().get() >0)
        // 除了判断 准备候诊中 的人数,还需要 判断 过号的人数
        //if (bedQueueBO.getQueueNum().get() >0)
        //    return QUEUE_HAVE_PATIENT;
        List<Byte> queueStatusList = new ArrayList<>();
        queueStatusList.add(QueueStatusEnum.READY.getStatus());
        queueStatusList.add(QueueStatusEnum.PASSED.getStatus());
        queueStatusList.add(QueueStatusEnum.PASSED_RETURN.getStatus());
        List<QueueDO>  queueDOList = queueMapper.getDoctorQueueByStatus(roomId, bedNo, queueStatusList);
        if (queueDOList.size() > 0)
            return QUEUE_HAVE_PATIENT;
        mapBedVsQueue.remove(String.format("%09d%s", roomId, bedNo));
        priorityQueue.remove(bedQueueBO);
        // DB update
        List statusList = new ArrayList<BedStatusEnum>();
@@ -261,6 +287,8 @@
        if ( null==updateNum || 0 == updateNum )
            return ROOM_INVALID_STATUS;
        mapBedVsQueue.remove(String.format("%09d%s", roomId, bedNo));
        priorityQueue.remove(bedQueueBO);
        return SUCCESS;
    }
@@ -273,6 +301,7 @@
        RoomDO roomDO = roomMapper.getRoom(roomId, bedNo, docId);
        if (null == roomDO) {
            System.out.println("getRoom ========");
            return error(ECG_INNER_ERROR);
        }
@@ -286,36 +315,39 @@
        if (null == bedQueueBO)
            return QUEUE_BED_ABNORMAL;
        bedQueueBO.setStatusEnum(BedStatusEnum.PAUSE);
        priorityQueue.remove(bedQueueBO);
        // DB update
        List statusList = new ArrayList<BedStatusEnum>();
        statusList.add(BedStatusEnum.DOCTOR_ON);
        Integer updateNum = roomMapper.setBedDoctorPause(roomId, bedNo, docId, docName,
        Integer updateNum = roomMapper.setBedDoctorStatus(roomId, bedNo, docId,
                BedStatusEnum.PAUSE, statusList);
        if ( null==updateNum || 0 == updateNum )
            return ROOM_INVALID_STATUS;
        bedQueueBO.setStatus(BedStatusEnum.PAUSE.getStatus());
        priorityQueue.remove(bedQueueBO);
        return SUCCESS;
    }
    @Override
    public ErrorCode bedDoctorResume(Long roomId, String bedNo, Long docId, String docName) {
        BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo));
        if (null == bedQueueBO)
        if (null == bedQueueBO || !bedQueueBO.getStatus().equals(BedStatusEnum.PAUSE.getStatus()))
            return QUEUE_BED_ABNORMAL;
        bedQueueBO.setStatusEnum(BedStatusEnum.DOCTOR_ON);
        priorityQueue.offer(bedQueueBO);
        // DB update
        List statusList = new ArrayList<BedStatusEnum>();
        statusList.add(BedStatusEnum.PAUSE);
        Integer updateNum = roomMapper.setBedDoctorPause(roomId, bedNo, docId, docName,
        Integer updateNum = roomMapper.setBedDoctorStatus(roomId, bedNo, docId,
                BedStatusEnum.DOCTOR_ON, statusList);
        if ( null==updateNum || 0 == updateNum )
            return ROOM_INVALID_STATUS;
        bedQueueBO.setStatus(BedStatusEnum.DOCTOR_ON.getStatus());
        if (!priorityQueue.contains(bedQueueBO)) {
            priorityQueue.offer(bedQueueBO);
        } else {
            log.error("bedDoctorResume HAVE EXCEPTION!");
        }
        hurryup();
        return SUCCESS;
@@ -335,7 +367,7 @@
        if ( null==updateNum || 0 == updateNum )
            return ROOM_INVALID_STATUS;
        bedQueueBO.setStatusEnum(BedStatusEnum.DOCTOR_ON);
        bedQueueBO.setStatus(BedStatusEnum.DOCTOR_ON.getStatus());
        return SUCCESS;
    }
@@ -349,12 +381,12 @@
        // DB update
        List statusList = new ArrayList<BedStatusEnum>();
        statusList.add(BedStatusEnum.DOCTOR_ON);
        Integer updateNum = roomMapper.setBedDoctorOff(roomId, bedNo, docId, docName,
        Integer updateNum = roomMapper.setBedDoctorOff(roomId, bedNo, docId,
                BedStatusEnum.OPENING, statusList);
        if ( null==updateNum || 0 == updateNum )
            return ROOM_INVALID_STATUS;
        bedQueueBO.setStatusEnum(BedStatusEnum.OPENING);
        bedQueueBO.setStatus(BedStatusEnum.OPENING.getStatus());
        return SUCCESS;
    }
@@ -380,9 +412,13 @@
     * 1. 每天开诊前 从DB同步工位的患者队列数据到 工位优先队列
     * 2. 服务运维重启时
     */
    public void initBedQueueAndSeqNumFromDB() {
    @Override
    public ErrorCode bedReload() {
        priorityQueue.clear();
        mapBedVsQueue.clear();
        // 清除非当天的排队人员
        queueMapper.clearQueue();
        // 从DB 获取 工位列表
        List<BedStatusEnum> bedStatusEnumList = new ArrayList<BedStatusEnum>();
@@ -405,12 +441,16 @@
                throw new RuntimeException("init: exceed max queue number!");
            item.queueNum.set( queueNum );
            priorityQueue.offer(item);
            mapBedVsQueue.put(String.format("%09d%s", item.roomId, item.bedNo), item);
            if (BedStatusEnum.PAUSE.getStatus() != item.getStatus()) {
                priorityQueue.offer(item);
            }
        });
        Integer num = queueMapper.getMaxSeqNum();
        curSeqNum = new AtomicInteger(null == num ? 0 : num);
        return SUCCESS;
    }
    /**
@@ -420,6 +460,10 @@
    public void hurryup() {
        if (0 == openingFlag.get())
            return;
        if (mapBedVsQueue.size() != priorityQueue.size()) {
            log.error("map " + mapBedVsQueue.size() + " priority " + priorityQueue.size());
        }
        // 处理 过号-回来 的人
        for (BedQueueBO bedQueueBO : mapBedVsQueue.values()) {
@@ -497,14 +541,15 @@
        startHurryUp();
    }
    private void nextPatient(Long roomId, String bedNo) {
    @Override
    public ErrorCode nextPatient(Long roomId, String bedNo) {
        // 从 DB 把 序号最小的 就诊准备中的人 设置为就诊中
        Integer updateNum = queueMapper.updateQueueStatus(roomId, bedNo,
                QueueStatusEnum.READY.getStatus(), QueueStatusEnum.ONSTAGE.getStatus());
        // 该工位 没有 就诊准备中 人员
        if (null == updateNum || 0 == updateNum) {
            return;
            return QUEUE_NOT_READY_PATIENT;
        }
        // 优先队列中 该工位 就诊准备中人的数量 减一
@@ -513,7 +558,8 @@
        priorityQueue.remove(bo);
        priorityQueue.offer(bo);
        startHurryUp();
        hurryup();
        return SUCCESS;
    }
    public void finishNextPatient(Long roomId, String bedNo) {
@@ -521,7 +567,7 @@
        Integer ret =  queueMapper.updateQueueStatus(roomId, bedNo,
                QueueStatusEnum.ONSTAGE.getStatus(), QueueStatusEnum.FINISH.getStatus());
        nextPatient(roomId, bedNo);
        startNextPatient(roomId, bedNo);
    }
    public void passNextPatient(Long roomId, String bedNo) {
@@ -529,7 +575,7 @@
        Integer ret =  queueMapper.updateQueueStatus(roomId, bedNo,
                QueueStatusEnum.ONSTAGE.getStatus(), QueueStatusEnum.PASSED.getStatus());
        nextPatient(roomId, bedNo);
        startNextPatient(roomId, bedNo);
    }
    public List<QueueDO> getDoctorQueueByStatus(Long roomId, String bedNo, List<Byte> statusList) {
@@ -567,13 +613,8 @@
        if (1 == openingFlag.get())
            return;
        // 清除非当天的排队人员
        queueMapper.clearQueue();
        initBedQueueAndSeqNumFromDB();
        openingFlag.set(1);
        hurryup();
        startBedReload();
    }
    public void closeBiz() {
@@ -582,8 +623,8 @@
    @Override
    public void resetScheduler() {
        Set<ScheduledTask> taskList = taskRegistrar.getScheduledTasks();
        taskList.forEach((task)->task.cancel());
        ScheduledTaskRegistrar taskRegistrar = DynamicSchedulingConfig.static_scheduledTaskRegistrar;
        taskRegistrar.getScheduledTasks().forEach(ScheduledTask::cancel);
        String strOpenCloseTime = configApi.getConfigValueByKey(ECG_OPENING_TIME_KEY);
        List<LocalTime> list = Utils.parseOpeningTime(strOpenCloseTime);
@@ -598,18 +639,20 @@
        taskRegistrar.scheduleCronTask(new CronTask(() -> {
            System.out.println("Opening Task executed at: " + System.currentTimeMillis());
            queueService.startBiz();
            startBiz();
        }, openCronExpression));
        taskRegistrar.scheduleCronTask(new CronTask(() -> {
            System.out.println("Close Task executed at: " + System.currentTimeMillis());
            queueService.closeBiz();
            closeBiz();
        }, closeCronExpression));
        taskRegistrar.scheduleCronTask(new CronTask(() -> {
            System.out.println("Room Reset Task executed at: " + System.currentTimeMillis());
            roomService.resetRoom();
        }, roomResetCronExpression));
        taskRegistrar.afterPropertiesSet();
    }
    @Override
@@ -633,4 +676,11 @@
        });
    }
    private void startBedReload() {
        singleThreadExecutor.execute( () -> {
            bedReload();
            hurryup();
        });
    }
}