| | |
| | | import javax.annotation.Resource; |
| | | |
| | | import cn.lihu.jh.module.ecg.controller.admin.room.vo.MonitorInfoVO; |
| | | 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; |
| | | import cn.lihu.jh.module.ecg.enums.DevRentStateEnum; |
| | | import cn.lihu.jh.module.system.api.oauth2.OAuth2TokenApi; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.util.StringUtils; |
| | | import org.springframework.validation.annotation.Validated; |
| | | |
| | |
| | | public class QueueServiceImpl implements QueueService { |
| | | |
| | | @Resource |
| | | private OAuth2TokenApi oAuth2TokenApi; |
| | | |
| | | @Resource |
| | | private queueMapper queueMapper; |
| | | |
| | | @Resource |
| | | private RoomMapper roomMapper; |
| | | |
| | | @Resource |
| | | private CallMapper callMapper; |
| | | |
| | | @Resource |
| | | private DevRentMapper devRentMapper; |
| | | |
| | | AtomicInteger openingFlag = new AtomicInteger(0); |
| | | AtomicInteger curSeqNum = new AtomicInteger(0); |
| | |
| | | ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor(); |
| | | |
| | | Integer queueReadyMax = 0; |
| | | |
| | | Integer bigScrenWaitingSize = 5; |
| | | Integer bigScrenPassedSize = 5; |
| | | Integer bigScrenWaitingFrom = 0; |
| | | Integer bigScrenPassedFrom = 0; |
| | | |
| | | @Override |
| | | public Integer createqueue(QueueSaveReqVO createReqVO) { |
| | |
| | | } |
| | | |
| | | @Override |
| | | public ErrorCode startBedOpen(Long roomId, String bedNo) { |
| | | Future<ErrorCode> future = singleThreadExecutor.submit( new BedOpenCallable(this, roomId, bedNo)); |
| | | public ErrorCode startBedOpen(Long roomId, String roomName, String bedNo) { |
| | | Future<ErrorCode> future = singleThreadExecutor.submit( new BedOpenCallable(this, roomId, roomName, bedNo)); |
| | | |
| | | try { |
| | | ErrorCode ret = future.get(); |
| | |
| | | } |
| | | |
| | | @Override |
| | | public void startResetRoom() { |
| | | singleThreadExecutor.execute( () -> { |
| | | resetRoom(); |
| | | bedReload(); |
| | | monitorInfo(); |
| | | }); |
| | | } |
| | | |
| | | @Override |
| | | public MonitorInfoVO getMonitorInfo() { |
| | | MonitorInfoVO monitorInfoVO = new MonitorInfoVO(); |
| | | monitorInfoVO.setOpeningFlag( openingFlag.get() ); |
| | |
| | | * @return |
| | | */ |
| | | @Override |
| | | public ErrorCode bedOpen(Long roomId, String bedNo) { |
| | | public ErrorCode bedOpen(Long roomId, String roomName, String bedNo) { |
| | | BedQueueBO bedQueueBO2 = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo)); |
| | | if (null != bedQueueBO2) { |
| | | log.error("bedOpen mapBedVsQueue has existed. " + roomId + " " + bedNo); |
| | |
| | | // 新增工位 优先队列 |
| | | BedQueueBO bedQueueBO = new BedQueueBO(); |
| | | bedQueueBO.setRoomId(roomId); |
| | | bedQueueBO.setRoomName(roomName); |
| | | bedQueueBO.setBedNo(bedNo); |
| | | bedQueueBO.setMaxQueueNum(queueReadyMax); |
| | | bedQueueBO.setQueueNum(new AtomicInteger(queueDOList.size())); |
| | |
| | | } |
| | | |
| | | /** |
| | | * !!开诊期间,不能执行这个方法,否则会有 P0 问题 |
| | | * 1. 每天开诊前 从DB同步工位的患者队列数据到 工位优先队列 |
| | | * 2. 服务运维重启时 |
| | | */ |
| | |
| | | |
| | | // 清除非当天的排队人员 |
| | | queueMapper.clearQueue(); |
| | | // 清除非当天的语音叫号记录 |
| | | callMapper.clearCall(); |
| | | |
| | | // 从DB 获取 工位列表 |
| | | List<BedStatusEnum> bedStatusEnumList = new ArrayList<BedStatusEnum>(); |
| | |
| | | } |
| | | |
| | | /** |
| | | * TODO 新开队列时,需要把排队中的人 转到 就诊准备 状态 |
| | | * 等到取下一个 排队中人员 的逻辑完成后,再回来不错 |
| | | * |
| | | */ |
| | | public void hurryup() { |
| | | if (0 == openingFlag.get()) |
| | |
| | | * @param queueSaveReqVO |
| | | */ |
| | | @Override |
| | | @Transactional |
| | | public void queue(QueueSaveReqVO queueSaveReqVO) { |
| | | queueSaveReqVO.setStatus(QueueStatusEnum.WAITING.getStatus()); //排队中 |
| | | QueueDO queue = BeanUtils.toBean(queueSaveReqVO, QueueDO.class); |
| | | queueMapper.insert(queue); |
| | | |
| | | DevRentDO devRent = BeanUtils.toBean(queueSaveReqVO, DevRentDO.class); |
| | | devRent.setState( DevRentStateEnum.FREE.getState() ); |
| | | devRentMapper.insert(devRent); |
| | | |
| | | startHurryUp(); |
| | | } |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<QueueDO> callingData(Integer waitingNum, Integer passedNum) { |
| | | //queueMapper. |
| | | return null; |
| | | public RoomDO getDocRoomInfo(Long docId) { |
| | | return roomMapper.getRoomByDocId(docId); |
| | | } |
| | | |
| | | @Override |
| | | public List<QueueDO> getRoomQueue(String ip, List<Byte> statusList) { |
| | | List<RoomDO> roomDOList = roomMapper.queueByIp(ip); |
| | | Optional<RoomDO> optionalQueueDO = roomDOList.stream().filter(item -> StringUtils.hasLength(item.getIp())).findFirst(); |
| | | if (!optionalQueueDO.isPresent()) { |
| | | return new ArrayList<QueueDO>(); |
| | | } |
| | | public void resetRoom() { |
| | | // 踢出在座的医生 |
| | | List<BedStatusEnum> bedStatusEnumList = new ArrayList<BedStatusEnum>(); |
| | | bedStatusEnumList.add(BedStatusEnum.DOCTOR_ON); |
| | | bedStatusEnumList.add(BedStatusEnum.PAUSE); |
| | | List<RoomDO> roomDOList = roomMapper.simpleRoomList(bedStatusEnumList); |
| | | List<Long> userIdList = roomDOList.stream().map(roomDO -> roomDO.getDocId()).toList(); |
| | | oAuth2TokenApi.tick(userIdList); |
| | | |
| | | Long roomId = optionalQueueDO.get().getRoomId(); |
| | | List<QueueDO> queueDOList = queueMapper.getRoomQueueByStatus(roomId, statusList); |
| | | return queueDOList; |
| | | // 关闭所有工位 |
| | | Integer ret = roomMapper.resetRoom(BedStatusEnum.CLOSED.getStatus()); |
| | | } |
| | | |
| | | } |