From bd4e095036b7c23c3714e3c68053fccb5ec55204 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Mon, 14 Oct 2024 10:45:51 +0800 Subject: [PATCH] update --- app.db | Bin 225280 -> 225280 bytes .../service/app/appctrl/AppDeviceCtrlService.java | 47 +++++----- .../service/app/appctrl/DeviceInitCtrlService.java | 18 +++- .../service/app/appctrl/TubeSettingMgrService.java | 26 ++++-- .../appctrl/mainflowctrl/CondtionMgrService.java | 14 +-- .../mainflowctrl/MainFlowCtrlScheduler.java | 9 +- .../action/DO_FINISH_TUBE_PROCESS.java | 12 +-- .../action/DO_PROCESS_ERROR_PLATE.java | 8 +- .../app/appctrl/mainflowctrl/action/DO_START.java | 6 +- .../mainflowctrl/action/PLATE_OPT_SCAN.java | 2 +- .../action/PROCESS_INCUBATE_COMPLETED_PLATE.java | 2 +- .../action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java | 7 +- .../action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java | 2 +- .../mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java | 7 ++ .../mainflowctrl/action/SEQ4_PRE_PROCESS.java | 20 +++-- .../appctrl/mainflowctrl/action/SEQ5_PROCESS.java | 9 +- .../mainflowctrl/action/SEQ6_POST_PROCESS.java | 8 +- .../mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java | 1 + .../appctrl/mainflowctrl/base/A8kStepAction.java | 3 +- .../app/appstate/ConsumablesMgrService.java | 13 +-- .../EmergencySamplePosStateMgrService.java | 4 + .../a8k/service/app/appstate/GStateService.java | 2 - .../appstate/ProjectProcessContextMgrService.java | 4 +- .../app/appstate/type/IncubationSubTank.java | 11 +++ .../app/appstate/type/ProjProcessContext.java | 2 + .../a8k/service/debug/AppDebugHelperService.java | 97 ++++++++++++++++++++- .../service/debug/fakeprojinfo/FakeProjInfo.java | 2 +- .../a8k/service/debug/fakeprojinfo/P01_hsCRR.java | 2 +- .../a8k/service/debug/fakeprojinfo/P02_PCT.java | 2 +- .../a8k/service/debug/fakeprojinfo/P03_TSH.java | 2 +- .../a8k/service/debug/fakeprojinfo/P05_T3.java | 2 +- .../a8k/service/debug/fakeprojinfo/P06_T4.java | 2 +- .../debug/fakeprojinfo/P22_PCTAndHsCRP.java | 2 +- 33 files changed, 249 insertions(+), 99 deletions(-) diff --git a/app.db b/app.db index e7f507590ba827197fa01dea68ba4a77e965c33d..24e942673e71a764ee0165884e404a1a69c8bbad 100644 GIT binary patch literal 225280 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 y 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 diff --git a/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java b/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java index 6192863..29116b1 100644 --- a/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java +++ b/src/main/java/a8k/service/app/appctrl/AppDeviceCtrlService.java @@ -48,19 +48,13 @@ public class AppDeviceCtrlService { +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ @ExtApiFn(name = "设备初始化前检查", group = "设备初始化") public List checkBeforeInitDevice() throws AppException { - if (appDebugHelperService.isDebug()) { - return appDebugHelperService.checkBeforeInitDevice(); - } + return deviceInitializationModule.checkBeforeInitDevice(); } @ExtApiFn(name = "设备初始化(阻塞接口)", group = "设备初始化") public void initDevice() throws AppException { - if (appDebugHelperService.isDebug()) { - OS.forceSleep(5000); - gstate.setDeviceInited(true); - return; - } + deviceInitializationModule.deviceMoveToZero(); } @@ -102,6 +96,25 @@ public class AppDeviceCtrlService { } + /** + * 设置Tip数量 + * @param group Tip组 + * @param num 数量 + */ + @ExtApiFn(name = "设置Tip数量", group = "耗材管理") + synchronized public void setTipNum(Integer group, Integer num) { + consumablesMgrService.setTipNum(group, num); + } + + /** + * 设置耗材数量 + * @param group 耗材组 + * @param num 数量 + */ + @ExtApiFn(name = "设置耗材数量", group = "耗材管理") + synchronized public void setCounsumableNum(ConsumableGroup group, Integer num) { + consumablesMgrService.setCounsumableNum(group, num); + } /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * 设备状态 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ @@ -142,25 +155,7 @@ public class AppDeviceCtrlService { return gstate.getConsumableState(); } - @ExtApiFn(name = "获取运行步骤状态", group = "调试") - public List getA8kStepActionList() { - return mainFlowCtrlSampleScanService.getA8kStepActionList(); - } - @ExtApiFn(name = "获取设备状态(调试使用)", group = "调试") - public GStateService getGState() { - return gstate; - } - - @ExtApiFn(name = "获取所有正在处理的项目Context(调试使用)", group = "调试") - public List getAllProcessingProjProcessContexts() { - return projectProcessContextMgrService.getAllProcessingProjProcessContexts(); - } - - @ExtApiFn(name = "获取所有项目Context(调试使用)", group = "调试") - public List getAllErrorProjProcessContexts() { - return projectProcessContextMgrService.getAllErrorProjProcessContexts(); - } /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ * 系统控制 diff --git a/src/main/java/a8k/service/app/appctrl/DeviceInitCtrlService.java b/src/main/java/a8k/service/app/appctrl/DeviceInitCtrlService.java index de0e1b5..068a001 100644 --- a/src/main/java/a8k/service/app/appctrl/DeviceInitCtrlService.java +++ b/src/main/java/a8k/service/app/appctrl/DeviceInitCtrlService.java @@ -5,6 +5,7 @@ import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.hardware.type.a8kcanprotocol.IOId; import a8k.hardware.type.a8kcanprotocol.MId; import a8k.service.bases.ActionReactorService; +import a8k.service.debug.AppDebugHelperService; import a8k.type.checkpoint.CheckResult; import a8k.type.checkpoint.Checkpoint; import a8k.service.app.appstate.GStateService; @@ -29,7 +30,10 @@ public class DeviceInitCtrlService { A8kCanBusService canBus; @Resource - GStateService stateMgrService; + GStateService gstate; + + @Resource + AppDebugHelperService appDebugHelper; Integer actionOvertime = 10000; @@ -52,6 +56,9 @@ public class DeviceInitCtrlService { public List checkBeforeInitDevice() throws AppException { + if (appDebugHelper.isDebug()) { + return appDebugHelper.checkBeforeInitDevice(); + } List results = new java.util.ArrayList<>(); for (Checkpoint checkPoint : checkPoints) { CheckResult result = new CheckResult(); @@ -75,6 +82,13 @@ public class DeviceInitCtrlService { // public void deviceMoveToZero() throws AppException { + + if (appDebugHelper.isDebug()) { + appDebugHelper.doVirtualThings("初始化设备", 3); + gstate.setDeviceInited(true); + return; + } + Boolean suc = checkBeforeInitDevicePass(); if (!suc) { throw new AppException(A8kEcode.APPE_CHECK_POINT_CHECK_FAIL); @@ -104,7 +118,7 @@ public class DeviceInitCtrlService { //转盘归零 ar.dosome("转盘回零", () -> canBus.stepMotorEasyMoveToZeroBlock(MId.IncubatorRotateCtrlM, actionOvertime)); - stateMgrService.setDeviceInited(true); + gstate.setDeviceInited(true); } diff --git a/src/main/java/a8k/service/app/appctrl/TubeSettingMgrService.java b/src/main/java/a8k/service/app/appctrl/TubeSettingMgrService.java index 22cc177..b94793b 100644 --- a/src/main/java/a8k/service/app/appctrl/TubeSettingMgrService.java +++ b/src/main/java/a8k/service/app/appctrl/TubeSettingMgrService.java @@ -73,6 +73,7 @@ public class TubeSettingMgrService { return gState.getTubeHolderSettings(); } + //添加试管架,返回整个列表 @ExtApiFn(name = "添加<试管架>配置", group = "试管架", order = ORDER.addCfg) synchronized public List newTubeHolderSetting() { var newSetting = new TubeHolderSetting(); @@ -82,6 +83,14 @@ public class TubeSettingMgrService { return getTubeHolderSettings(); } + + //添加试管架,返回被添加的试管架 + synchronized public TubeHolderSetting newTubeHolderSettingV2() { + var newSetting = new TubeHolderSetting(); + gState.getTubeHolderSettings().add(newSetting); + return newSetting; + } + @ExtApiFn(name = "删除<试管架>配置", group = "试管架", order = ORDER.removeCfg) synchronized public List removeTubeHolderSetting(String uuid) throws AppException { logger.info("removeTubeHolderSetting {}", uuid); @@ -90,12 +99,6 @@ public class TubeSettingMgrService { return getTubeHolderSettings(); } - synchronized public void removeTubeHolderSetting(TubeHolderSetting setting) throws AppException { - if (setting == null) { - return; - } - removeTubeHolderSetting(setting.uuid); - } @ExtApiFn(name = "设置<试管架>激活状态", group = "试管架", order = ORDER.activeCfg) synchronized public List tubeHodlerSettingSetActiveState(String uuid, Boolean active) throws AppException { @@ -153,8 +156,15 @@ public class TubeSettingMgrService { * internal use *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ + synchronized public void interUseRemoveTubeHolderSetting(TubeHolderSetting removeSetting) throws AppException { + if (removeSetting == null) { + return; + } + gState.getTubeHolderSettings().removeIf(setting -> setting.uuid.equals(removeSetting.uuid)); + } + //锁定第一个激活的试管架配置 - synchronized public TubeHolderSetting getThelastActiveTubeHolderSettingAndLock() { + synchronized public TubeHolderSetting interUseGetThelastActiveTubeHolderSettingAndLock() { for (int i = gState.getTubeHolderSettings().size() - 1; i >= 0; i--) { TubeHolderSetting setting = gState.getTubeHolderSettings().get(i); if (setting.active) { @@ -166,7 +176,7 @@ public class TubeSettingMgrService { return null; } - synchronized public void unlockTubeHolderSetting(String uuid) { + synchronized public void interUseUnlockTubeHolderSetting(String uuid) { for (TubeHolderSetting setting : gState.getTubeHolderSettings()) { if (setting.uuid.equals(uuid)) { setting.lock = false; diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/CondtionMgrService.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/CondtionMgrService.java index a3798e3..d02a374 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/CondtionMgrService.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/CondtionMgrService.java @@ -35,7 +35,7 @@ public class CondtionMgrService { @Resource AppDebugHelperService appDebugHelper; - Boolean getTubeholderEnterPosPPS() { //入料通道是否为空 + public Boolean getTubeholderEnterPosPPS() { //入料通道是否为空 if (appDebugHelper.isDebug()) { return appDebugHelper.getTubeholderEnterPosPPS(); } @@ -107,9 +107,7 @@ public class CondtionMgrService { Boolean cond1 = isCanDoAction(); //没有试管在处理 或者 当前试管处理完成 Boolean cond2 = tube.getState().equals(TubeState.RESOURCE_IS_READY); - //急诊有待处理的试管,或者试管架正在处理 - Boolean cond3 = incubationPlateStateMgrService.isHasEnoughIncubationIDLEPos(tube.getProjInfo().size()); - return cond1 && cond2 && cond3; + return cond1 && cond2; } public Boolean isTimeToProcessTube() { @@ -121,9 +119,7 @@ public class CondtionMgrService { Boolean cond1 = isCanDoAction(); //没有试管在处理 或者 当前试管处理完成 Boolean cond2 = tube.getState().equals(TubeState.PRE_PROCESSED); - //急诊有待处理的试管,或者试管架正在处理 - Boolean cond3 = incubationPlateStateMgrService.isHasEnoughIncubationIDLEPos(tube.getProjInfo().size()); - return cond1 && cond2 && cond3; + return cond1 && cond2 ; } public Boolean isTimeToPostProcessTube() { @@ -135,9 +131,7 @@ public class CondtionMgrService { Boolean cond1 = isCanDoAction(); //没有试管在处理 或者 当前试管处理完成 Boolean cond2 = tube.getState().equals(TubeState.PROCESSED); - //急诊有待处理的试管,或者试管架正在处理 - Boolean cond3 = incubationPlateStateMgrService.isHasEnoughIncubationIDLEPos(tube.getProjInfo().size()); - return cond1 && cond2 && cond3; + return cond1 && cond2 ; } public Boolean isHasSomeErrorPlatesToBeProcessed() { diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java index 28574ec..7be49d2 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/MainFlowCtrlScheduler.java @@ -120,11 +120,11 @@ public class MainFlowCtrlScheduler { A8kErrorContext callFn(A8kStepAction key) { logger.info("----------------------{}---------------------->", ZStringUtils.leftAlignStr(key.step.name(), '-', 35)); - logger.info("Relate {} ", key.logCxtState()); + logger.info("RELATE {} PARALLEL:{} ", key.logCxtState(), key.isAllowsParallelRunning()); beforeDoWhat(key.step); try { key.doaction(); - return new A8kErrorContext(key.step, null); + return null; } catch (AppException appe) { return new A8kErrorContext(key.step, appe.error); } finally { @@ -152,14 +152,14 @@ public class MainFlowCtrlScheduler { for (Future future : futureList) { try { - ecodeList.add(future.get()); + if (future.get() != null) + ecodeList.add(future.get()); } catch (Exception e) { throw new RuntimeException(e); } } //清空NoError - ecodeList.removeIf(ecode -> ecode.ecode == null); return ecodeList; } @@ -193,6 +193,7 @@ public class MainFlowCtrlScheduler { //等待并行任务完成 List ecodeListParallel = waitAllActionIsDone(futureList); + ecodeList.removeIf(ecode -> ecode == null || ecode.ecode == null); resourceMgrService.releaseAllResource(this); //合并错误 diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_FINISH_TUBE_PROCESS.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_FINISH_TUBE_PROCESS.java index 3205bc0..6dd6d91 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_FINISH_TUBE_PROCESS.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_FINISH_TUBE_PROCESS.java @@ -66,13 +66,9 @@ public class DO_FINISH_TUBE_PROCESS extends A8kStepAction { } if (appDebugHelper.isDebug()) { - logger.info("处理错误试管:{}", tube.getSampleId()); - logger.info("复位摇匀模组"); - OS.forceSleep(4000); - //复位摇匀模组 - logger.info("复位HBOT"); - //复位HBOT - OS.forceSleep(4000); + appDebugHelper.doVirtualThings("处理错误试管", 2); + appDebugHelper.doVirtualThings("复位摇匀模组", 2); + appDebugHelper.doVirtualThings("复位HBOT", 2); } projectProcessContextMgrService.finishedTubeProcess(); } @@ -94,6 +90,6 @@ public class DO_FINISH_TUBE_PROCESS extends A8kStepAction { var tube = gstate.getCurProcessingTube(); if (tube == null) return ""; - return String.format("[sid: %s, tanpos: %s]", tube.getSampleId(), tube.getPos()); + return String.format("[sid: %s, tippos: %s]", tube.getSampleId(), tube.getPos()); } } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_PROCESS_ERROR_PLATE.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_PROCESS_ERROR_PLATE.java index 68013cd..c7cf0dc 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_PROCESS_ERROR_PLATE.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_PROCESS_ERROR_PLATE.java @@ -11,7 +11,6 @@ import a8k.service.app.appstate.ProjectProcessContextMgrService; import a8k.service.app.appstate.resource.A8kPublicResourceType; import a8k.service.app.appstate.type.IncubationSubTank; import a8k.service.app.appstate.type.MainFlowCtrlState; -import a8k.service.app.appstate.type.state.IncubationSubTankState; import a8k.service.debug.AppDebugHelperService; import a8k.type.exception.AppException; import jakarta.annotation.PostConstruct; @@ -42,7 +41,7 @@ public class DO_PROCESS_ERROR_PLATE extends A8kStepAction { @Resource OptScanModuleStateMgrService optScanModuleStateMgrService; @Resource - AppDebugHelperService appDebugHelperService; + AppDebugHelperService appDebugHelper; @Resource ProjectProcessContextMgrService projectProcessContextMgrService; @@ -63,12 +62,15 @@ public class DO_PROCESS_ERROR_PLATE extends A8kStepAction { break; } - if (appDebugHelperService.isDebug()) { + if (appDebugHelper.isDebug()) { logger.info("处理错误板夹:{}", errorTank.getPos()); //TODO:推出板夹到光学模组,同时丢弃板夹 logger.info("推出板夹到光学模组"); logger.info("丢弃板夹"); OS.forceSleep(3000); + appDebugHelper.doVirtualThings("处理错误板夹:" + errorTank.getPos(), 2); + appDebugHelper.doVirtualThings("推出板夹到光学模组", 2); + appDebugHelper.doVirtualThings("丢弃板夹", 2); } // projectProcessContextMgrService.newPlateToOptScanPos(errorTank); diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_START.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_START.java index 1a2610f..febcba1 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_START.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_START.java @@ -44,10 +44,10 @@ public class DO_START extends A8kStepAction { @Override public void doaction() throws AppException { mfcs.workStateChangeFlag = false; - if (!appDebugHelper.isDebug()) { - sampleScanTransportHardwareControler.ejectTubeHolder(); + if (appDebugHelper.isDebug()) { + appDebugHelper.doVirtualThings("弹出试管架", 2); } else { - logger.info("弹出试管架"); + sampleScanTransportHardwareControler.ejectTubeHolder(); } } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PLATE_OPT_SCAN.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PLATE_OPT_SCAN.java index f9de5de..cf1937a 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PLATE_OPT_SCAN.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PLATE_OPT_SCAN.java @@ -70,7 +70,7 @@ public class PLATE_OPT_SCAN extends A8kStepAction { logger.info("扫描板夹"); //记录扫描结果 if (appDebugHelper.isDebug()) { - OS.forceSleep(3000); + appDebugHelper.doVirtualThings("扫描板夹", 2); } else { } //修改板夹状态 diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PROCESS_INCUBATE_COMPLETED_PLATE.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PROCESS_INCUBATE_COMPLETED_PLATE.java index 6693522..1b963e9 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PROCESS_INCUBATE_COMPLETED_PLATE.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PROCESS_INCUBATE_COMPLETED_PLATE.java @@ -67,7 +67,7 @@ public class PROCESS_INCUBATE_COMPLETED_PLATE extends A8kStepAction { return; } if (appDebugHelper.isDebug()) { - OS.forceSleep(3000); + appDebugHelper.doVirtualThings("处理孵育完成的板夹", 2); } projectProcessContextMgrService.newPlateToOptScanPos(tank); diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java index dfc3d18..9d3d9ad 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java @@ -164,7 +164,7 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { TubeHolder parseScanResult(TubeHolderScanResult scanResult) throws AppException { TubeHolder tubeholder = new TubeHolder(); - TubeHolderSetting setting = tubeSettingMgrService.getThelastActiveTubeHolderSettingAndLock(); + TubeHolderSetting setting = tubeSettingMgrService.interUseGetThelastActiveTubeHolderSettingAndLock(); try { //获取试管架类型 A8kTubeHolderType tubeHolderType = A8kTubeHolderType.of(scanResult.tubeHolderType); @@ -188,12 +188,13 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { //设置试管架状态 tubeholder.setState(TubeHolderState.PROCESSING); //删除之前的试管架配置 - tubeSettingMgrService.removeTubeHolderSetting(setting); + tubeSettingMgrService.interUseRemoveTubeHolderSetting(setting); return tubeholder; } catch (AppException e) { //回滚部分状态 - tubeSettingMgrService.removeTubeHolderSetting(setting); + if (setting != null) + tubeSettingMgrService.interUseUnlockTubeHolderSetting(setting.uuid); throw e; } } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java index cbb0002..3130dea 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ2_SWITCH_TO_THE_NEXT_TUBE.java @@ -72,7 +72,7 @@ public class SEQ2_SWITCH_TO_THE_NEXT_TUBE extends A8kStepAction { public void moveToNextTube(Integer tubeIndex) throws AppException { if (appDebugHelperService.isDebug()) { - OS.forceSleep(1000); + appDebugHelperService.doVirtualThings("移动到下一个试管", 2); } else { sstc.moveTubeToPreProcessPos(tubeIndex); } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java index 9903671..1cf1297 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ3_APPLAY_RESOURCE.java @@ -57,6 +57,13 @@ public class SEQ3_APPLAY_RESOURCE extends A8kStepAction { @Override public void doaction() throws AppException { Tube tube = gstate.getCurProcessingTube(); + if(tube.getProjIndex().isEmpty()){ + logger.warn("试管待做项目为空,skip"); + projectProcessContextMgrService.finishedTubeProcess(); + return; + } + + projectProcessContextMgrService.startPrepareRecourseOK(); assert tube != null; boolean applyConsumable = projectProcessContextMgrService.takeResourceConsumable(tube); diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java index b605bd4..1110b8d 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ4_PRE_PROCESS.java @@ -5,6 +5,7 @@ import a8k.service.app.appctrl.mainflowctrl.CondtionMgrService; import a8k.service.app.appdata.AppProjInfoMgrService; import a8k.service.app.appstate.type.state.IncubationSubTankState; import a8k.service.app.appstate.type.state.ProjProcessState; +import a8k.service.debug.AppDebugHelperService; import a8k.utils.AppExceptionBuilder; import a8k.service.bases.AppEventBusService; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; @@ -67,6 +68,8 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction { IncubationPlateStateMgrService incubationPlateStateMgrService; @Resource ProjectProcessContextMgrService projectProcessContextMgrService; + @Resource + AppDebugHelperService appDebugHelper; @Resource CondtionMgrService cms; @@ -83,11 +86,11 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction { * @throws AppException 异常 */ void prepareReactionPlate() throws AppException { - if (gstate.debugMode) { - logger.info("prepareReactionPlate"); - OS.forceSleep(1000); + if (appDebugHelper.isDebug()) { + appDebugHelper.doVirtualThings("准备反应板夹", 2); return; } + // Tube tube = gstate.getCurProcessingTube(); // List projIndex = tube.projIndex; // List incubatorPos = tube.incubatorPos; @@ -106,12 +109,12 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction { * @throws AppException */ void shakeAndTakeCap() throws AppException { - if (gstate.debugMode) { - logger.info("shakeAndTakeCap"); - OS.forceSleep(1000); + if (appDebugHelper.isDebug()) { + appDebugHelper.doVirtualThings("摇匀并取盖", 2); return; } + // Tube tube = gstate.getCurProcessingTube(); // if (tube.isEmergency) { // //如果事急诊位则什么也不做 @@ -132,9 +135,8 @@ public class SEQ4_PRE_PROCESS extends A8kStepAction { } void hbotPrepareTip() throws AppException { - if (gstate.debugMode) { - logger.info("hbotPrepareTip"); - OS.forceSleep(1000); + if (appDebugHelper.isDebug()) { + appDebugHelper.doVirtualThings("准备Hbot Tip", 2); return; } // Tube tube = gstate.getCurProcessingTube(); diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ5_PROCESS.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ5_PROCESS.java index 2667044..9ab81f3 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ5_PROCESS.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ5_PROCESS.java @@ -2,6 +2,7 @@ package a8k.service.app.appctrl.mainflowctrl.action; import a8k.OS; import a8k.service.app.appstate.type.state.ProjProcessState; +import a8k.service.debug.AppDebugHelperService; import a8k.utils.AppExceptionBuilder; import a8k.service.app.appctrl.mainflowctrl.CondtionMgrService; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; @@ -46,6 +47,8 @@ public class SEQ5_PROCESS extends A8kStepAction { CondtionMgrService cms; @Resource ProjectProcessContextMgrService projectProcessContextMgrService; + @Resource + AppDebugHelperService appDebugHelper; MainFlowCtrlState state; @@ -63,7 +66,11 @@ public class SEQ5_PROCESS extends A8kStepAction { // var tube = gstate.getCurProcessingTube(); projectProcessContextMgrService.startProcessTube(); - OS.forceSleep(3000); + + if(appDebugHelper.isDebug()){ + appDebugHelper.doVirtualThings("处理样本(准备反应板,取tip,摇匀,脱帽)", 5); + } + List projList = tube.getProjIndex(); for (Integer projIndex : projList) { ProjProcessContext cxt = projectProcessContextMgrService.getProjProcessContext(tube.getSampleId(), diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ6_POST_PROCESS.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ6_POST_PROCESS.java index cd889e1..b249731 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ6_POST_PROCESS.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ6_POST_PROCESS.java @@ -1,6 +1,7 @@ package a8k.service.app.appctrl.mainflowctrl.action; import a8k.OS; +import a8k.service.debug.AppDebugHelperService; import a8k.utils.AppExceptionBuilder; import a8k.service.app.appctrl.mainflowctrl.CondtionMgrService; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; @@ -47,6 +48,8 @@ public class SEQ6_POST_PROCESS extends A8kStepAction { ProjectProcessContextMgrService projectProcessContextMgrService; @Resource CondtionMgrService cms; + @Resource + AppDebugHelperService appDebugHelper; ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 3, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(10)); @@ -61,7 +64,10 @@ public class SEQ6_POST_PROCESS extends A8kStepAction { @Override public void doaction() throws AppException { projectProcessContextMgrService.postProcessTube(); - OS.forceSleep(3000); + + if (appDebugHelper.isDebug()) { + appDebugHelper.doVirtualThings("后处理样本", 3); + } projectProcessContextMgrService.postProcessTubeOK(); } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java index f4c0052..fd562e9 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ7_EJECT_TUBEHOLDER.java @@ -49,6 +49,7 @@ public class SEQ7_EJECT_TUBEHOLDER extends A8kStepAction { SST_HControler.ejectTubeHolder(); SST_HControler.moveTubeRackMoveToEnterPos(); } else { + appDebugHelper.doVirtualThings("弹出试管架", 2); } gstate.getTubeHolder().setState(TubeHolderState.IDLE); diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kStepAction.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kStepAction.java index 7c2fda4..a7a0d42 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kStepAction.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kStepAction.java @@ -34,11 +34,10 @@ public class A8kStepAction { } public Boolean isAllowsParallelRunning() { - return true; + return false; } public String logCxtState() { return ""; } - } diff --git a/src/main/java/a8k/service/app/appstate/ConsumablesMgrService.java b/src/main/java/a8k/service/app/appstate/ConsumablesMgrService.java index 758c08b..1a20fd3 100644 --- a/src/main/java/a8k/service/app/appstate/ConsumablesMgrService.java +++ b/src/main/java/a8k/service/app/appstate/ConsumablesMgrService.java @@ -91,14 +91,15 @@ public class ConsumablesMgrService { } synchronized Integer priTakeOneConsumable(ConsumableGroup group) { - var cState = gstate.getConsumableState(); - cState.reactionPlateGroup[group.off].num--; - return AppConstant.CONSUMABLE_NUM - cState.reactionPlateGroup[group.off].num + 1; + Integer num = priGetConsumableRemainNum(group); + priSetConsumableGroupNum(group, num - 1); + return AppConstant.CONSUMABLE_NUM - num - 1 + 1; } synchronized void priBakOneConsumable(ConsumableGroup group) { - var cState = gstate.getConsumableState(); - cState.reactionPlateGroup[group.off].num++; + var cState = gstate.getConsumableState(); + Integer num = priGetConsumableRemainNum(group); + priSetConsumableGroupNum(group, num + 1); } synchronized String priGetLotId(ConsumableGroup group) { @@ -183,6 +184,8 @@ public class ConsumablesMgrService { List ret = new ArrayList<>(); for (int i = 0; i < takeCnt; i++) { TipPos tipPos = takeNextTipPos(); + if (tipPos == null) + break; ret.add(tipPos); } diff --git a/src/main/java/a8k/service/app/appstate/EmergencySamplePosStateMgrService.java b/src/main/java/a8k/service/app/appstate/EmergencySamplePosStateMgrService.java index a92f0a4..cbb8e8f 100644 --- a/src/main/java/a8k/service/app/appstate/EmergencySamplePosStateMgrService.java +++ b/src/main/java/a8k/service/app/appstate/EmergencySamplePosStateMgrService.java @@ -56,6 +56,10 @@ public class EmergencySamplePosStateMgrService { throw new AppException(A8kEcode.APPE_ACTION_IS_NOT_ALLOWED_WHEN_WORKING); } + if(projIndexList == null || projIndexList.isEmpty()) { + throw new AppException(A8kEcode.APPE_PROJ_INDEX_IS_EMPTY); + } + for (String index : projIndexList.split(",")) { projIndex.add(Integer.parseInt(index)); } diff --git a/src/main/java/a8k/service/app/appstate/GStateService.java b/src/main/java/a8k/service/app/appstate/GStateService.java index 7e880bc..f03a475 100644 --- a/src/main/java/a8k/service/app/appstate/GStateService.java +++ b/src/main/java/a8k/service/app/appstate/GStateService.java @@ -43,8 +43,6 @@ public class GStateService { String sn = "NOTSET"; - public Boolean debugMode = true; - //主流程控制状态 public MainFlowCtrlState mainFlowCtrlState = new MainFlowCtrlState(); diff --git a/src/main/java/a8k/service/app/appstate/ProjectProcessContextMgrService.java b/src/main/java/a8k/service/app/appstate/ProjectProcessContextMgrService.java index 577bd9b..e4d9c48 100644 --- a/src/main/java/a8k/service/app/appstate/ProjectProcessContextMgrService.java +++ b/src/main/java/a8k/service/app/appstate/ProjectProcessContextMgrService.java @@ -125,7 +125,9 @@ public class ProjectProcessContextMgrService { } } } - + synchronized public List getAllContexts() { + return contexts; + } synchronized public List getAllProcessingProjProcessContexts() { List ret = new ArrayList<>(); diff --git a/src/main/java/a8k/service/app/appstate/type/IncubationSubTank.java b/src/main/java/a8k/service/app/appstate/type/IncubationSubTank.java index 1a39f70..1a0a4ac 100644 --- a/src/main/java/a8k/service/app/appstate/type/IncubationSubTank.java +++ b/src/main/java/a8k/service/app/appstate/type/IncubationSubTank.java @@ -70,5 +70,16 @@ public class IncubationSubTank { return String.format("%s(%d)", projInfo.projShotName, projInfo.projIndex); } + public Integer getIncubatedRemainTimeSec() { + if (state == IncubationSubTankState.INCUBATING) { + long remain = incubatedTimeSec - (System.currentTimeMillis() - startIncubatedTime) / 1000; + if (remain < 0) { + return 0; + } + return (int) remain; + } + return 0; + } + } diff --git a/src/main/java/a8k/service/app/appstate/type/ProjProcessContext.java b/src/main/java/a8k/service/app/appstate/type/ProjProcessContext.java index 5acd1b1..6d0cc0b 100644 --- a/src/main/java/a8k/service/app/appstate/type/ProjProcessContext.java +++ b/src/main/java/a8k/service/app/appstate/type/ProjProcessContext.java @@ -8,6 +8,7 @@ import a8k.type.ecode.AppError; import a8k.type.type.BloodType; import a8k.utils.A8kProjCfg; import a8k.utils.ProjBriefInfo; +import com.fasterxml.jackson.annotation.JsonIgnore; import java.util.ArrayList; import java.util.List; @@ -26,6 +27,7 @@ public class ProjProcessContext { public ProjBriefInfo projInfo;//项目信息 + @JsonIgnore public A8kProjCfg projCfg;//项目配置 有分配耗材时,才会拿到具体的项目配置 public Consumable consumable;//耗材绑定的通道号 public IncubatorPos incubatorPos;//孵育位置 diff --git a/src/main/java/a8k/service/debug/AppDebugHelperService.java b/src/main/java/a8k/service/debug/AppDebugHelperService.java index d54f504..3f853d4 100644 --- a/src/main/java/a8k/service/debug/AppDebugHelperService.java +++ b/src/main/java/a8k/service/debug/AppDebugHelperService.java @@ -8,10 +8,18 @@ import a8k.extapi_controler.utils.ExtApiTab; import a8k.hardware.type.a8kcanprotocol.A8kEcode; import a8k.hardware.type.a8kcanprotocol.CmdId; import a8k.hardware.type.a8kcanprotocol.MId; +import a8k.service.app.appctrl.AppDeviceCtrlService; import a8k.service.app.appctrl.CheckPointType; +import a8k.service.app.appctrl.MainFlowCtrlService; +import a8k.service.app.appctrl.TubeSettingMgrService; +import a8k.service.app.appctrl.mainflowctrl.CondtionMgrService; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; import a8k.service.app.appctrl.mainflowctrl.base.A8kErrorContext; +import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; +import a8k.service.app.appstate.ConsumablesMgrService; import a8k.service.app.appstate.GStateService; +import a8k.service.app.appstate.ProjectProcessContextMgrService; +import a8k.service.app.appstate.type.ProjProcessContext; import a8k.service.bases.AppEventBusService; import a8k.service.bases.appevent.*; import a8k.service.db.A8kProjIdCardDBService; @@ -31,13 +39,17 @@ import a8k.type.ecode.ConsumeNotEnoughError; import a8k.type.ecode.HardwareError; import a8k.type.exception.AppException; import a8k.type.reaction_result_type.ReactionResultStatus; +import a8k.type.tube_setting.TubeHolderSetting; import a8k.type.type.A8kTubeHolderType; import a8k.type.type.BloodType; +import a8k.type.type.TipGroup; import a8k.utils.A8kPacketBuilder; import a8k.utils.ReactionPlate2DCodeHelper; import a8k.utils.ZDateUtils; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.ArrayList; @@ -48,6 +60,7 @@ import java.util.List; @ExtApiTab(cfg = ExtApiTabConfig.AppDebugHelperService) public class AppDebugHelperService { + private static final Logger logger = LoggerFactory.getLogger(AppDebugHelperService.class); Boolean debugFlag = true; @Resource @@ -243,6 +256,80 @@ public class AppDebugHelperService { eventBus.pushEvent(new A8kEcodeContextListPromptEvent(errorContexts)); } + + @ExtApiFn(name = "获取运行步骤状态", group = "调试") + public List getA8kStepActionList() { + MainFlowCtrlService mainFlowCtrlService = SpringBootBeanUtil.getBean(MainFlowCtrlService.class); + return mainFlowCtrlService.getA8kStepActionList(); + } + + @ExtApiFn(name = "获取设备状态()", group = "调试") + public GStateService getGState() { + return gstate; + } + + @ExtApiFn(name = "获取所有项目<运行中>Context", group = "调试") + public List getAllProcessingProjProcessContexts() { + ProjectProcessContextMgrService projectProcessContextMgrService = SpringBootBeanUtil.getBean(ProjectProcessContextMgrService.class); + return projectProcessContextMgrService.getAllProcessingProjProcessContexts(); + } + + @ExtApiFn(name = "获取所有项目Context", group = "调试") + public List getAllContext() { + ProjectProcessContextMgrService projectProcessContextMgrService = SpringBootBeanUtil.getBean(ProjectProcessContextMgrService.class); + return projectProcessContextMgrService.getAllContexts(); + } + + @ExtApiFn(name = "获取所有项目<异常>Context", group = "调试") + public List getAllErrorProjProcessContexts() { + ProjectProcessContextMgrService projectProcessContextMgrService = SpringBootBeanUtil.getBean(ProjectProcessContextMgrService.class); + return projectProcessContextMgrService.getAllErrorProjProcessContexts(); + } + + @ExtApiFn(name = "获取动作运行条件", group = "调试") + public CondtionMgrService getCondtions() { + return SpringBootBeanUtil.getBean(CondtionMgrService.class); + } + + + @ExtApiFn(name = "测试0", group = "虚拟测试", order = 1) + public void virtulaTest0() throws AppException { + //插入ID卡 + logger.info("保存测试的ID卡信息"); + saveAllIDCard(); + + //添加试管配置 + logger.info("添加试管配置"); + TubeSettingMgrService tubeSettingMgrService = SpringBootBeanUtil.getBean(TubeSettingMgrService.class); + tubeSettingMgrService.newTubeHolderSetting(); + TubeHolderSetting setting = tubeSettingMgrService.newTubeHolderSettingV2(); + for (int i = 0; i < 10; i++) { + tubeSettingMgrService.setTubeSettingUserIdAndSampleBarcode(setting.uuid, i, String.format("USR%d", i), ""); + tubeSettingMgrService.setTubeSetting(setting.uuid, i, BloodType.WHOLE_BLOOD,// + String.format("%d,%d,%d,%d,%d,%d", p01_hscrr.projIndex, p02_pct.projIndex, p03_tsh.projIndex, p05_t3.projIndex, p06_t4.projIndex, p22_pctAndHsCRP.projIndex)); + } + tubeSettingMgrService.tubeHodlerSettingSetActiveState(setting.uuid, true); + + //初始化设备 + logger.info("初始化设备"); + AppDeviceCtrlService appDeviceCtrlService = SpringBootBeanUtil.getBean(AppDeviceCtrlService.class); + appDeviceCtrlService.initDevice(); + + //扫描耗材 + logger.info("扫描耗材"); + putRightConsumable(); + appDeviceCtrlService.scanConsumables(); + + ConsumablesMgrService consumablesMgrService = SpringBootBeanUtil.getBean(ConsumablesMgrService.class); + consumablesMgrService.setTipNum(TipGroup.GROUP0.ordinal(),120); + + + //放入一个虚拟试管 + logger.info("放入一个虚拟试管"); + insertVirtualBloodTubeHolder(); + } + + //InterUse public Boolean getVirtualIDCard() { return mountIdcard != null; @@ -280,7 +367,7 @@ public class AppDebugHelperService { public ConsumableOneChResult scanOneCH(Integer ch) { - OS.forceSleep(1500); + doVirtualThings("扫描耗材-板夹" + ch, 1); ConsumableOneChResult result = new ConsumableOneChResult(ch); switch (consumablesErrorType[ch]) { case PASS: //通过 @@ -364,8 +451,16 @@ public class AppDebugHelperService { synchronized public TubeHolderScanResult takeTubeHolderScanResult() { TubeHolderScanResult tubeHolderScanResult = this.tubeHolderScanResult; this.tubeHolderScanResult = null; + doVirtualThings("进入一个新的试管架", 2); return tubeHolderScanResult; } + synchronized public void doVirtualThings(String dowhat, Integer time) { + // for (int i = 0; i < time; i++) { + logger.info("VirtualDoing:" + dowhat); + OS.forceSleep(100); + // } + } + } diff --git a/src/main/java/a8k/service/debug/fakeprojinfo/FakeProjInfo.java b/src/main/java/a8k/service/debug/fakeprojinfo/FakeProjInfo.java index 48e9759..67589c4 100644 --- a/src/main/java/a8k/service/debug/fakeprojinfo/FakeProjInfo.java +++ b/src/main/java/a8k/service/debug/fakeprojinfo/FakeProjInfo.java @@ -32,7 +32,7 @@ public class FakeProjInfo { public Integer shakeTimes = 5; public Integer bigBufferSampleUl = 0; public Integer mixLiquidAspirMixingCnt = 3; - public Integer reactionPlateIncubationTimeMin = 3; + public Integer reactionPlateIncubationTimeMin = 1; public Integer reactionPlateDropletVolUl = 75; diff --git a/src/main/java/a8k/service/debug/fakeprojinfo/P01_hsCRR.java b/src/main/java/a8k/service/debug/fakeprojinfo/P01_hsCRR.java index ca7bad4..c4b67b6 100644 --- a/src/main/java/a8k/service/debug/fakeprojinfo/P01_hsCRR.java +++ b/src/main/java/a8k/service/debug/fakeprojinfo/P01_hsCRR.java @@ -30,7 +30,7 @@ public class P01_hsCRR extends FakeProjInfo { shakeTimes = 5; // 振荡次数 bigBufferSampleUl = 0; // 大缓冲样本体积 mixLiquidAspirMixingCnt = 3; // 混合液吸液混合次数 - reactionPlateIncubationTimeMin = 3; // 反应板孵育时间(min) + reactionPlateIncubationTimeMin = 1; // 反应板孵育时间(min) reactionPlateDropletVolUl = 75; // 反应板滴样体积 } diff --git a/src/main/java/a8k/service/debug/fakeprojinfo/P02_PCT.java b/src/main/java/a8k/service/debug/fakeprojinfo/P02_PCT.java index 746f807..c2e86d5 100644 --- a/src/main/java/a8k/service/debug/fakeprojinfo/P02_PCT.java +++ b/src/main/java/a8k/service/debug/fakeprojinfo/P02_PCT.java @@ -20,7 +20,7 @@ public class P02_PCT extends FakeProjInfo { shakeTimes = 5; // 振荡次数 bigBufferSampleUl = 0; // 大缓冲样本体积 mixLiquidAspirMixingCnt = 3; // 混合液吸液混合次数 - reactionPlateIncubationTimeMin = 3; // 反应板孵育时间(min) + reactionPlateIncubationTimeMin = 1; // 反应板孵育时间(min) reactionPlateDropletVolUl = 75; // 反应板滴样体积 } diff --git a/src/main/java/a8k/service/debug/fakeprojinfo/P03_TSH.java b/src/main/java/a8k/service/debug/fakeprojinfo/P03_TSH.java index f5c7bcb..4d0d7c9 100644 --- a/src/main/java/a8k/service/debug/fakeprojinfo/P03_TSH.java +++ b/src/main/java/a8k/service/debug/fakeprojinfo/P03_TSH.java @@ -20,7 +20,7 @@ public class P03_TSH extends FakeProjInfo { shakeTimes = 5; // 振荡次数 bigBufferSampleUl = 0; // 大缓冲样本体积 mixLiquidAspirMixingCnt = 3; // 混合液吸液混合次数 - reactionPlateIncubationTimeMin = 3; // 反应板孵育时间(min) + reactionPlateIncubationTimeMin = 1; // 反应板孵育时间(min) reactionPlateDropletVolUl = 75; // 反应板滴样体积 } } diff --git a/src/main/java/a8k/service/debug/fakeprojinfo/P05_T3.java b/src/main/java/a8k/service/debug/fakeprojinfo/P05_T3.java index 08d1d7a..4aacd52 100644 --- a/src/main/java/a8k/service/debug/fakeprojinfo/P05_T3.java +++ b/src/main/java/a8k/service/debug/fakeprojinfo/P05_T3.java @@ -20,7 +20,7 @@ public class P05_T3 extends FakeProjInfo { shakeTimes = 5; // 振荡次数 bigBufferSampleUl = 0; // 大缓冲样本体积 mixLiquidAspirMixingCnt = 3; // 混合液吸液混合次数 - reactionPlateIncubationTimeMin = 3; // 反应板孵育时间(min) + reactionPlateIncubationTimeMin = 1; // 反应板孵育时间(min) reactionPlateDropletVolUl = 75; // 反应板滴样体积 } } diff --git a/src/main/java/a8k/service/debug/fakeprojinfo/P06_T4.java b/src/main/java/a8k/service/debug/fakeprojinfo/P06_T4.java index d9a2ca7..b62f306 100644 --- a/src/main/java/a8k/service/debug/fakeprojinfo/P06_T4.java +++ b/src/main/java/a8k/service/debug/fakeprojinfo/P06_T4.java @@ -20,7 +20,7 @@ public class P06_T4 extends FakeProjInfo { shakeTimes = 5; // 振荡次数 bigBufferSampleUl = 0; // 大缓冲样本体积 mixLiquidAspirMixingCnt = 3; // 混合液吸液混合次数 - reactionPlateIncubationTimeMin = 3; // 反应板孵育时间(min) + reactionPlateIncubationTimeMin = 1; // 反应板孵育时间(min) reactionPlateDropletVolUl = 75; // 反应板滴样体积 } } diff --git a/src/main/java/a8k/service/debug/fakeprojinfo/P22_PCTAndHsCRP.java b/src/main/java/a8k/service/debug/fakeprojinfo/P22_PCTAndHsCRP.java index 8c0eb42..3f9199d 100644 --- a/src/main/java/a8k/service/debug/fakeprojinfo/P22_PCTAndHsCRP.java +++ b/src/main/java/a8k/service/debug/fakeprojinfo/P22_PCTAndHsCRP.java @@ -20,7 +20,7 @@ public class P22_PCTAndHsCRP extends FakeProjInfo { shakeTimes = 5;// 振荡次数 bigBufferSampleUl = 150;// 大缓冲样本体积 mixLiquidAspirMixingCnt = 3;// 混合液吸液混合次数 - reactionPlateIncubationTimeMin = 12;// 反应板孵育时间(min) + reactionPlateIncubationTimeMin = 2;// 反应板孵育时间(min) reactionPlateDropletVolUl = 75;// 反应板滴样体积 } }