From f2d353e0eb4386630cc272015cd6d2324b4836f5 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Sat, 5 Oct 2024 19:55:42 +0800 Subject: [PATCH] update --- README.md | 12 +- .../a8k/service/appdata/AppSampleMgrService.java | 4 +- .../DO_CHECK_THE_QUANTITY_OF_CONSUMABLES.java | 47 ------- .../appdevicectrl/action/base/A8kStepAction.java | 4 + .../mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java | 39 +++--- .../mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java | 20 ++- .../SEQ3_CHECK_THE_QUANTITY_OF_CONSUMABLES.java | 62 +++++++++ .../scheduler/MainFlowCtrlScheduler.java | 141 ++++++++++++--------- .../a8k/service/appstate/AppA8kGStateService.java | 12 +- .../a8k/service/appstate/type/IncubationPlate.java | 26 ++++ .../appstate/type/IncubationPlateStatus.java | 11 -- .../service/appstate/type/IncubationSubTank.java | 31 +++++ .../service/appstate/type/ReactingPlateState.java | 31 ----- src/main/java/a8k/service/appstate/type/Tube.java | 22 ++++ .../java/a8k/service/appstate/type/TubeHolder.java | 10 +- .../java/a8k/service/appstate/type/TubeState.java | 22 ---- .../type/state/IncubationSubTankState.java | 9 ++ .../appstate/type/state/ReactionPlateState.java | 9 -- .../appstate/type/state/TubeProcessState.java | 10 -- .../a8k/service/appstate/type/state/TubeState.java | 10 ++ src/main/java/a8k/type/IncubatorPos.java | 10 ++ 21 files changed, 302 insertions(+), 240 deletions(-) delete mode 100644 src/main/java/a8k/service/appdevicectrl/action/DO_CHECK_THE_QUANTITY_OF_CONSUMABLES.java create mode 100644 src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ3_CHECK_THE_QUANTITY_OF_CONSUMABLES.java create mode 100644 src/main/java/a8k/service/appstate/type/IncubationPlate.java delete mode 100644 src/main/java/a8k/service/appstate/type/IncubationPlateStatus.java create mode 100644 src/main/java/a8k/service/appstate/type/IncubationSubTank.java delete mode 100644 src/main/java/a8k/service/appstate/type/ReactingPlateState.java create mode 100644 src/main/java/a8k/service/appstate/type/Tube.java delete mode 100644 src/main/java/a8k/service/appstate/type/TubeState.java create mode 100644 src/main/java/a8k/service/appstate/type/state/IncubationSubTankState.java delete mode 100644 src/main/java/a8k/service/appstate/type/state/ReactionPlateState.java delete mode 100644 src/main/java/a8k/service/appstate/type/state/TubeProcessState.java create mode 100644 src/main/java/a8k/service/appstate/type/state/TubeState.java diff --git a/README.md b/README.md index bdbdd8b..7bedd76 100644 --- a/README.md +++ b/README.md @@ -153,14 +153,14 @@ TODO: 核对资源是否可以被处理 - BEFORE_PROCESS 预处理A(脱帽,摇匀) - BEFORE_PROCESS 预处理B(hbot取tip头,移动到待机位) - BEFORE_PROCESS 预处理C(推出反应板夹) + BEFORE_PROCESS 预处理A(脱帽,摇匀) + BEFORE_PROCESS 预处理B(hbot取tip头,移动到待机位) + BEFORE_PROCESS 预处理C(推出反应板夹) - PROCESS 处理(取样,处理,滴定) + PROCESS 处理(取样,处理,滴定) - AFTER_PROCESS 后处理 - 出料 + AFTER_PROCESS 后处理 + 出料 将反应板推出到光学扫描位 光学扫描 diff --git a/src/main/java/a8k/service/appdata/AppSampleMgrService.java b/src/main/java/a8k/service/appdata/AppSampleMgrService.java index 8b63a41..1c04e70 100644 --- a/src/main/java/a8k/service/appdata/AppSampleMgrService.java +++ b/src/main/java/a8k/service/appdata/AppSampleMgrService.java @@ -5,7 +5,7 @@ import a8k.controler.extapi.utils.ExtApiFn; import a8k.controler.extapi.utils.ExtApiTab; import a8k.dbservice.SampleRecordDBService; import a8k.dbservice.type.SampleRecord; -import a8k.service.appstate.type.TubeState; +import a8k.service.appstate.type.Tube; import a8k.type.type.BloodType; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; @@ -59,7 +59,7 @@ public class AppSampleMgrService { return record; } - public void addSampleRecord(TubeState[] state) { + public void addSampleRecord(Tube[] state) { Date intertime = new Date(); for (int i = 0; i < state.length; i++) { if (state[i] == null) { diff --git a/src/main/java/a8k/service/appdevicectrl/action/DO_CHECK_THE_QUANTITY_OF_CONSUMABLES.java b/src/main/java/a8k/service/appdevicectrl/action/DO_CHECK_THE_QUANTITY_OF_CONSUMABLES.java deleted file mode 100644 index 1829395..0000000 --- a/src/main/java/a8k/service/appdevicectrl/action/DO_CHECK_THE_QUANTITY_OF_CONSUMABLES.java +++ /dev/null @@ -1,47 +0,0 @@ -package a8k.service.appdevicectrl.action; - -import a8k.service.appdevicectrl.action.base.A8kActionStepType; -import a8k.service.appdevicectrl.action.base.A8kStepAction; -import a8k.service.appstate.AppA8kGStateService; -import a8k.service.appstate.resource.A8kPublicResourceType; -import a8k.type.exception.AppException; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; - -import java.util.List; - -/** - * 检查耗材是否充足 - */ -@Component -public class DO_CHECK_THE_QUANTITY_OF_CONSUMABLES extends A8kStepAction { - static Logger logger = LoggerFactory.getLogger(DO_CHECK_THE_QUANTITY_OF_CONSUMABLES.class); - - DO_CHECK_THE_QUANTITY_OF_CONSUMABLES() { - super(A8kActionStepType.DO_CHECK_THE_QUANTITY_OF_CONSUMABLES); - } - - @Resource - AppA8kGStateService gstate; - - @PostConstruct - void init() { - } - - @Override public void doaction() throws AppException { - - } - - @Override public Boolean checkCondition() { - - - return false; - } - - @Override public List getDeplyResourceList() { - return List.of(); - } -} diff --git a/src/main/java/a8k/service/appdevicectrl/action/base/A8kStepAction.java b/src/main/java/a8k/service/appdevicectrl/action/base/A8kStepAction.java index c57881f..c69641e 100644 --- a/src/main/java/a8k/service/appdevicectrl/action/base/A8kStepAction.java +++ b/src/main/java/a8k/service/appdevicectrl/action/base/A8kStepAction.java @@ -30,4 +30,8 @@ public class A8kStepAction { } + public Boolean isAllowsParallelRunning() { + return true; + } + } diff --git a/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java b/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java index 610b96a..2b3f409 100644 --- a/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java +++ b/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java @@ -13,7 +13,6 @@ import a8k.service.appstate.AppA8kGStateService; import a8k.service.appstate.MainFlowCtrlState; import a8k.service.appstate.resource.A8kPublicResourceType; import a8k.service.appstate.type.TubeHolder; -import a8k.service.appstate.type.state.A8kWorkState; import a8k.service.appstate.type.state.TubeHolderState; import a8k.service.devicedriver.ctrl.SampleScanTransportCtrl; import a8k.type.exception.AppException; @@ -28,6 +27,10 @@ import org.springframework.stereotype.Component; import java.util.List; +/** + * + * + */ @Component public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { static Logger logger = LoggerFactory.getLogger(SEQ1_ENTER_TUBEHOLDER_AND_SCAN.class); @@ -139,37 +142,37 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { return null; } - assert setting == null || setting.tubeSettings.length == state.tubeStates.length; + assert setting == null || setting.tubeSettings.length == state.tubes.length; //逐个赋值试管配置信息 updaetGroupId(); - for (int i = 0; i < state.tubeStates.length; i++) { + for (int i = 0; i < state.tubes.length; i++) { if (!scanResult.tubesScanResults[i].isTubeExist) { - state.tubeStates[i].isTubeExist = scanResult.tubesScanResults[i].isTubeExist; + state.tubes[i].isTubeExist = scanResult.tubesScanResults[i].isTubeExist; continue; } - state.tubeStates[i].isTubeExist = scanResult.tubesScanResults[i].isTubeExist; - state.tubeStates[i].isHighTube = scanResult.tubesScanResults[i].isHighTube; + state.tubes[i].isTubeExist = scanResult.tubesScanResults[i].isTubeExist; + state.tubes[i].isHighTube = scanResult.tubesScanResults[i].isHighTube; //首先赋值默认值 - state.tubeStates[i].bloodType = BloodType.WHOLE_BLOOD; - state.tubeStates[i].sampleBarcode = ""; - state.tubeStates[i].userid = ""; - state.tubeStates[i].projIndex = List.of();//不做任何项目 + state.tubes[i].bloodType = BloodType.WHOLE_BLOOD; + state.tubes[i].sampleBarcode = ""; + state.tubes[i].userid = ""; + state.tubes[i].projIndex = List.of();//不做任何项目 //然后赋值用户配置的数值 if (setting != null) { - state.tubeStates[i].bloodType = setting.tubeSettings[i].bloodType; - state.tubeStates[i].sampleBarcode = setting.tubeSettings[i].sampleBarcode; - state.tubeStates[i].userid = setting.tubeSettings[i].userid; - state.tubeStates[i].projIndex = setting.tubeSettings[i].projIndex; + state.tubes[i].bloodType = setting.tubeSettings[i].bloodType; + state.tubes[i].sampleBarcode = setting.tubeSettings[i].sampleBarcode; + state.tubes[i].userid = setting.tubeSettings[i].userid; + state.tubes[i].projIndex = setting.tubeSettings[i].projIndex; } - if (state.tubeStates[i].userid.isEmpty()) { - state.tubeStates[i].userid = genUserId(i); + if (state.tubes[i].userid.isEmpty()) { + state.tubes[i].userid = genUserId(i); } //最后赋值扫描到的数值 @@ -212,7 +215,7 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { } logger.info("将样本信息写入数据库"); - appSampleMgrService.addSampleRecord(state.tubeStates); + appSampleMgrService.addSampleRecord(state.tubes); logger.info("更新试管架状态"); gstate.setTubeHolder(state); @@ -220,7 +223,7 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { @Override public Boolean checkCondition() { //处于工作状态 - Boolean cond1 = mfcs.workState.equals(A8kWorkState.WORKING) && mfcs.workState.equals(gstate.getWorkState()); + Boolean cond1 = gstate.isWorking(); //试管架处于空闲状态 Boolean cond2 = gstate.getTubeHolder().state.equals(TubeHolderState.IDLE); //入料通道是否为空 diff --git a/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java b/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java index 04ecc11..b192cf7 100644 --- a/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java +++ b/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java @@ -5,10 +5,9 @@ import a8k.service.appdevicectrl.action.base.A8kStepAction; import a8k.service.appstate.AppA8kGStateService; import a8k.service.appstate.resource.A8kPublicResourceType; import a8k.service.appstate.type.TubeHolder; -import a8k.service.appstate.type.TubeState; -import a8k.service.appstate.type.state.A8kWorkState; +import a8k.service.appstate.type.Tube; import a8k.service.appstate.type.state.TubeHolderState; -import a8k.service.appstate.type.state.TubeProcessState; +import a8k.service.appstate.type.state.TubeState; import a8k.service.devicedriver.ctrl.SampleScanTransportCtrl; import a8k.type.exception.AppException; import jakarta.annotation.PostConstruct; @@ -43,14 +42,14 @@ public class SEQ2_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction { int moveToNextTube() throws AppException { TubeHolder state = gstate.getTubeHolder(); - assert state.tubeStates.length == 10; + assert state.tubes.length == 10; int nowTubeIndex = state.processingTubeIndex; int nextTubeIndex = -1; for (int i = nowTubeIndex + 1; i < 10; i++) { - TubeState tubeState = state.tubeStates[i]; - if (!tubeState.isTubeExist) { + Tube tube = state.tubes[i]; + if (!tube.isTubeExist) { continue; } nextTubeIndex = i; @@ -70,17 +69,16 @@ public class SEQ2_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction { * 1. 将下一个试管移动到预处理位 * 2. 如果当前试管是最后一个试管,则设置试管架状态为处理完成。 */ - TubeHolder state = gstate.getTubeHolder(); int nextPos = moveToNextTube(); if (nextPos == -1) { logger.info("当前试管架处理完成"); - state.state = TubeHolderState.PROCESS_FINISHED; + gstate.getTubeHolder().state = TubeHolderState.PROCESS_FINISHED; return; } logger.info("移动到下一个试管:{}", nextPos); sstc.moveTubeToPreProcessPos(nextPos); - state.processingTubeIndex = nextPos; + gstate.getTubeHolder().processingTubeIndex = nextPos; } @@ -97,8 +95,8 @@ public class SEQ2_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction { Boolean cond1 = gstate.isWorking(); //试管架正在处理中, 且当前试管Index=-1 Boolean cond2 = gstate.getTubeHolderState().equals(TubeHolderState.PROCESSING) && gstate.getTubeHolder().getProcessingTube() == null; - //当前试管处理完成 - Boolean cond3 = gstate.getTubeHolder().getProcessingTube().state.equals(TubeProcessState.PROCESS_COMPLETE); + //当前<试管>处理完成 + Boolean cond3 = gstate.getTubeHolder().getProcessingTube().state.equals(TubeState.PROCESS_COMPLETE); return cond1 && (cond2 || cond3); } diff --git a/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ3_CHECK_THE_QUANTITY_OF_CONSUMABLES.java b/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ3_CHECK_THE_QUANTITY_OF_CONSUMABLES.java new file mode 100644 index 0000000..df22367 --- /dev/null +++ b/src/main/java/a8k/service/appdevicectrl/action/mainflow/SEQ3_CHECK_THE_QUANTITY_OF_CONSUMABLES.java @@ -0,0 +1,62 @@ +package a8k.service.appdevicectrl.action.mainflow; + +import a8k.service.appdevicectrl.action.base.A8kActionStepType; +import a8k.service.appdevicectrl.action.base.A8kStepAction; +import a8k.service.appstate.AppA8kGStateService; +import a8k.service.appstate.resource.A8kPublicResourceType; +import a8k.service.appstate.type.state.TubeHolderState; +import a8k.service.appstate.type.state.TubeState; +import a8k.type.exception.AppException; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 检查耗材是否充足 + */ +@Component +public class SEQ3_CHECK_THE_QUANTITY_OF_CONSUMABLES extends A8kStepAction { + static Logger logger = LoggerFactory.getLogger(SEQ3_CHECK_THE_QUANTITY_OF_CONSUMABLES.class); + + SEQ3_CHECK_THE_QUANTITY_OF_CONSUMABLES() { + super(A8kActionStepType.DO_CHECK_THE_QUANTITY_OF_CONSUMABLES); + } + + @Resource + AppA8kGStateService gstate; + + @PostConstruct + void init() { + } + + @Override public void doaction() throws AppException { + //检查孵育盘是否有空位 + // if(gstate.getIncubationPlate().getEmptyPos())){ + // } + //检查当前试管的待做项目所需要的资源是否充足 + } + + @Override public Boolean checkCondition() { + // 仪器是否在工作 + Boolean cond1 = gstate.isWorking(); + // 试管架是否在处理中 + Boolean cond2 = gstate.getTubeHolder().state.equals(TubeHolderState.PROCESSING); + // 试管是否待处理 + Boolean cond3 = gstate.getTubeHolder().getProcessingTube() != null && gstate.getTubeHolder().getProcessingTube().state.equals(TubeState.TO_BE_PROCESSED); + // 孵育盘是否有空位 + Boolean cond4 = gstate.getIncubationPlate().getEmptyPos() != null; + return cond1 && cond2 && cond3 && cond4; + } + + @Override public List getDeplyResourceList() { + return List.of(); + } + + @Override public Boolean isAllowsParallelRunning() { + return false; + } +} diff --git a/src/main/java/a8k/service/appdevicectrl/scheduler/MainFlowCtrlScheduler.java b/src/main/java/a8k/service/appdevicectrl/scheduler/MainFlowCtrlScheduler.java index 73a959b..9046535 100644 --- a/src/main/java/a8k/service/appdevicectrl/scheduler/MainFlowCtrlScheduler.java +++ b/src/main/java/a8k/service/appdevicectrl/scheduler/MainFlowCtrlScheduler.java @@ -112,40 +112,54 @@ public class MainFlowCtrlScheduler { // Scheduler // - List guessWhatToDo() { - List dowhatList = new ArrayList<>(); - for (A8kStepAction action : stepActionList) { - // Boolean cond = appCondtionMgrService.checkCondtion(action.getCondtions()); - if (action.checkCondition()) { - Boolean relayResourceSuc = appResourceMgrService.applyForResources(this, action.getDeplyResourceList()); - if (relayResourceSuc) { - dowhatList.add(action.step); + List guessWhatToDo() { + try { + List dowhatList = new ArrayList<>(); + + for (A8kStepAction action : stepActionList) { + if (action.checkCondition()) { + Boolean relayResourceSuc = appResourceMgrService.applyForResources(this, action.getDeplyResourceList()); + if (relayResourceSuc) { + dowhatList.add(action); + } } - } + } + return dowhatList; + } catch (Exception e) { + logger.info("guessWhatToDo error:{}", e.getMessage()); + appResourceMgrService.releaseAllResource(this); } - return dowhatList; - - + return new ArrayList<>(); } - void docall(A8kActionStepType key) throws AppException { - for (A8kStepAction action : stepActionList) { - if (action.step == key) { - action.doaction(); - return; - } + A8kEcodeContext callFn(A8kStepAction key) { + beforeDoWhat(key.step); + try { + logger.info("doaction:{}", key.step); + key.doaction(); + return new A8kEcodeContext(key.step, A8kEcode.NoError); + } catch (AppException appe) { + return new A8kEcodeContext(key.step, A8kEcode.fromInt(appe.getErrorCode())); } } - A8kEcodeContext callFn(A8kActionStepType key) { - beforeDoWhat(key); + void clearError() { + /* + * 清除错误 + */ + clearErrorPendingFlag = false; try { - docall(key); - return new A8kEcodeContext(key, A8kEcode.NoError); + beforeDoWhat(A8kActionStepType.DO_CLEAR_ERROR); + boolean suc = ecodeClearProcesser.process(state.ecodeList); + if (suc) { + state.ecodeList.clear(); + state.errorFlag = false; + } } catch (AppException appe) { - return new A8kEcodeContext(key, A8kEcode.fromInt(appe.getErrorCode())); + A8kEcodeContext context = new A8kEcodeContext(A8kActionStepType.DO_CLEAR_ERROR, A8kEcode.fromInt(appe.getErrorCode())); + a8kEcodePostProcesser(List.of(context)); } } @@ -179,6 +193,46 @@ public class MainFlowCtrlScheduler { return ecodeList; } + void doActions(List dowhatList) { + + // + List serialActionList = new ArrayList<>(); + List parallelActionList = new ArrayList<>(); + List ecodeList = new ArrayList<>(); + + for (A8kStepAction action : dowhatList) { + if (action.isAllowsParallelRunning()) { + parallelActionList.add(action); + } else { + serialActionList.add(action); + } + } + + //执行串行任务 + for (A8kStepAction action : serialActionList) { + A8kEcodeContext aec = callFn(action); + ecodeList.add(aec); + } + + //执行并行任务 + List> futureList = new ArrayList<>(); + for (A8kStepAction dowhat : parallelActionList) { + var future = executor.submit(() -> callFn(dowhat)); + futureList.add(future); + } + + //等待并行任务完成 + List ecodeListParallel = waitAllActionIsDone(futureList); + appResourceMgrService.releaseAllResource(this); + + //合并错误 + ecodeList.addAll(ecodeListParallel); + + if (!ecodeList.isEmpty()) { + a8kEcodePostProcesser(ecodeList); + } + } + void a8kEcodePostProcesser(List ecodeList) { //如果有错误,且错误列表不为空,则将错误列表添加到错误列表中 if (!this.state.ecodeList.isEmpty()) { @@ -211,49 +265,12 @@ public class MainFlowCtrlScheduler { if (state.fatalErrorFlag) { OS.forceSleep(800); } else if (clearErrorPendingFlag) { - /* - * 清除错误 - */ - clearErrorPendingFlag = false; - try { - beforeDoWhat(A8kActionStepType.DO_CLEAR_ERROR); - boolean suc = ecodeClearProcesser.process(state.ecodeList); - if (suc) { - state.ecodeList.clear(); - state.errorFlag = false; - } - } catch (AppException appe) { - A8kEcodeContext context = new A8kEcodeContext(A8kActionStepType.DO_CLEAR_ERROR, A8kEcode.fromInt(appe.getErrorCode())); - a8kEcodePostProcesser(List.of(context)); - } + clearError(); OS.forceSleep(800); } else if (state.errorFlag) { OS.forceSleep(800); } else { - - List dowhatList; - try { - dowhatList = guessWhatToDo(); - } catch (Exception e) { - appResourceMgrService.releaseAllResource(this); - OS.forceSleep(800); - continue; - } - - - List> futureList = new ArrayList<>(); - for (A8kActionStepType dowhat : dowhatList) { - var future = executor.submit(() -> callFn(dowhat)); - futureList.add(future); - } - //等待所有任务完成 - List ecodeList = waitAllActionIsDone(futureList); - - appResourceMgrService.releaseAllResource(this); - if (!ecodeList.isEmpty()) { - a8kEcodePostProcesser(ecodeList); - } - + doActions(guessWhatToDo()); OS.forceSleep(800); } } diff --git a/src/main/java/a8k/service/appstate/AppA8kGStateService.java b/src/main/java/a8k/service/appstate/AppA8kGStateService.java index 274afcf..a2ee8de 100644 --- a/src/main/java/a8k/service/appstate/AppA8kGStateService.java +++ b/src/main/java/a8k/service/appstate/AppA8kGStateService.java @@ -2,7 +2,7 @@ package a8k.service.appstate; import a8k.service.appdevicectrl.type.app_consumables_mgr_service.ConsumableState; import a8k.service.appstate.type.EmergencyPosRunState; -import a8k.service.appstate.type.IncubationPlateStatus; +import a8k.service.appstate.type.IncubationPlate; import a8k.service.appstate.type.OptScanModule; import a8k.service.appstate.type.TubeHolder; import a8k.service.appstate.type.state.A8kWorkState; @@ -29,15 +29,15 @@ public class AppA8kGStateService { A8kWorkState workState = A8kWorkState.IDLE; // //当前正在被处理的试管架状态 - TubeHolder tubeHolder = new TubeHolder(); + TubeHolder tubeHolder = new TubeHolder(); //急诊为状态 - EmergencyPosRunState emergencyPosRunState = new EmergencyPosRunState(); + EmergencyPosRunState emergencyPosRunState = new EmergencyPosRunState(); //孵育盘状态 - IncubationPlateStatus incubationPlateStatus = new IncubationPlateStatus(); + IncubationPlate incubationPlate = new IncubationPlate(); //耗材状态 - ConsumableState consumableState = new ConsumableState(); + ConsumableState consumableState = new ConsumableState(); //光学模组状态 - OptScanModule optScanModule = new OptScanModule(); + OptScanModule optScanModule = new OptScanModule(); // // 耗材状态,试管配置,急诊位样本配置,均是前端提交的设置信息 // diff --git a/src/main/java/a8k/service/appstate/type/IncubationPlate.java b/src/main/java/a8k/service/appstate/type/IncubationPlate.java new file mode 100644 index 0000000..b03cc1b --- /dev/null +++ b/src/main/java/a8k/service/appstate/type/IncubationPlate.java @@ -0,0 +1,26 @@ +package a8k.service.appstate.type; + +import a8k.service.appstate.type.state.IncubationSubTankState; +import a8k.type.IncubatorPos; + +public class IncubationPlate { + public IncubationSubTank[] subtanks = new IncubationSubTank[20]; + public IncubatorPos incubationPos = IncubatorPos.SPACE01; + + public IncubationPlate() { + for (int i = 0; i < 20; i++) { + subtanks[i] = new IncubationSubTank(IncubatorPos.of(i)); + } + } + + public IncubatorPos getEmptyPos() { + for (IncubationSubTank subtank : subtanks) { + if (subtank.state.equals(IncubationSubTankState.EMPTY)) { + return subtank.pos; + } + } + return null; + } + + +} diff --git a/src/main/java/a8k/service/appstate/type/IncubationPlateStatus.java b/src/main/java/a8k/service/appstate/type/IncubationPlateStatus.java deleted file mode 100644 index eb6b8a3..0000000 --- a/src/main/java/a8k/service/appstate/type/IncubationPlateStatus.java +++ /dev/null @@ -1,11 +0,0 @@ -package a8k.service.appstate.type; - -public class IncubationPlateStatus { - public ReactingPlateState[] plateStates = new ReactingPlateState[20]; - public Integer incubationPos = 0;//0->360,只做显示,不参与任何业务 - public IncubationPlateStatus() { - for (int i = 0; i < plateStates.length; i++) { - plateStates[i] = new ReactingPlateState(i); - } - } -} diff --git a/src/main/java/a8k/service/appstate/type/IncubationSubTank.java b/src/main/java/a8k/service/appstate/type/IncubationSubTank.java new file mode 100644 index 0000000..bcb669d --- /dev/null +++ b/src/main/java/a8k/service/appstate/type/IncubationSubTank.java @@ -0,0 +1,31 @@ +package a8k.service.appstate.type; + +import a8k.service.appstate.type.state.IncubationSubTankState; +import a8k.type.IncubatorPos; +import a8k.type.type.BloodType; + +import java.util.Date; + +public class IncubationSubTank { + //位置 + IncubatorPos pos; + + //孵育时间 + public IncubationSubTankState state = IncubationSubTankState.EMPTY; //孵育盘状态 + + //Info + public BloodType bloodType = BloodType.WHOLE_BLOOD; //血液类型 + public String sampleBarcode = ""; //用于请求用户信息的条码ID + public String userid = ""; //用户输入的样本ID,不做逻辑,只做展示 + public Integer projIndex = 0; //项目代码 + public String projName = ""; //项目名称 + + //孵育时间 + Date startIncubatedTime; //开始孵育时间 + Integer targetIncubatedTimeS; //目标孵育时间 + + public IncubationSubTank(IncubatorPos pos) { + this.pos = pos; + } + +} diff --git a/src/main/java/a8k/service/appstate/type/ReactingPlateState.java b/src/main/java/a8k/service/appstate/type/ReactingPlateState.java deleted file mode 100644 index c01d007..0000000 --- a/src/main/java/a8k/service/appstate/type/ReactingPlateState.java +++ /dev/null @@ -1,31 +0,0 @@ -package a8k.service.appstate.type; - -import a8k.service.appstate.type.state.ReactionPlateState; -import a8k.type.type.BloodType; - -import java.util.Date; - -public class ReactingPlateState { - //位置 - Integer index; - - //孵育时间 - public ReactionPlateState state; //孵育盘状态 - - //Info - public BloodType bloodType = BloodType.WHOLE_BLOOD; //血液类型 - public String sampleBarcode = ""; //用于请求用户信息的条码ID - public String userid = ""; //用户输入的样本ID,不做逻辑,只做展示 - public Integer projIndex = 0; //项目代码 - public String projName = ""; //项目名称 - - //孵育时间 - Date startIncubatedTime; //开始孵育时间 - Integer targetIncubatedTimeS; //目标孵育时间 - - public ReactingPlateState(Integer index) { - this.index = index; - this.state = ReactionPlateState.EMPTY; - } - -} diff --git a/src/main/java/a8k/service/appstate/type/Tube.java b/src/main/java/a8k/service/appstate/type/Tube.java new file mode 100644 index 0000000..7d5bd8f --- /dev/null +++ b/src/main/java/a8k/service/appstate/type/Tube.java @@ -0,0 +1,22 @@ +package a8k.service.appstate.type; + +import a8k.service.appstate.type.state.TubeState; +import a8k.type.type.BloodType; + +import java.util.ArrayList; +import java.util.List; + +public class Tube { + public String sampleid; //样本ID-系统生成-唯一标识一个样本 + + public Boolean isHighTube = false; + public Boolean isTubeExist = false; + + public BloodType bloodType = BloodType.WHOLE_BLOOD; //血液类型 + public String sampleBarcode = ""; //用于请求用户信息的条码ID + public String userid = ""; //用户输入的样本ID,不做逻辑,只做展示 + public List projIndex = new ArrayList<>(); //项目代码 + + // + public TubeState state = TubeState.TO_BE_PROCESSED; //样本被处理的状态 +} diff --git a/src/main/java/a8k/service/appstate/type/TubeHolder.java b/src/main/java/a8k/service/appstate/type/TubeHolder.java index 52afaf6..9e856cb 100644 --- a/src/main/java/a8k/service/appstate/type/TubeHolder.java +++ b/src/main/java/a8k/service/appstate/type/TubeHolder.java @@ -5,22 +5,22 @@ import a8k.type.type.A8kTubeHolderType; public class TubeHolder { public A8kTubeHolderType tubeHolderType = A8kTubeHolderType.BloodTube; //试管架类型 - public TubeState[] tubeStates = new TubeState[10]; + public Tube[] tubes = new Tube[10]; public TubeHolderState state = TubeHolderState.IDLE; //处理状态 public Integer processingTubeIndex = -1; //当前正在被处理的试管索引 public TubeHolder() { - for (int i = 0; i < tubeStates.length; i++) { - tubeStates[i] = new TubeState(); + for (int i = 0; i < tubes.length; i++) { + tubes[i] = new Tube(); } } - public TubeState getProcessingTube() { + public Tube getProcessingTube() { if (processingTubeIndex == -1) { return null; } - return tubeStates[processingTubeIndex]; + return tubes[processingTubeIndex]; } } diff --git a/src/main/java/a8k/service/appstate/type/TubeState.java b/src/main/java/a8k/service/appstate/type/TubeState.java deleted file mode 100644 index 7e5645f..0000000 --- a/src/main/java/a8k/service/appstate/type/TubeState.java +++ /dev/null @@ -1,22 +0,0 @@ -package a8k.service.appstate.type; - -import a8k.service.appstate.type.state.TubeProcessState; -import a8k.type.type.BloodType; - -import java.util.ArrayList; -import java.util.List; - -public class TubeState { - public String sampleid; //样本ID-系统生成-唯一标识一个样本 - - public Boolean isHighTube = false; - public Boolean isTubeExist = false; - - public BloodType bloodType = BloodType.WHOLE_BLOOD; //血液类型 - public String sampleBarcode = ""; //用于请求用户信息的条码ID - public String userid = ""; //用户输入的样本ID,不做逻辑,只做展示 - public List projIndex = new ArrayList<>(); //项目代码 - - // - public TubeProcessState state = TubeProcessState.TO_BE_PROCESSED; //样本被处理的状态 -} diff --git a/src/main/java/a8k/service/appstate/type/state/IncubationSubTankState.java b/src/main/java/a8k/service/appstate/type/state/IncubationSubTankState.java new file mode 100644 index 0000000..44ce361 --- /dev/null +++ b/src/main/java/a8k/service/appstate/type/state/IncubationSubTankState.java @@ -0,0 +1,9 @@ +package a8k.service.appstate.type.state; + +//反应板条状态 +public enum IncubationSubTankState { + EMPTY,//板夹仓中 + WAITING_FOR_DROP,//等待滴液 + INCUBATING, //孵育中 + INCUBATED, //孵育完成 +} diff --git a/src/main/java/a8k/service/appstate/type/state/ReactionPlateState.java b/src/main/java/a8k/service/appstate/type/state/ReactionPlateState.java deleted file mode 100644 index 3f1027b..0000000 --- a/src/main/java/a8k/service/appstate/type/state/ReactionPlateState.java +++ /dev/null @@ -1,9 +0,0 @@ -package a8k.service.appstate.type.state; - -//反应板条状态 -public enum ReactionPlateState { - EMPTY,//板夹仓中 - WAITING_FOR_DROP,//等待滴液 - INCUBATING, //孵育中 - INCUBATED, //孵育完成 -} diff --git a/src/main/java/a8k/service/appstate/type/state/TubeProcessState.java b/src/main/java/a8k/service/appstate/type/state/TubeProcessState.java deleted file mode 100644 index 642cc2d..0000000 --- a/src/main/java/a8k/service/appstate/type/state/TubeProcessState.java +++ /dev/null @@ -1,10 +0,0 @@ -package a8k.service.appstate.type.state; - -public enum TubeProcessState { - // - TO_BE_PROCESSED,//待处理 - PRE_PROCESSING, //预处理 - PROCESSING,//预处理 - POST_PROCESSING, //后处理 - PROCESS_COMPLETE,//处理完成 -} diff --git a/src/main/java/a8k/service/appstate/type/state/TubeState.java b/src/main/java/a8k/service/appstate/type/state/TubeState.java new file mode 100644 index 0000000..3d07dd7 --- /dev/null +++ b/src/main/java/a8k/service/appstate/type/state/TubeState.java @@ -0,0 +1,10 @@ +package a8k.service.appstate.type.state; + +public enum TubeState { + // + TO_BE_PROCESSED,//待处理 + PRE_PROCESSING, //预处理 + PROCESSING,//预处理 + POST_PROCESSING, //后处理 + PROCESS_COMPLETE,//处理完成 +} diff --git a/src/main/java/a8k/type/IncubatorPos.java b/src/main/java/a8k/type/IncubatorPos.java index 8a2b357..63872ee 100644 --- a/src/main/java/a8k/type/IncubatorPos.java +++ b/src/main/java/a8k/type/IncubatorPos.java @@ -4,7 +4,17 @@ public enum IncubatorPos { SPACE01, SPACE02, SPACE03, SPACE04, SPACE05, SPACE06, SPACE07, SPACE08, SPACE09, SPACE10, SPACE11, SPACE12, SPACE13, SPACE14, SPACE15, SPACE16, SPACE17, SPACE18, SPACE19, SPACE20; final public Integer off; + private IncubatorPos() { this.off = ordinal(); } + + public static IncubatorPos of(Integer off) { + for (IncubatorPos pos : IncubatorPos.values()) { + if (pos.off.equals(off)) { + return pos; + } + } + return null; + } }