eight
2024-08-30 ae24af77aaa940a64281f9f1bf2fe5ab3f9c68b8
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/queueServiceImpl.java
@@ -1,11 +1,18 @@
package cn.lihu.jh.module.ecg.service.queue;
import java.time.LocalTime;
import java.util.*;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
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 org.springframework.scheduling.config.CronTask;
import org.springframework.scheduling.config.ScheduledTask;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
@@ -28,6 +35,8 @@
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.framework.common.pojo.CommonResult.success;
import static cn.lihu.jh.module.ecg.Constants.ECG_OPENING_TIME_KEY;
import static cn.lihu.jh.module.ecg.Constants.ECG_ROOM_RESET_TIME_KEY;
import static cn.lihu.jh.module.ecg.enums.ErrorCodeConstants.*;
/**
@@ -41,6 +50,9 @@
    @Resource
    private ConfigApi configApi;
    @Resource
    private RoomService roomService;
    @Resource
    private queueMapper queueMapper;
@@ -97,6 +109,7 @@
            e.printStackTrace();
        }
        System.out.println("startBedOpen ========");
        return ECG_INNER_ERROR;
    }
@@ -113,6 +126,7 @@
            e.printStackTrace();
        }
        System.out.println("startBedClose ========");
        return ECG_INNER_ERROR;
    }
@@ -131,6 +145,7 @@
            e.printStackTrace();
        }
        System.out.println("startBedDoctorPause ========");
        return ECG_INNER_ERROR;
    }
@@ -149,6 +164,7 @@
            e.printStackTrace();
        }
        System.out.println("startBedDoctorResume ========");
        return ECG_INNER_ERROR;
    }
@@ -167,6 +183,7 @@
            e.printStackTrace();
        }
        System.out.println("startBedDoctorOn ========");
        return ECG_INNER_ERROR;
    }
@@ -185,6 +202,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;
    }
@@ -479,14 +516,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;
        }
        // 优先队列中 该工位 就诊准备中人的数量 减一
@@ -495,7 +533,8 @@
        priorityQueue.remove(bo);
        priorityQueue.offer(bo);
        startHurryUp();
        hurryup();
        return SUCCESS;
    }
    public void finishNextPatient(Long roomId, String bedNo) {
@@ -503,7 +542,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) {
@@ -511,7 +550,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) {
@@ -563,6 +602,40 @@
    }
    @Override
    public void resetScheduler() {
        ScheduledTaskRegistrar taskRegistrar = DynamicSchedulingConfig.static_scheduledTaskRegistrar;
        taskRegistrar.getScheduledTasks().forEach(ScheduledTask::cancel);
        String strOpenCloseTime = configApi.getConfigValueByKey(ECG_OPENING_TIME_KEY);
        List<LocalTime> list = Utils.parseOpeningTime(strOpenCloseTime);
        LocalTime openingTime = list.get(0);
        LocalTime closeTime = list.get(1);
        String openCronExpression = String.format("0 %d %d  * * ?", openingTime.getMinute(), openingTime.getHour());
        String closeCronExpression = String.format("0 %d %d  * * ?", closeTime.getMinute(), closeTime.getHour());
        String strRoomResetTime = configApi.getConfigValueByKey(ECG_ROOM_RESET_TIME_KEY);
        LocalTime roomResetTime = Utils.parseTime(strRoomResetTime);
        String roomResetCronExpression = String.format("0 %d %d  * * ?", roomResetTime.getMinute(), roomResetTime.getHour());
        taskRegistrar.scheduleCronTask(new CronTask(() -> {
            System.out.println("Opening Task executed at: " + System.currentTimeMillis());
            startBiz();
        }, openCronExpression));
        taskRegistrar.scheduleCronTask(new CronTask(() -> {
            System.out.println("Close Task executed at: " + System.currentTimeMillis());
            closeBiz();
        }, closeCronExpression));
        taskRegistrar.scheduleCronTask(new CronTask(() -> {
            System.out.println("Room Reset Task executed at: " + System.currentTimeMillis());
            roomService.resetRoom();
        }, roomResetCronExpression));
        taskRegistrar.afterPropertiesSet();
    }
    @Override
    public Integer recallPatient(Long roomId, String bedNo, String patId) {
        Integer updateNum = queueMapper.recallPassedPatient(roomId, bedNo, patId,
                QueueStatusEnum.PASSED.getStatus(), QueueStatusEnum.PASSED_RETURN.getStatus());