From e8f1b8e0380d7c868f4e3218688796f595151724 Mon Sep 17 00:00:00 2001
From: eight <641137800@qq.com>
Date: 星期五, 27 九月 2024 16:24:18 +0800
Subject: [PATCH] refactor: 用以支持springboot 事务注解
---
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorPauseCallable.java | 4
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceImpl.java | 395 +------------------------
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOnCallable.java | 4
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueService.java | 17 -
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/api/doctor/DoctorApiImpl.java | 2
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorNextPatientCallable.java | 4
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOffCallable.java | 4
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedReloadCallable.java | 4
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorResumeCallable.java | 4
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceTxFunctions.java | 428 ++++++++++++++++++++++++++++
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedOpenCallable.java | 4
jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedCloseCallable.java | 4
12 files changed, 468 insertions(+), 406 deletions(-)
diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/api/doctor/DoctorApiImpl.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/api/doctor/DoctorApiImpl.java
index e7ed3fd..4bb24db 100644
--- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/api/doctor/DoctorApiImpl.java
+++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/api/doctor/DoctorApiImpl.java
@@ -22,7 +22,7 @@
return GlobalErrorCodeConstants.SUCCESS;
}
- return queueService.bedDoctorOff(roomDO.getRoomId(), roomDO.getBedNo(), userId, userName);
+ return queueService.startBedDoctorOff(roomDO.getRoomId(), roomDO.getBedNo(), userId, userName);
}
}
diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedCloseCallable.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedCloseCallable.java
index b99ba68..8ab203c 100644
--- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedCloseCallable.java
+++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedCloseCallable.java
@@ -6,11 +6,11 @@
public class BedCloseCallable implements Callable<ErrorCode> {
- QueueService queueService;
+ QueueServiceTxFunctions queueService;
private Long roomId;
private String bedNo;
- public BedCloseCallable(QueueService queueService, Long roomId, String bedNo)
+ public BedCloseCallable(QueueServiceTxFunctions queueService, Long roomId, String bedNo)
{
super();
this.roomId = roomId;
diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorNextPatientCallable.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorNextPatientCallable.java
index a727750..ab983a4 100644
--- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorNextPatientCallable.java
+++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorNextPatientCallable.java
@@ -7,11 +7,11 @@
public class BedDoctorNextPatientCallable implements Callable<ErrorCode> {
- QueueService queueService;
+ QueueServiceTxFunctions queueService;
private Long roomId;
private String bedNo;
- public BedDoctorNextPatientCallable(QueueService queueService, Long roomId, String bedNo)
+ public BedDoctorNextPatientCallable(QueueServiceTxFunctions queueService, Long roomId, String bedNo)
{
super();
this.roomId = roomId;
diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOffCallable.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOffCallable.java
index 20c1815..08eed0a 100644
--- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOffCallable.java
+++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOffCallable.java
@@ -6,13 +6,13 @@
public class BedDoctorOffCallable implements Callable<ErrorCode> {
- QueueService queueService;
+ QueueServiceTxFunctions queueService;
private Long roomId;
private String bedNo;
private Long docId;
private String docName;
- public BedDoctorOffCallable(QueueService queueService, Long roomId, String bedNo, Long docId, String docName)
+ public BedDoctorOffCallable(QueueServiceTxFunctions queueService, Long roomId, String bedNo, Long docId, String docName)
{
super();
this.queueService = queueService;
diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOnCallable.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOnCallable.java
index 41d8d4b..8521d5f 100644
--- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOnCallable.java
+++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorOnCallable.java
@@ -6,13 +6,13 @@
public class BedDoctorOnCallable implements Callable<ErrorCode> {
- QueueService queueService;
+ QueueServiceTxFunctions queueService;
private Long roomId;
private String bedNo;
private Long docId;
private String docName;
- public BedDoctorOnCallable(QueueService queueService, Long roomId, String bedNo, Long docId, String docName)
+ public BedDoctorOnCallable(QueueServiceTxFunctions queueService, Long roomId, String bedNo, Long docId, String docName)
{
super();
this.queueService = queueService;
diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorPauseCallable.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorPauseCallable.java
index b957ab8..86d8f07 100644
--- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorPauseCallable.java
+++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorPauseCallable.java
@@ -6,13 +6,13 @@
public class BedDoctorPauseCallable implements Callable<ErrorCode> {
- QueueService queueService;
+ QueueServiceTxFunctions queueService;
private Long roomId;
private String bedNo;
private Long docId;
private String docName;
- public BedDoctorPauseCallable(QueueService queueService, Long roomId, String bedNo, Long docId, String docName)
+ public BedDoctorPauseCallable(QueueServiceTxFunctions queueService, Long roomId, String bedNo, Long docId, String docName)
{
super();
this.queueService = queueService;
diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorResumeCallable.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorResumeCallable.java
index 1d4982d..8cafece 100644
--- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorResumeCallable.java
+++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedDoctorResumeCallable.java
@@ -7,13 +7,13 @@
public class BedDoctorResumeCallable implements Callable<ErrorCode> {
- QueueService queueService;
+ QueueServiceTxFunctions queueService;
private Long roomId;
private String bedNo;
private Long docId;
private String docName;
- public BedDoctorResumeCallable(QueueService queueService, Long roomId, String bedNo, Long docId, String docName)
+ public BedDoctorResumeCallable(QueueServiceTxFunctions queueService, Long roomId, String bedNo, Long docId, String docName)
{
super();
this.queueService = queueService;
diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedOpenCallable.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedOpenCallable.java
index 1fa9ac0..4b2a2ed 100644
--- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedOpenCallable.java
+++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedOpenCallable.java
@@ -7,12 +7,12 @@
public class BedOpenCallable implements Callable<ErrorCode> {
- QueueService queueService;
+ QueueServiceTxFunctions queueService;
private Long roomId;
private String roomName;
private String bedNo;
- public BedOpenCallable(QueueService queueService, Long roomId, String roomName, String bedNo)
+ public BedOpenCallable(QueueServiceTxFunctions queueService, Long roomId, String roomName, String bedNo)
{
super();
this.roomId = roomId;
diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedReloadCallable.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedReloadCallable.java
index 4080469..a46879c 100644
--- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedReloadCallable.java
+++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/BedReloadCallable.java
@@ -6,9 +6,9 @@
public class BedReloadCallable implements Callable<ErrorCode> {
- QueueService queueService;
+ QueueServiceTxFunctions queueService;
- public BedReloadCallable(QueueService queueService)
+ public BedReloadCallable(QueueServiceTxFunctions queueService)
{
super();
this.queueService = queueService;
diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueService.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueService.java
index 66ed14d..0a34b8d 100644
--- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueService.java
+++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueService.java
@@ -62,15 +62,6 @@
ErrorCode startBedDoctorOff(Long roomId, String bedNo, Long docId, String docName);
ErrorCode startNextPatient(Long roomId, String bedNo);
- ErrorCode bedOpen(Long roomId, String roomName, String bedNo);
- ErrorCode bedClose(Long roomId, String bedNo);
- ErrorCode bedDoctorPause(Long roomId, String bedNo, Long docId, String docName);
- ErrorCode bedDoctorResume(Long roomId, String bedNo, Long docId, String docName);
- ErrorCode bedDoctorOn(Long roomId, String bedNo, Long docId, String docName);
- ErrorCode bedDoctorOff(Long roomId, String bedNo, Long docId, String docName);
- ErrorCode nextPatient(Long roomId, String bedNo);
-
- ErrorCode bedReload();
CommonResult<RoomRespVO> getRoom(Long roomId, String bedNo, Long docId);
/**
@@ -95,12 +86,6 @@
*/
void queue(QueueSaveReqVO queueSaveReqVO);
-
- /**
- * 鎶婂尰鐢熷�欒瘖鐨勯槦鍒楀婊�
- */
- void hurryup();
-
/**
* 鍖荤敓鍙笅涓�浣嶆偅鑰�
*/
@@ -118,8 +103,6 @@
Integer recallPatient(Long roomId, String bedNo, String patId);
Integer patientJump(String patId, Byte jumped );
-
- void monitorInfo();
RoomDO getDocRoomInfo(Long docId);
}
diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceImpl.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceImpl.java
index 697126a..f5224de 100644
--- a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceImpl.java
+++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceImpl.java
@@ -48,6 +48,9 @@
public class QueueServiceImpl implements QueueService {
@Resource
+ QueueServiceTxFunctions queueServiceTxFunctions;
+
+ @Resource
private OAuth2TokenApi oAuth2TokenApi;
@Resource
@@ -62,20 +65,7 @@
@Resource
private DevRentMapper devRentMapper;
- AtomicInteger openingFlag = new AtomicInteger(0);
- AtomicInteger curSeqNum = new AtomicInteger(0);
-
- PriorityBlockingQueue<BedQueueBO> priorityQueue = new PriorityBlockingQueue<>();
- ConcurrentHashMap<String, BedQueueBO > mapBedVsQueue = new ConcurrentHashMap<>();
-
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) {
@@ -105,7 +95,7 @@
@Override
public ErrorCode startBedOpen(Long roomId, String roomName, String bedNo) {
- Future<ErrorCode> future = singleThreadExecutor.submit( new BedOpenCallable(this, roomId, roomName, bedNo));
+ Future<ErrorCode> future = singleThreadExecutor.submit( new BedOpenCallable(queueServiceTxFunctions, roomId, roomName, bedNo));
try {
ErrorCode ret = future.get();
@@ -122,7 +112,7 @@
@Override
public ErrorCode startBedClose(Long roomId, String bedNo) {
- Future<ErrorCode> future = singleThreadExecutor.submit( new BedCloseCallable(this, roomId, bedNo));
+ Future<ErrorCode> future = singleThreadExecutor.submit( new BedCloseCallable(queueServiceTxFunctions, roomId, bedNo));
try {
ErrorCode ret = future.get();
@@ -140,7 +130,7 @@
@Override
public ErrorCode startBedDoctorPause(Long roomId, String bedNo, Long docId, String docName) {
Future<ErrorCode> future = singleThreadExecutor.submit(
- new BedDoctorPauseCallable(this, roomId, bedNo, docId, docName)
+ new BedDoctorPauseCallable(queueServiceTxFunctions, roomId, bedNo, docId, docName)
);
try {
@@ -159,7 +149,7 @@
@Override
public ErrorCode startBedDoctorResume(Long roomId, String bedNo, Long docId, String docName) {
Future<ErrorCode> future = singleThreadExecutor.submit(
- new BedDoctorResumeCallable(this, roomId, bedNo, docId, docName)
+ new BedDoctorResumeCallable(queueServiceTxFunctions, roomId, bedNo, docId, docName)
);
try {
@@ -178,7 +168,7 @@
@Override
public ErrorCode startBedDoctorOn(Long roomId, String bedNo, Long docId, String docName) {
Future<ErrorCode> future = singleThreadExecutor.submit(
- new BedDoctorOnCallable(this, roomId, bedNo, docId, docName)
+ new BedDoctorOnCallable(queueServiceTxFunctions, roomId, bedNo, docId, docName)
);
try {
@@ -197,7 +187,7 @@
@Override
public ErrorCode startBedDoctorOff(Long roomId, String bedNo, Long docId, String docName) {
Future<ErrorCode> future = singleThreadExecutor.submit(
- new BedDoctorOffCallable(this, roomId, bedNo, docId, docName)
+ new BedDoctorOffCallable(queueServiceTxFunctions, roomId, bedNo, docId, docName)
);
try {
@@ -216,7 +206,7 @@
@Override
public ErrorCode startNextPatient(Long roomId, String bedNo) {
Future<ErrorCode> future = singleThreadExecutor.submit(
- new BedDoctorNextPatientCallable(this, roomId, bedNo)
+ new BedDoctorNextPatientCallable(queueServiceTxFunctions, roomId, bedNo)
);
try {
@@ -235,112 +225,31 @@
@Override
public void startHurryUp() {
singleThreadExecutor.execute( () -> {
- hurryup();
+ queueServiceTxFunctions.hurryup();
});
}
@Override
public void startBedReload() {
singleThreadExecutor.execute( () -> {
- bedReload();
- hurryup();
- monitorInfo();
+ queueServiceTxFunctions.bedReload();
+ queueServiceTxFunctions.hurryup();
+ queueServiceTxFunctions.monitorInfo();
});
}
@Override
public void startResetRoom() {
singleThreadExecutor.execute( () -> {
- resetRoom();
- bedReload();
- monitorInfo();
+ queueServiceTxFunctions.resetRoom();
+ queueServiceTxFunctions.bedReload();
+ queueServiceTxFunctions.monitorInfo();
});
}
@Override
public MonitorInfoVO getMonitorInfo() {
- MonitorInfoVO monitorInfoVO = new MonitorInfoVO();
- monitorInfoVO.setOpeningFlag( openingFlag.get() );
- monitorInfoVO.setQueueNum( mapBedVsQueue.size() );
- monitorInfoVO.setActiveQueueNum( priorityQueue.size() );
- return monitorInfoVO;
- }
-
- /**
- * 宸插叧闂� 鎴栬�� 鍏抽棴涓紝鍙互寮�閫氬伐浣�
- * @param roomId
- * @param bedNo
- * @return
- */
- @Override
- 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);
- return QUEUE_BED_EXIST;
- }
-
- // DB update
- List statusList = new ArrayList<BedStatusEnum>();
- statusList.add(BedStatusEnum.CLOSED);
- Integer updateNum = roomMapper.setBedOpeningOpening(roomId, bedNo, BedStatusEnum.OPENING, statusList);
- if ( null==updateNum || 0 == updateNum ) {
- log.error("bedOpen DB invalid status. " + roomId + " " + bedNo);
- return ROOM_INVALID_STATUS;
- }
-
- List<Byte> queueStatusList = new ArrayList<>();
- queueStatusList.add(QueueStatusEnum.READY.getStatus());
- List<QueueDO> queueDOList = queueMapper.getDoctorQueueByStatus(roomId, bedNo, queueStatusList);
-
- // 鏂板宸ヤ綅 浼樺厛闃熷垪
- BedQueueBO bedQueueBO = new BedQueueBO();
- bedQueueBO.setRoomId(roomId);
- bedQueueBO.setRoomName(roomName);
- bedQueueBO.setBedNo(bedNo);
- bedQueueBO.setMaxQueueNum(queueReadyMax);
- bedQueueBO.setQueueNum(new AtomicInteger(queueDOList.size()));
- bedQueueBO.setStatus(BedStatusEnum.OPENING.getStatus());
- priorityQueue.offer(bedQueueBO);
- mapBedVsQueue.put(String.format("%09d%s", roomId, bedNo), bedQueueBO);
-
- return GlobalErrorCodeConstants.SUCCESS;
- }
-
- @Override
- public ErrorCode bedClose(Long roomId, String bedNo) {
- BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo));
- if (null == bedQueueBO) {
- log.error("bedClose mapBedVsQueue DONOT existed. " + roomId + " " + bedNo);
- return QUEUE_BED_NOT_EXIST;
- }
-
- // 闄や簡鍒ゆ柇 鍑嗗鍊欒瘖涓� 鐨勪汉鏁帮紝杩橀渶瑕� 鍒ゆ柇 杩囧彿鐨勪汉鏁�
- //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.RECALLED.getStatus());
- List<QueueDO> queueDOList = queueMapper.getDoctorQueueByStatus(roomId, bedNo, queueStatusList);
- if (queueDOList.size() > 0)
- return QUEUE_HAVE_PATIENT;
-
- // DB update
- List statusList = new ArrayList<BedStatusEnum>();
- statusList.add(BedStatusEnum.OPENING);
- statusList.add(BedStatusEnum.DOCTOR_ON);
- statusList.add(BedStatusEnum.PAUSE);
- Integer updateNum = roomMapper.setBedOpeningClosed(roomId, bedNo,
- BedStatusEnum.CLOSED, statusList);
- if ( null==updateNum || 0 == updateNum ) {
- log.error("bedClose DB invalid status. " + roomId + " " + bedNo);
- return ROOM_INVALID_STATUS;
- }
-
- mapBedVsQueue.remove(String.format("%09d%s", roomId, bedNo));
- priorityQueue.remove(bedQueueBO);
- return GlobalErrorCodeConstants.SUCCESS;
+ return queueServiceTxFunctions.getMonitorInfo();
}
@Override
@@ -350,7 +259,7 @@
return error(ROOM_NOT_SIT);
}
- BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo));
+ BedQueueBO bedQueueBO = queueServiceTxFunctions.getBedQueueBO(roomId, bedNo);
if (null == bedQueueBO) {
log.error("getRoom mapBedVsQueue DONOT existed. " + roomId + " " + bedNo);
return error(QUEUE_BED_NOT_EXIST);
@@ -358,110 +267,6 @@
RoomRespVO roomRespVO = BeanUtils.toBean(roomDO, RoomRespVO.class);
return success(roomRespVO);
- }
-
- @Override
- public ErrorCode bedDoctorPause(Long roomId, String bedNo, Long docId, String docName) {
- BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo));
- if (null == bedQueueBO) {
- log.error("bedDoctorPause mapBedVsQueue DONOT existed. " + roomId + " " + bedNo);
- return QUEUE_BED_NOT_EXIST;
- }
-
- // DB update
- List statusList = new ArrayList<BedStatusEnum>();
- statusList.add(BedStatusEnum.DOCTOR_ON);
- Integer updateNum = roomMapper.setBedDoctorStatus(roomId, bedNo, docId, BedStatusEnum.PAUSE, statusList);
- if ( null==updateNum || 0 == updateNum ) {
- log.error("bedDoctorPause DB invalid status. " + roomId + " " + bedNo);
- return ROOM_INVALID_STATUS;
- }
-
- bedQueueBO.setStatus(BedStatusEnum.PAUSE.getStatus());
- priorityQueue.remove(bedQueueBO);
- return GlobalErrorCodeConstants.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 || !bedQueueBO.getStatus().equals(BedStatusEnum.PAUSE.getStatus())) {
- log.error("bedDoctorResume mapBedVsQueue DONOT existed OR NOT Paused. " + roomId + " " + bedNo);
- return QUEUE_BED_NOT_EXIST;
- }
-
- // DB update
- List statusList = new ArrayList<BedStatusEnum>();
- statusList.add(BedStatusEnum.PAUSE);
- Integer updateNum = roomMapper.setBedDoctorStatus(roomId, bedNo, docId,
- BedStatusEnum.DOCTOR_ON, statusList);
- if ( null==updateNum || 0 == updateNum ) {
- log.error("bedDoctorResume DB invalid status. " + roomId + " " + bedNo);
- return ROOM_INVALID_STATUS;
- }
-
- bedQueueBO.setStatus(BedStatusEnum.DOCTOR_ON.getStatus());
- if (!priorityQueue.contains(bedQueueBO)) {
- priorityQueue.offer(bedQueueBO);
- } else {
- log.error("bedDoctorResume priorityQueue still exist!. " + roomId + " " + bedNo);
- return ECG_INNER_ERROR;
- }
-
- return GlobalErrorCodeConstants.SUCCESS;
- }
-
- @Override
- public ErrorCode bedDoctorOn(Long roomId, String bedNo, Long docId, String docName) {
- BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo));
- if (null == bedQueueBO) {
- log.error("bedDoctorOn mapBedVsQueue DONOT existed. " + roomId + " " + bedNo);
- return QUEUE_BED_NOT_EXIST;
- }
-
- // DB update
- List statusList = new ArrayList<BedStatusEnum>();
- statusList.add(BedStatusEnum.OPENING);
- Integer updateNum = roomMapper.setBedDoctorOn(roomId, bedNo, docId, docName, BedStatusEnum.DOCTOR_ON, statusList);
- if ( null==updateNum || 0 == updateNum ) {
- log.error("bedDoctorOn DB invalid status. " + roomId + " " + bedNo);
- return ROOM_INVALID_STATUS;
- }
-
- bedQueueBO.setStatus(BedStatusEnum.DOCTOR_ON.getStatus());
- return GlobalErrorCodeConstants.SUCCESS;
- }
-
- @Override
- public ErrorCode bedDoctorOff(Long roomId, String bedNo, Long docId, String docName) {
- BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo));
- if (null == bedQueueBO) {
- log.error("bedDoctorOff mapBedVsQueue DONOT existed. " + roomId + " " + bedNo);
- return QUEUE_BED_NOT_EXIST;
- }
-
- // DB update
- List statusList = new ArrayList<BedStatusEnum>();
- statusList.add(BedStatusEnum.DOCTOR_ON);
- statusList.add(BedStatusEnum.PAUSE);
- Integer updateNum = roomMapper.setBedDoctorOff(roomId, bedNo, docId, BedStatusEnum.OPENING, statusList);
- if ( null==updateNum || 0 == updateNum ) {
- log.error("bedDoctorOff DB invalid status. " + roomId + " " + bedNo);
- return ROOM_INVALID_STATUS;
- }
-
- // 濡傛灉鏄湪 PAUSE 鐘舵�佺搴х殑锛岄渶瑕侀噸鏂板姞鍥� 浼樺厛闃熷垪
- if (bedQueueBO.getStatus().equals(BedStatusEnum.PAUSE.getStatus())) {
- if (!priorityQueue.contains(bedQueueBO)) {
- priorityQueue.offer(bedQueueBO);
- } else {
- log.error("bedDoctorResume priorityQueue still exist!. " + roomId + " " + bedNo);
- return ECG_INNER_ERROR;
- }
- }
-
- bedQueueBO.setStatus(BedStatusEnum.OPENING.getStatus());
- return GlobalErrorCodeConstants.SUCCESS;
}
private void validatequeueExists(Integer id) {
@@ -480,122 +285,6 @@
return queueMapper.selectPage(pageReqVO);
}
- /**
- * 1. 姣忓ぉ寮�璇婂墠 浠嶥B鍚屾宸ヤ綅鐨勬偅鑰呴槦鍒楁暟鎹埌 宸ヤ綅浼樺厛闃熷垪
- * 2. 鏈嶅姟杩愮淮閲嶅惎鏃�
- */
- @Override
- public ErrorCode bedReload() {
- priorityQueue.clear();
- mapBedVsQueue.clear();
-
- // 娓呴櫎闈炲綋澶╃殑鎺掗槦浜哄憳
- queueMapper.clearQueue();
- // 娓呴櫎闈炲綋澶╃殑璇煶鍙彿璁板綍
- callMapper.clearCall();
-
- // 浠嶥B 鑾峰彇 宸ヤ綅鍒楄〃
- List<BedStatusEnum> bedStatusEnumList = new ArrayList<BedStatusEnum>();
- bedStatusEnumList.add(BedStatusEnum.OPENING);
- bedStatusEnumList.add(BedStatusEnum.DOCTOR_ON);
- bedStatusEnumList.add(BedStatusEnum.PAUSE);
- List<RoomDO> roomDOList = roomMapper.simpleRoomList(bedStatusEnumList);
- List<BedQueueBO> bedQueueBOList = roomDOList.stream().map(item -> BeanUtils.toBean(item, BedQueueBO.class)).toList();
-
- // 浠嶥B 鑾峰彇 闃熷垪涓� 灏辫瘖鍑嗗涓汉鍛樼粺璁� 鍒楄〃
- List<Byte> queueStatusList = new ArrayList<>();
- queueStatusList.add(QueueStatusEnum.READY.getStatus());
- List<QueueStatisticDO> queueStatisticDOList = queueMapper.queueStatistic(queueStatusList);
-
- bedQueueBOList.forEach(item -> {
- item.maxQueueNum = queueReadyMax;
- Optional<QueueStatisticDO> queueStatisticDOOptional = queueStatisticDOList.stream().filter(it->it.getRoomId()==item.roomId && it.getBedNo().equals(item.getBedNo())).findFirst();
- int queueNum = queueStatisticDOOptional.isPresent() ? queueStatisticDOOptional.get().getTotalInStatus() : 0;
- if ( queueReadyMax < queueNum )
- throw new RuntimeException("init: exceed max queue number!");
-
- item.queueNum.set( queueNum );
- 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 GlobalErrorCodeConstants.SUCCESS;
- }
-
- /**
- *
- */
- public void hurryup() {
- if (0 == openingFlag.get())
- return;
-
- // 澶勭悊 杩囧彿-鍥炴潵 鐨勪汉
- for (BedQueueBO bedQueueBO : mapBedVsQueue.values()) {
- while (bedQueueBO.queueNum.get() < bedQueueBO.maxQueueNum) {
- // 鏌ョ湅 褰撳墠宸ヤ綅 鏄惁鏈夎繃鍙�-鍥炴潵鐨勬偅鑰�
- Integer updateNum = queueMapper.queueRecalledPatient(
- bedQueueBO.getRoomId(),
- bedQueueBO.getRoomName(),
- bedQueueBO.getBedNo(),
- curSeqNum.get() + 1,
- QueueStatusEnum.RECALLED.getStatus(),
- QueueStatusEnum.READY.getStatus());
- if (null == updateNum || 0 == updateNum)
- break;
-
- curSeqNum.getAndIncrement();
-
- // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡鍊�
- bedQueueBO.queueNum.incrementAndGet();
-
- // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡浼樺厛闃熷垪椤哄簭
- priorityQueue.remove(bedQueueBO);
- priorityQueue.offer(bedQueueBO);
- }
- }
-
- // 澶勭悊 鎺掗槦涓� 鎮h��
- while (true) {
- BedQueueBO bedQueueBO = priorityQueue.peek();
- if (null == bedQueueBO)
- return;
-
- int curQueueNum = bedQueueBO.queueNum.get();
- if (curQueueNum > bedQueueBO.maxQueueNum)
- throw new RuntimeException("hurryup: exceed max queue number!");
-
- if (curQueueNum == bedQueueBO.maxQueueNum)
- return;
-
- // 鏌ョ湅 鏄惁鏈夋帓闃熶腑鐨勬偅鑰�
- Integer updateNum = queueMapper.preemptPatient(
- bedQueueBO.getRoomId(),
- bedQueueBO.getRoomName(),
- bedQueueBO.getBedNo(),
- curSeqNum.get() + 1,
- QueueStatusEnum.WAITING.getStatus(),
- QueueStatusEnum.READY.getStatus());
-
- // 娌℃湁鎶㈠埌鎺掗槦鎮h��
- if (null == updateNum || 0 == updateNum) {
- return;
- }
-
- curSeqNum.getAndIncrement();
-
- // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡鍊�
- bedQueueBO.queueNum.incrementAndGet();
-
- // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡浼樺厛闃熷垪椤哄簭
- priorityQueue.remove(bedQueueBO);
- priorityQueue.offer(bedQueueBO);
- }
- }
/**
* 棰勭害纭鍚庣殑鎺掗槦
@@ -613,25 +302,6 @@
devRentMapper.insert(devRent);
startHurryUp();
- }
-
- @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 QUEUE_NOT_READY_PATIENT;
- }
-
- // 浼樺厛闃熷垪涓� 璇ュ伐浣� 灏辫瘖鍑嗗涓汉鐨勬暟閲� 鍑忎竴
- BedQueueBO bo = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo));
- bo.queueNum.getAndDecrement(); // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 hurry-up 涓敼鍙樹簡鍊�
- priorityQueue.remove(bo);
- priorityQueue.offer(bo);
-
- return GlobalErrorCodeConstants.SUCCESS;
}
public void finishNextPatient(Long roomId, String bedNo) {
@@ -678,19 +348,19 @@
@Override
public void setQueueReadyMax(Integer max) {
- queueReadyMax = max;
+ queueServiceTxFunctions.setQueueReadyMax( max );
}
public void startBiz() {
- if (1 == openingFlag.get())
+ if (1 == queueServiceTxFunctions.getOpeningFlag())
return;
- openingFlag.set(1);
+ queueServiceTxFunctions.setOpeningFlag(1);
startBedReload();
}
public void closeBiz() {
- openingFlag.set(0);
+ queueServiceTxFunctions.setOpeningFlag(0);
startBedReload();
}
@@ -710,27 +380,8 @@
}
@Override
- public void monitorInfo() {
- log.info("map " + mapBedVsQueue.size() + " priority " + priorityQueue.size()
- + " opening " + openingFlag.get());
- }
-
- @Override
public RoomDO getDocRoomInfo(Long docId) {
return roomMapper.getRoomByDocId(docId);
- }
-
- 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);
-
- // 鍏抽棴鎵�鏈夊伐浣�
- Integer ret = roomMapper.resetRoom(BedStatusEnum.CLOSED.getStatus());
}
}
diff --git a/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceTxFunctions.java b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceTxFunctions.java
new file mode 100644
index 0000000..93ed504
--- /dev/null
+++ b/jh-module-ecg/jh-module-ecg-biz/src/main/java/cn/lihu/jh/module/ecg/service/queue/QueueServiceTxFunctions.java
@@ -0,0 +1,428 @@
+package cn.lihu.jh.module.ecg.service.queue;
+
+import cn.lihu.jh.framework.common.exception.ErrorCode;
+import cn.lihu.jh.framework.common.exception.enums.GlobalErrorCodeConstants;
+import cn.lihu.jh.framework.common.pojo.CommonResult;
+import cn.lihu.jh.framework.common.pojo.PageResult;
+import cn.lihu.jh.framework.common.util.object.BeanUtils;
+import cn.lihu.jh.module.ecg.controller.admin.queue.vo.PatientStatisticVO;
+import cn.lihu.jh.module.ecg.controller.admin.queue.vo.QueuePageReqVO;
+import cn.lihu.jh.module.ecg.controller.admin.queue.vo.QueueSaveReqVO;
+import cn.lihu.jh.module.ecg.controller.admin.room.vo.MonitorInfoVO;
+import cn.lihu.jh.module.ecg.controller.admin.room.vo.RoomRespVO;
+import cn.lihu.jh.module.ecg.dal.dataobject.devrent.DevRentDO;
+import cn.lihu.jh.module.ecg.dal.dataobject.queue.BedQueueStatisticDO;
+import cn.lihu.jh.module.ecg.dal.dataobject.queue.QueueDO;
+import cn.lihu.jh.module.ecg.dal.dataobject.queue.QueueStatisticDO;
+import cn.lihu.jh.module.ecg.dal.dataobject.room.RoomDO;
+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.dal.mysql.queue.queueMapper;
+import cn.lihu.jh.module.ecg.dal.mysql.room.RoomMapper;
+import cn.lihu.jh.module.ecg.enums.BedStatusEnum;
+import cn.lihu.jh.module.ecg.enums.DevRentStateEnum;
+import cn.lihu.jh.module.ecg.enums.QueueStatusEnum;
+import cn.lihu.jh.module.system.api.oauth2.OAuth2TokenApi;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
+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.enums.ErrorCodeConstants.*;
+
+/**
+ * 鎺掗槦 Service 鏁版嵁搴撲簨鍔$浉鍏崇殑鏂规硶
+ *
+ * @author 鑺嬮亾婧愮爜
+ */
+@Component
+@Validated
+@Slf4j
+public class QueueServiceTxFunctions {
+
+ @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);
+
+ PriorityBlockingQueue<BedQueueBO> priorityQueue = new PriorityBlockingQueue<>();
+ ConcurrentHashMap<String, BedQueueBO > mapBedVsQueue = new ConcurrentHashMap<>();
+
+ Integer queueReadyMax = 0;
+
+ /**
+ * 宸插叧闂� 鎴栬�� 鍏抽棴涓紝鍙互寮�閫氬伐浣�
+ * @param roomId
+ * @param bedNo
+ * @return
+ */
+ 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);
+ return QUEUE_BED_EXIST;
+ }
+
+ // DB update
+ List statusList = new ArrayList<BedStatusEnum>();
+ statusList.add(BedStatusEnum.CLOSED);
+ Integer updateNum = roomMapper.setBedOpeningOpening(roomId, bedNo, BedStatusEnum.OPENING, statusList);
+ if ( null==updateNum || 0 == updateNum ) {
+ log.error("bedOpen DB invalid status. " + roomId + " " + bedNo);
+ return ROOM_INVALID_STATUS;
+ }
+
+ List<Byte> queueStatusList = new ArrayList<>();
+ queueStatusList.add(QueueStatusEnum.READY.getStatus());
+ List<QueueDO> queueDOList = queueMapper.getDoctorQueueByStatus(roomId, bedNo, queueStatusList);
+
+ // 鏂板宸ヤ綅 浼樺厛闃熷垪
+ BedQueueBO bedQueueBO = new BedQueueBO();
+ bedQueueBO.setRoomId(roomId);
+ bedQueueBO.setRoomName(roomName);
+ bedQueueBO.setBedNo(bedNo);
+ bedQueueBO.setMaxQueueNum(queueReadyMax);
+ bedQueueBO.setQueueNum(new AtomicInteger(queueDOList.size()));
+ bedQueueBO.setStatus(BedStatusEnum.OPENING.getStatus());
+ priorityQueue.offer(bedQueueBO);
+ mapBedVsQueue.put(String.format("%09d%s", roomId, bedNo), bedQueueBO);
+
+ return GlobalErrorCodeConstants.SUCCESS;
+ }
+
+ public ErrorCode bedClose(Long roomId, String bedNo) {
+ BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo));
+ if (null == bedQueueBO) {
+ log.error("bedClose mapBedVsQueue DONOT existed. " + roomId + " " + bedNo);
+ return QUEUE_BED_NOT_EXIST;
+ }
+
+ // 闄や簡鍒ゆ柇 鍑嗗鍊欒瘖涓� 鐨勪汉鏁帮紝杩橀渶瑕� 鍒ゆ柇 杩囧彿鐨勪汉鏁�
+ //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.RECALLED.getStatus());
+ List<QueueDO> queueDOList = queueMapper.getDoctorQueueByStatus(roomId, bedNo, queueStatusList);
+ if (queueDOList.size() > 0)
+ return QUEUE_HAVE_PATIENT;
+
+ // DB update
+ List statusList = new ArrayList<BedStatusEnum>();
+ statusList.add(BedStatusEnum.OPENING);
+ statusList.add(BedStatusEnum.DOCTOR_ON);
+ statusList.add(BedStatusEnum.PAUSE);
+ Integer updateNum = roomMapper.setBedOpeningClosed(roomId, bedNo,
+ BedStatusEnum.CLOSED, statusList);
+ if ( null==updateNum || 0 == updateNum ) {
+ log.error("bedClose DB invalid status. " + roomId + " " + bedNo);
+ return ROOM_INVALID_STATUS;
+ }
+
+ mapBedVsQueue.remove(String.format("%09d%s", roomId, bedNo));
+ priorityQueue.remove(bedQueueBO);
+ return GlobalErrorCodeConstants.SUCCESS;
+ }
+
+ public ErrorCode bedDoctorPause(Long roomId, String bedNo, Long docId, String docName) {
+ BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo));
+ if (null == bedQueueBO) {
+ log.error("bedDoctorPause mapBedVsQueue DONOT existed. " + roomId + " " + bedNo);
+ return QUEUE_BED_NOT_EXIST;
+ }
+
+ // DB update
+ List statusList = new ArrayList<BedStatusEnum>();
+ statusList.add(BedStatusEnum.DOCTOR_ON);
+ Integer updateNum = roomMapper.setBedDoctorStatus(roomId, bedNo, docId, BedStatusEnum.PAUSE, statusList);
+ if ( null==updateNum || 0 == updateNum ) {
+ log.error("bedDoctorPause DB invalid status. " + roomId + " " + bedNo);
+ return ROOM_INVALID_STATUS;
+ }
+
+ bedQueueBO.setStatus(BedStatusEnum.PAUSE.getStatus());
+ priorityQueue.remove(bedQueueBO);
+ return GlobalErrorCodeConstants.SUCCESS;
+ }
+
+ public ErrorCode bedDoctorResume(Long roomId, String bedNo, Long docId, String docName) {
+ BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo));
+ if (null == bedQueueBO || !bedQueueBO.getStatus().equals(BedStatusEnum.PAUSE.getStatus())) {
+ log.error("bedDoctorResume mapBedVsQueue DONOT existed OR NOT Paused. " + roomId + " " + bedNo);
+ return QUEUE_BED_NOT_EXIST;
+ }
+
+ // DB update
+ List statusList = new ArrayList<BedStatusEnum>();
+ statusList.add(BedStatusEnum.PAUSE);
+ Integer updateNum = roomMapper.setBedDoctorStatus(roomId, bedNo, docId,
+ BedStatusEnum.DOCTOR_ON, statusList);
+ if ( null==updateNum || 0 == updateNum ) {
+ log.error("bedDoctorResume DB invalid status. " + roomId + " " + bedNo);
+ return ROOM_INVALID_STATUS;
+ }
+
+ bedQueueBO.setStatus(BedStatusEnum.DOCTOR_ON.getStatus());
+ if (!priorityQueue.contains(bedQueueBO)) {
+ priorityQueue.offer(bedQueueBO);
+ } else {
+ log.error("bedDoctorResume priorityQueue still exist!. " + roomId + " " + bedNo);
+ return ECG_INNER_ERROR;
+ }
+
+ return GlobalErrorCodeConstants.SUCCESS;
+ }
+
+ public ErrorCode bedDoctorOn(Long roomId, String bedNo, Long docId, String docName) {
+ BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo));
+ if (null == bedQueueBO) {
+ log.error("bedDoctorOn mapBedVsQueue DONOT existed. " + roomId + " " + bedNo);
+ return QUEUE_BED_NOT_EXIST;
+ }
+
+ // DB update
+ List statusList = new ArrayList<BedStatusEnum>();
+ statusList.add(BedStatusEnum.OPENING);
+ Integer updateNum = roomMapper.setBedDoctorOn(roomId, bedNo, docId, docName, BedStatusEnum.DOCTOR_ON, statusList);
+ if ( null==updateNum || 0 == updateNum ) {
+ log.error("bedDoctorOn DB invalid status. " + roomId + " " + bedNo);
+ return ROOM_INVALID_STATUS;
+ }
+
+ bedQueueBO.setStatus(BedStatusEnum.DOCTOR_ON.getStatus());
+ return GlobalErrorCodeConstants.SUCCESS;
+ }
+
+ public ErrorCode bedDoctorOff(Long roomId, String bedNo, Long docId, String docName) {
+ BedQueueBO bedQueueBO = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo));
+ if (null == bedQueueBO) {
+ log.error("bedDoctorOff mapBedVsQueue DONOT existed. " + roomId + " " + bedNo);
+ return QUEUE_BED_NOT_EXIST;
+ }
+
+ // DB update
+ List statusList = new ArrayList<BedStatusEnum>();
+ statusList.add(BedStatusEnum.DOCTOR_ON);
+ statusList.add(BedStatusEnum.PAUSE);
+ Integer updateNum = roomMapper.setBedDoctorOff(roomId, bedNo, docId, BedStatusEnum.OPENING, statusList);
+ if ( null==updateNum || 0 == updateNum ) {
+ log.error("bedDoctorOff DB invalid status. " + roomId + " " + bedNo);
+ return ROOM_INVALID_STATUS;
+ }
+
+ // 濡傛灉鏄湪 PAUSE 鐘舵�佺搴х殑锛岄渶瑕侀噸鏂板姞鍥� 浼樺厛闃熷垪
+ if (bedQueueBO.getStatus().equals(BedStatusEnum.PAUSE.getStatus())) {
+ if (!priorityQueue.contains(bedQueueBO)) {
+ priorityQueue.offer(bedQueueBO);
+ } else {
+ log.error("bedDoctorResume priorityQueue still exist!. " + roomId + " " + bedNo);
+ return ECG_INNER_ERROR;
+ }
+ }
+
+ bedQueueBO.setStatus(BedStatusEnum.OPENING.getStatus());
+ return GlobalErrorCodeConstants.SUCCESS;
+ }
+
+ 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 QUEUE_NOT_READY_PATIENT;
+ }
+
+ // 浼樺厛闃熷垪涓� 璇ュ伐浣� 灏辫瘖鍑嗗涓汉鐨勬暟閲� 鍑忎竴
+ BedQueueBO bo = mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo));
+ bo.queueNum.getAndDecrement(); // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 hurry-up 涓敼鍙樹簡鍊�
+ priorityQueue.remove(bo);
+ priorityQueue.offer(bo);
+
+ return GlobalErrorCodeConstants.SUCCESS;
+ }
+
+ /**
+ * 1. 姣忓ぉ寮�璇婂墠 浠嶥B鍚屾宸ヤ綅鐨勬偅鑰呴槦鍒楁暟鎹埌 宸ヤ綅浼樺厛闃熷垪
+ * 2. 鏈嶅姟杩愮淮閲嶅惎鏃�
+ */
+ public ErrorCode bedReload() {
+ priorityQueue.clear();
+ mapBedVsQueue.clear();
+
+ // 娓呴櫎闈炲綋澶╃殑鎺掗槦浜哄憳
+ queueMapper.clearQueue();
+ // 娓呴櫎闈炲綋澶╃殑璇煶鍙彿璁板綍
+ callMapper.clearCall();
+
+ // 浠嶥B 鑾峰彇 宸ヤ綅鍒楄〃
+ List<BedStatusEnum> bedStatusEnumList = new ArrayList<BedStatusEnum>();
+ bedStatusEnumList.add(BedStatusEnum.OPENING);
+ bedStatusEnumList.add(BedStatusEnum.DOCTOR_ON);
+ bedStatusEnumList.add(BedStatusEnum.PAUSE);
+ List<RoomDO> roomDOList = roomMapper.simpleRoomList(bedStatusEnumList);
+ List<BedQueueBO> bedQueueBOList = roomDOList.stream().map(item -> BeanUtils.toBean(item, BedQueueBO.class)).toList();
+
+ // 浠嶥B 鑾峰彇 闃熷垪涓� 灏辫瘖鍑嗗涓汉鍛樼粺璁� 鍒楄〃
+ List<Byte> queueStatusList = new ArrayList<>();
+ queueStatusList.add(QueueStatusEnum.READY.getStatus());
+ List<QueueStatisticDO> queueStatisticDOList = queueMapper.queueStatistic(queueStatusList);
+
+ bedQueueBOList.forEach(item -> {
+ item.maxQueueNum = queueReadyMax;
+ Optional<QueueStatisticDO> queueStatisticDOOptional = queueStatisticDOList.stream().filter(it->it.getRoomId()==item.roomId && it.getBedNo().equals(item.getBedNo())).findFirst();
+ int queueNum = queueStatisticDOOptional.isPresent() ? queueStatisticDOOptional.get().getTotalInStatus() : 0;
+ if ( queueReadyMax < queueNum )
+ throw new RuntimeException("init: exceed max queue number!");
+
+ item.queueNum.set( queueNum );
+ 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 GlobalErrorCodeConstants.SUCCESS;
+ }
+
+ 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);
+
+ // 鍏抽棴鎵�鏈夊伐浣�
+ Integer ret = roomMapper.resetRoom(BedStatusEnum.CLOSED.getStatus());
+ }
+
+ /**
+ * 鎶婂尰鐢熷�欒瘖鐨勯槦鍒楀婊�
+ */
+ public void hurryup() {
+ if (0 == openingFlag.get())
+ return;
+
+ // 澶勭悊 杩囧彿-鍥炴潵 鐨勪汉
+ for (BedQueueBO bedQueueBO : mapBedVsQueue.values()) {
+ while (bedQueueBO.queueNum.get() < bedQueueBO.maxQueueNum) {
+ // 鏌ョ湅 褰撳墠宸ヤ綅 鏄惁鏈夎繃鍙�-鍥炴潵鐨勬偅鑰�
+ Integer updateNum = queueMapper.queueRecalledPatient(
+ bedQueueBO.getRoomId(),
+ bedQueueBO.getRoomName(),
+ bedQueueBO.getBedNo(),
+ curSeqNum.get() + 1,
+ QueueStatusEnum.RECALLED.getStatus(),
+ QueueStatusEnum.READY.getStatus());
+ if (null == updateNum || 0 == updateNum)
+ break;
+
+ curSeqNum.getAndIncrement();
+
+ // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡鍊�
+ bedQueueBO.queueNum.incrementAndGet();
+
+ // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡浼樺厛闃熷垪椤哄簭
+ priorityQueue.remove(bedQueueBO);
+ priorityQueue.offer(bedQueueBO);
+ }
+ }
+
+ // 澶勭悊 鎺掗槦涓� 鎮h��
+ while (true) {
+ BedQueueBO bedQueueBO = priorityQueue.peek();
+ if (null == bedQueueBO)
+ return;
+
+ int curQueueNum = bedQueueBO.queueNum.get();
+ if (curQueueNum > bedQueueBO.maxQueueNum)
+ throw new RuntimeException("hurryup: exceed max queue number!");
+
+ if (curQueueNum == bedQueueBO.maxQueueNum)
+ return;
+
+ // 鏌ョ湅 鏄惁鏈夋帓闃熶腑鐨勬偅鑰�
+ Integer updateNum = queueMapper.preemptPatient(
+ bedQueueBO.getRoomId(),
+ bedQueueBO.getRoomName(),
+ bedQueueBO.getBedNo(),
+ curSeqNum.get() + 1,
+ QueueStatusEnum.WAITING.getStatus(),
+ QueueStatusEnum.READY.getStatus());
+
+ // 娌℃湁鎶㈠埌鎺掗槦鎮h��
+ if (null == updateNum || 0 == updateNum) {
+ return;
+ }
+
+ curSeqNum.getAndIncrement();
+
+ // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡鍊�
+ bedQueueBO.queueNum.incrementAndGet();
+
+ // 鍙兘宸茬粡銆愬苟鍙戠殑銆戝湪 nextPatient 涓敼鍙樹簡浼樺厛闃熷垪椤哄簭
+ priorityQueue.remove(bedQueueBO);
+ priorityQueue.offer(bedQueueBO);
+ }
+ }
+
+ public Integer getOpeningFlag() {
+ return openingFlag.get();
+ }
+
+ public void setOpeningFlag(Integer flag) {
+ openingFlag.set(flag);
+ }
+
+ public void setQueueReadyMax(Integer max) {
+ queueReadyMax = max;
+ }
+
+ public BedQueueBO getBedQueueBO(Long roomId, String bedNo) {
+ return mapBedVsQueue.get(String.format("%09d%s", roomId, bedNo));
+ }
+
+ public MonitorInfoVO getMonitorInfo() {
+ MonitorInfoVO monitorInfoVO = new MonitorInfoVO();
+ monitorInfoVO.setOpeningFlag( openingFlag.get() );
+ monitorInfoVO.setQueueNum( mapBedVsQueue.size() );
+ monitorInfoVO.setActiveQueueNum( priorityQueue.size() );
+ return monitorInfoVO;
+ }
+
+ public void monitorInfo() {
+ log.info("map " + mapBedVsQueue.size() + " priority " + priorityQueue.size()
+ + " opening " + openingFlag.get());
+ }
+
+}
--
Gitblit v1.9.3