From a770f6918cd3e1d63dcf2dbca63a19ef05c033ba Mon Sep 17 00:00:00 2001 From: zhaohe Date: Fri, 20 Jun 2025 11:27:04 +0800 Subject: [PATCH] recode --- .../api/v1/app/ws/AppWebSocketEndpointMgr.java | 2 +- .../engineer/EngineerModeActionCtrlController.java | 2 +- .../ExperimentConsistencyTestingControler.java | 6 +- ...quidAbsorptionAndDistributionTestControler.java | 2 +- .../engineer/QATemperatureCtrlTestController.java | 2 +- .../executor/EngineerModeActionExecutor.java | 124 ---------------- .../qatest/EngineerModeActionCtrlService.java | 18 --- .../ExperimentConsistencyTestingService.java | 92 ------------ ...LiquidAbsorptionAndDistributionTestService.java | 160 --------------------- .../qatest/QATemperatureCtrlTestService.java | 77 ---------- .../state/EngineerModeStateMgrService.java | 25 ---- .../state/TubeholderExSettingMgr.java | 34 ----- .../app/engineer_service/type/A8kCmdRunnable.java | 8 -- .../engineer_service/type/EngineerActionType.java | 2 - .../engineer_service/type/EngineerModeState.java | 7 - .../engineer_service/type/EngineerWorkState.java | 6 - .../app/engineer_service/type/TubeExConfig.java | 5 - .../engineer_service/type/TubeHolderExConfig.java | 19 --- .../utils/BeforeDoEngineerActionChecker.java | 47 ------ .../executor/EngineerModeActionExecutor.java | 124 ++++++++++++++++ .../qatest/EngineerModeActionCtrlService.java | 18 +++ .../ExperimentConsistencyTestingService.java | 91 ++++++++++++ ...LiquidAbsorptionAndDistributionTestService.java | 160 +++++++++++++++++++++ .../qatest/QATemperatureCtrlTestService.java | 77 ++++++++++ .../state/EngineerModeStateMgrService.java | 25 ++++ .../engineer/state/TubeholderExSettingMgr.java | 34 +++++ .../app/service/engineer/type/A8kCmdRunnable.java | 8 ++ .../service/engineer/type/EngineerActionType.java | 2 + .../service/engineer/type/EngineerModeState.java | 7 + .../service/engineer/type/EngineerWorkState.java | 6 + .../app/service/engineer/type/TubeExConfig.java | 5 + .../service/engineer/type/TubeHolderExConfig.java | 19 +++ .../utils/BeforeDoEngineerActionChecker.java | 47 ++++++ .../mainctrl/AppDeviceMainFlowCtrlService.java | 2 +- .../service/mainctrl/MainFlowCtrlScheduler.java | 4 +- .../app/service/module/InFeedingCtrlModule.java | 4 +- .../service/module/IncubationPlateCtrlModule.java | 2 +- .../a8k/app/service/module/OptScanCtrlModule.java | 2 +- .../app/service/module/SamplePreProcessModule.java | 2 +- .../ExperimentConsistencyTestingPage.java | 14 +- .../profession_test/P01PipetteGunVerification.java | 2 +- 41 files changed, 646 insertions(+), 647 deletions(-) delete mode 100644 src/main/java/a8k/app/engineer_service/executor/EngineerModeActionExecutor.java delete mode 100644 src/main/java/a8k/app/engineer_service/qatest/EngineerModeActionCtrlService.java delete mode 100644 src/main/java/a8k/app/engineer_service/qatest/ExperimentConsistencyTestingService.java delete mode 100644 src/main/java/a8k/app/engineer_service/qatest/LiquidAbsorptionAndDistributionTestService.java delete mode 100644 src/main/java/a8k/app/engineer_service/qatest/QATemperatureCtrlTestService.java delete mode 100644 src/main/java/a8k/app/engineer_service/state/EngineerModeStateMgrService.java delete mode 100644 src/main/java/a8k/app/engineer_service/state/TubeholderExSettingMgr.java delete mode 100644 src/main/java/a8k/app/engineer_service/type/A8kCmdRunnable.java delete mode 100644 src/main/java/a8k/app/engineer_service/type/EngineerActionType.java delete mode 100644 src/main/java/a8k/app/engineer_service/type/EngineerModeState.java delete mode 100644 src/main/java/a8k/app/engineer_service/type/EngineerWorkState.java delete mode 100644 src/main/java/a8k/app/engineer_service/type/TubeExConfig.java delete mode 100644 src/main/java/a8k/app/engineer_service/type/TubeHolderExConfig.java delete mode 100644 src/main/java/a8k/app/engineer_service/utils/BeforeDoEngineerActionChecker.java create mode 100644 src/main/java/a8k/app/service/engineer/executor/EngineerModeActionExecutor.java create mode 100644 src/main/java/a8k/app/service/engineer/qatest/EngineerModeActionCtrlService.java create mode 100644 src/main/java/a8k/app/service/engineer/qatest/ExperimentConsistencyTestingService.java create mode 100644 src/main/java/a8k/app/service/engineer/qatest/LiquidAbsorptionAndDistributionTestService.java create mode 100644 src/main/java/a8k/app/service/engineer/qatest/QATemperatureCtrlTestService.java create mode 100644 src/main/java/a8k/app/service/engineer/state/EngineerModeStateMgrService.java create mode 100644 src/main/java/a8k/app/service/engineer/state/TubeholderExSettingMgr.java create mode 100644 src/main/java/a8k/app/service/engineer/type/A8kCmdRunnable.java create mode 100644 src/main/java/a8k/app/service/engineer/type/EngineerActionType.java create mode 100644 src/main/java/a8k/app/service/engineer/type/EngineerModeState.java create mode 100644 src/main/java/a8k/app/service/engineer/type/EngineerWorkState.java create mode 100644 src/main/java/a8k/app/service/engineer/type/TubeExConfig.java create mode 100644 src/main/java/a8k/app/service/engineer/type/TubeHolderExConfig.java create mode 100644 src/main/java/a8k/app/service/engineer/utils/BeforeDoEngineerActionChecker.java diff --git a/src/main/java/a8k/app/controler/api/v1/app/ws/AppWebSocketEndpointMgr.java b/src/main/java/a8k/app/controler/api/v1/app/ws/AppWebSocketEndpointMgr.java index 0ed9d23..a7cd557 100644 --- a/src/main/java/a8k/app/controler/api/v1/app/ws/AppWebSocketEndpointMgr.java +++ b/src/main/java/a8k/app/controler/api/v1/app/ws/AppWebSocketEndpointMgr.java @@ -1,6 +1,6 @@ package a8k.app.controler.api.v1.app.ws; -import a8k.app.engineer_service.state.EngineerModeStateMgrService; +import a8k.app.service.engineer.state.EngineerModeStateMgrService; import a8k.app.type.AppGetStateFn; import a8k.app.type.DeviceRunMode; import a8k.app.dao.type.db.AppUser; diff --git a/src/main/java/a8k/app/controler/api/v1/engineer/EngineerModeActionCtrlController.java b/src/main/java/a8k/app/controler/api/v1/engineer/EngineerModeActionCtrlController.java index 474a2bd..4f5f3c8 100644 --- a/src/main/java/a8k/app/controler/api/v1/engineer/EngineerModeActionCtrlController.java +++ b/src/main/java/a8k/app/controler/api/v1/engineer/EngineerModeActionCtrlController.java @@ -1,7 +1,7 @@ package a8k.app.controler.api.v1.engineer; -import a8k.app.engineer_service.qatest.EngineerModeActionCtrlService; +import a8k.app.service.engineer.qatest.EngineerModeActionCtrlService; import a8k.app.type.exception.AppException; import a8k.app.type.ui.ApiRet; import io.swagger.v3.oas.annotations.Operation; diff --git a/src/main/java/a8k/app/controler/api/v1/engineer/ExperimentConsistencyTestingControler.java b/src/main/java/a8k/app/controler/api/v1/engineer/ExperimentConsistencyTestingControler.java index 4059112..0cb3116 100644 --- a/src/main/java/a8k/app/controler/api/v1/engineer/ExperimentConsistencyTestingControler.java +++ b/src/main/java/a8k/app/controler/api/v1/engineer/ExperimentConsistencyTestingControler.java @@ -1,9 +1,9 @@ package a8k.app.controler.api.v1.engineer; -import a8k.app.engineer_service.qatest.ExperimentConsistencyTestingService; -import a8k.app.engineer_service.state.TubeholderExSettingMgr; -import a8k.app.engineer_service.type.TubeHolderExConfig; +import a8k.app.service.engineer.qatest.ExperimentConsistencyTestingService; +import a8k.app.service.engineer.state.TubeholderExSettingMgr; +import a8k.app.service.engineer.type.TubeHolderExConfig; import a8k.app.type.exception.AppException; import a8k.app.type.ui.ApiRet; import a8k.app.utils.ZJsonHelper; diff --git a/src/main/java/a8k/app/controler/api/v1/engineer/LiquidAbsorptionAndDistributionTestControler.java b/src/main/java/a8k/app/controler/api/v1/engineer/LiquidAbsorptionAndDistributionTestControler.java index 17917b5..f42e94e 100644 --- a/src/main/java/a8k/app/controler/api/v1/engineer/LiquidAbsorptionAndDistributionTestControler.java +++ b/src/main/java/a8k/app/controler/api/v1/engineer/LiquidAbsorptionAndDistributionTestControler.java @@ -1,7 +1,7 @@ package a8k.app.controler.api.v1.engineer; -import a8k.app.engineer_service.qatest.LiquidAbsorptionAndDistributionTestService; +import a8k.app.service.engineer.qatest.LiquidAbsorptionAndDistributionTestService; import a8k.app.iflytophald.type.protocol.A8kEcode; import a8k.app.type.exception.AppException; import a8k.app.type.ui.ApiRet; diff --git a/src/main/java/a8k/app/controler/api/v1/engineer/QATemperatureCtrlTestController.java b/src/main/java/a8k/app/controler/api/v1/engineer/QATemperatureCtrlTestController.java index bca961b..def4961 100644 --- a/src/main/java/a8k/app/controler/api/v1/engineer/QATemperatureCtrlTestController.java +++ b/src/main/java/a8k/app/controler/api/v1/engineer/QATemperatureCtrlTestController.java @@ -1,7 +1,7 @@ package a8k.app.controler.api.v1.engineer; -import a8k.app.engineer_service.qatest.QATemperatureCtrlTestService; +import a8k.app.service.engineer.qatest.QATemperatureCtrlTestService; import a8k.app.type.TemperatureRecordPoint; import a8k.app.type.ui.ApiRet; import io.swagger.v3.oas.annotations.Operation; diff --git a/src/main/java/a8k/app/engineer_service/executor/EngineerModeActionExecutor.java b/src/main/java/a8k/app/engineer_service/executor/EngineerModeActionExecutor.java deleted file mode 100644 index 549c349..0000000 --- a/src/main/java/a8k/app/engineer_service/executor/EngineerModeActionExecutor.java +++ /dev/null @@ -1,124 +0,0 @@ -package a8k.app.engineer_service.executor; - -import a8k.OS; -import a8k.app.engineer_service.state.EngineerModeStateMgrService; -import a8k.app.engineer_service.type.A8kCmdRunnable; -import a8k.app.engineer_service.type.EngineerWorkState; -import a8k.app.service.statemgr.DeviceWorkStateMgrService; -import a8k.app.service.statemgr.GStateMgrService; -import a8k.app.type.DeviceRunMode; -import a8k.app.type.a8k.state.enumtype.A8kWorkState; -import a8k.app.type.a8k.state.enumtype.A8kWorkTaskType; -import a8k.app.type.exception.AppException; -import a8k.app.type.exception.EngineerTaskBreakException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * 工程师模式下的动作执行器 - * - * 存在目的: - * 1. 由于当前设备 - * - */ - - -@Component -@Slf4j -@RequiredArgsConstructor -public class EngineerModeActionExecutor { - - @FunctionalInterface - public interface Action { - void run(); - } - - private final EngineerModeStateMgrService stateMgr; - private final GStateMgrService gStateMgrService; - private final DeviceWorkStateMgrService deviceWorkStateMgrService; - - - Boolean stoppingFlag = false; - Boolean isWorking = false; - ThreadPoolExecutor executor = - new ThreadPoolExecutor(1, 1, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(1)); - - synchronized public void start(Action action) { - if (isWorking) - stoppingFlag = true; - - while (isWorking) { - OS.hsleep(100); - log.info("Waiting for the previous action to finish..."); - } - - stoppingFlag = false; - deviceWorkStateMgrService.setStartActionPending(A8kWorkTaskType.EngineerTask, true); - executor.submit(() -> { - try { - deviceWorkStateMgrService.clearPending(); - deviceWorkStateMgrService.updateWorkState(A8kWorkState.WORKING); - stateMgr.setEngineerWorkState(EngineerWorkState.WORKING); - isWorking = true; - action.run(); - } catch (EngineerTaskBreakException e) { - log.info("action was interrupted"); - } catch (Exception e) { - log.error("Error in action execution", e); - } - stateMgr.setEngineerWorkState(EngineerWorkState.IDLE); - deviceWorkStateMgrService.updateWorkState(A8kWorkState.IDLE); - isWorking = false; - }); - } - - synchronized public void stop() { - log.info("Stopping action..."); - stoppingFlag = true; - deviceWorkStateMgrService.setStopActionPending(true); - while (isWorking) { - OS.hsleep(1000); - log.info("Waiting for the action to stop..."); - } - deviceWorkStateMgrService.clearPending(); - stoppingFlag = false; - } - - public void sleep(int ms) { - if (stoppingFlag) { - throw new EngineerTaskBreakException(); - } - OS.hsleep(ms); - } - - public Boolean isStopping() { - return stoppingFlag; - } - - - public void docmd(String mark, A8kCmdRunnable runnable, A8kCmdRunnable virtualRunable) throws AppException { - log.info("DO {}", mark); - if (gStateMgrService.isInMode(DeviceRunMode.RealMode)) { - runnable.run(); - } else { - virtualRunable.run(); - } - } - - public void docmd(String mark, A8kCmdRunnable runnable) throws AppException { - docmd(mark, runnable, () -> { - sleep(1000); - }); - } - - public boolean isInRealMode() { - return gStateMgrService.isInMode(DeviceRunMode.RealMode); - } - - -} diff --git a/src/main/java/a8k/app/engineer_service/qatest/EngineerModeActionCtrlService.java b/src/main/java/a8k/app/engineer_service/qatest/EngineerModeActionCtrlService.java deleted file mode 100644 index d80774f..0000000 --- a/src/main/java/a8k/app/engineer_service/qatest/EngineerModeActionCtrlService.java +++ /dev/null @@ -1,18 +0,0 @@ -package a8k.app.engineer_service.qatest; - -import a8k.app.engineer_service.executor.EngineerModeActionExecutor; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -@RequiredArgsConstructor -public class EngineerModeActionCtrlService { - private final EngineerModeActionExecutor executor; - - public void stop() { - executor.stop(); - } - -} diff --git a/src/main/java/a8k/app/engineer_service/qatest/ExperimentConsistencyTestingService.java b/src/main/java/a8k/app/engineer_service/qatest/ExperimentConsistencyTestingService.java deleted file mode 100644 index 541cfc2..0000000 --- a/src/main/java/a8k/app/engineer_service/qatest/ExperimentConsistencyTestingService.java +++ /dev/null @@ -1,92 +0,0 @@ -package a8k.app.engineer_service.qatest; - -import a8k.app.engineer_service.state.TubeholderExSettingMgr; -import a8k.app.iflytophald.type.protocol.A8kEcode; -import a8k.app.service.data.ProjInfoMgrService; -import a8k.app.service.mainctrl.MainFlowCtrlScheduler; -import a8k.app.service.mainctrl.TubeHolderSettingMgrService; -import a8k.app.service.statemgr.*; -import a8k.app.type.exception.AppException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -/* - * - * 试剂实验一致性检测 - * - * 目的: - * 1. 用于在行检中测试不同浓度的样本,多次检测后,结果的一致性是否满足要求 - * - */ -@Component -@Slf4j -@RequiredArgsConstructor -public class ExperimentConsistencyTestingService { - /* - * 状态管理器 - */ - final private ConsumablesMgrService consumablesMgrService; - final private TubeHolderSettingMgrService tubeHolderSettingMgrService; - final private TubeholderExSettingMgr tubeholderExSettingMgr; - final private MainFlowCtrlScheduler mainFlowCtrlScheduler; - final private ProjInfoMgrService projInfoMgrService; - - /** - * 开始测试 - * @param - * @throws AppException - */ - public void startTest() throws AppException { -// /* - // * 检查当前是否有其他项目正在进行测试 - // */ - // BeforeDoEngineerActionChecker.check(); - // /* - // * 核对试管配置是否符合要求 - // */ - // TubeHolderSetting tubeHolderSetting = tubeHolderSettingMgrService.getThelastActiveTubeHolderSetting(); - // if (tubeHolderSetting == null) { - // throw AppException.of(A8kEcode.APPE_TUBEHOLDER_SETTING_ERROR, "缺少试管配置"); - // } - // - // for (TubeSetting tubeSetting : tubeHolderSetting.tubeSettings) { - // for (Integer projId : tubeSetting.projId) { - // if (projId != 1) { - // throw AppException.of(A8kEcode.APPE_TUBEHOLDER_SETTING_ERROR, "目前只支持HsCrp项目"); - // } - // } - // } - // - // - // /* - // * 核对耗材数量是否足够 - // */ - // int testTotalTimes = 0; - // for (TubeSetting tubeSetting : tubeHolderSetting.tubeSettings) { - // for (Integer ignored : tubeSetting.projId) { - // testTotalTimes += tubeholderExSettingMgr.getTubeExConfig().tubeExConfigs.get(tubeSetting.tubeIndex).repeatTimes; - // } - // } - // Integer consumableNum = consumablesMgrService.getConsumableNum(projInfoMgrService.getProjBuildInInfo(1)); - // if (consumableNum < testTotalTimes) { - // throw AppException.of(A8kEcode.APPE_CONSUME_NOT_ENOUGH, - // String.format("反应板,当前剩余:%d,需要:%d",consumableNum, testTotalTimes)); - // } - // if (!consumablesMgrService.isHasEnoughTips((int) (testTotalTimes * 1.2))) { - // throw AppException.of(A8kEcode.APPE_TIP_NOT_ENOUGH, - // String.format("Tip不足,需要:%d", (int) (testTotalTimes * 1.2))); - // } - // - // - // log.info("开始试剂实验一致性检测"); - // tubeholderExSettingMgr.setEnabled(true); - // mainFlowCtrlScheduler.startWork(() -> { - // log.info("试剂实验一致性检测工作线程结束"); - // tubeholderExSettingMgr.setEnabled(false); - // }); - - } - - -} diff --git a/src/main/java/a8k/app/engineer_service/qatest/LiquidAbsorptionAndDistributionTestService.java b/src/main/java/a8k/app/engineer_service/qatest/LiquidAbsorptionAndDistributionTestService.java deleted file mode 100644 index 5277cad..0000000 --- a/src/main/java/a8k/app/engineer_service/qatest/LiquidAbsorptionAndDistributionTestService.java +++ /dev/null @@ -1,160 +0,0 @@ -package a8k.app.engineer_service.qatest; - -import a8k.app.engineer_service.executor.EngineerModeActionExecutor; -import a8k.app.engineer_service.utils.BeforeDoEngineerActionChecker; -import a8k.app.iflytophald.driver.PipetteCtrlDriverV2; -import a8k.app.iflytophald.type.protocol.pipette_module.DistribuType; -import a8k.app.iflytophald.type.protocol.pipette_module.cpyidx.ContainerCpyId; -import a8k.app.iflytophald.type.protocol.pipette_module.cpyidx.LiquidConfigCpyIdx; -import a8k.app.iflytophald.type.protocol.pipette_module.param.AspirationParam; -import a8k.app.iflytophald.type.protocol.pipette_module.param.DistribuAllParam; -import a8k.app.service.lowerctrl.*; -import a8k.app.service.ctrlmodule.TipOperationCtrlModule; -import a8k.app.service.param.hbotpos.HbotLargeBottleBSPosMgr; -import a8k.app.service.utils.UISender; -import a8k.app.type.a8k.ConsumableGroup; -import a8k.app.type.a8k.Pos3d; -import a8k.app.type.exception.AppException; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -/* - * - * 试剂实验一致性检测 - * - * 目的: - * 1. 用于在行检中测试不同浓度的样本,多次检测后,结果的一致性是否满足要求 - * - */ -@Component -@Slf4j -@RequiredArgsConstructor -public class LiquidAbsorptionAndDistributionTestService { - //TODO:Complete - public static class Config { - public Boolean takeTipEachTime = false; - } - - final private EngineerModeActionExecutor actionExecutor; - - /* - * 状态管理器 - */ - final private HbotMoveExCtrlService hbotMoveExCtrlService; - - final private TipOperationCtrlModule tipOperationCtrlModule; - final private PipetteCtrlDriverV2 pipetteCtrlDriverV2; - - final private HbotMoveCtrlService hbotMoveCtrlService; - final private HbotLargeBottleBSPosMgr hbotLargeBottleBSPosMgr; - - - Config config = new Config(); - - - synchronized public Config getConfig() { - return config; - } - - /** - * 更新配置 - * @param config 配置 - */ - synchronized public void submitConfig(Config config) { - if (config == null) { - log.error("配置错误"); - return; - } - this.config = config; - log.info("更新配置 "); - log.info(" takeTipEachTime: {}", config.takeTipEachTime); - if (config.takeTipEachTime == null) { - config.takeTipEachTime = false; - } - } - - synchronized public void setTakeTipEachTime(boolean takeTipEachTime) { - config.takeTipEachTime = takeTipEachTime; - } - - /** - * 吸取并分配液体 - * @param ul ul - * @throws AppException appE - */ - public void absorbAndDistribute(Integer ul) throws AppException { - log.info("吸取并分配液体 {}", ul); - /* - * 检查当前是否有其他项目正在进行测试 - */ - BeforeDoEngineerActionChecker.check(); - - actionExecutor.start(() -> { - - try { - actionExecutor.docmd("移液", () -> { - - - tipOperationCtrlModule.tryTakeTip(); - - Pos3d LBBSPos1 = hbotLargeBottleBSPosMgr.getPos(ConsumableGroup.CG1); - Pos3d LBBSPos6 = hbotLargeBottleBSPosMgr.getPos(ConsumableGroup.CG6); - - hbotMoveExCtrlService.moveToXY(LBBSPos1); - pipetteCtrlDriverV2.aspirateBlock(new AspirationParam( - ul * 10, - LBBSPos1.z, - ContainerCpyId.LargeBufferCup, - LiquidConfigCpyIdx.Default, - 0, - 1, - 0, - -1, - 0, - 0, - 0, - 0 - )); - - hbotMoveExCtrlService.moveToXY(LBBSPos6); - pipetteCtrlDriverV2.distributeAllBlock(new DistribuAllParam( - LBBSPos1.z, - ContainerCpyId.LargeBufferCup, - LiquidConfigCpyIdx.Default, - true, - DistribuType.JET_DIST, - 0, - 0, - true - )); - - if (config.takeTipEachTime) - tipOperationCtrlModule.dropTip(); - - hbotMoveExCtrlService.moveQuickToZero(); - }); - - } catch (AppException e) { - UISender.txErrorPrompt(e); - } - }); - } - - /** - * 丢TIP - * @throws AppException appE - */ - public void dropTipBlock() throws AppException { - BeforeDoEngineerActionChecker.check(); - actionExecutor.start(() -> { - try { - actionExecutor.docmd("丢TIP", tipOperationCtrlModule::dropTip); - } catch (AppException e) { - UISender.txErrorMsg(log, e, "丢TIP执行失败"); - } - }); - } - - -} diff --git a/src/main/java/a8k/app/engineer_service/qatest/QATemperatureCtrlTestService.java b/src/main/java/a8k/app/engineer_service/qatest/QATemperatureCtrlTestService.java deleted file mode 100644 index 5970434..0000000 --- a/src/main/java/a8k/app/engineer_service/qatest/QATemperatureCtrlTestService.java +++ /dev/null @@ -1,77 +0,0 @@ -package a8k.app.engineer_service.qatest; - -import a8k.app.service.background.SensorDataUpdateService; -import a8k.app.service.background.TemperatureCtrlService; -import a8k.app.service.setting.AppSettingsMgrService; -import a8k.app.service.statemgr.GStateMgrService; -import a8k.app.type.TemperatureRecordPoint; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.List; - -/* - * - * 温度控制测试服务 - * - */ -@Component -@Slf4j -@RequiredArgsConstructor -public class QATemperatureCtrlTestService { - private final TemperatureCtrlService temperatureCtrlService; - private final AppSettingsMgrService appSettingsMgrService; - private final SensorDataUpdateService sensorDataUpdateService; - private final GStateMgrService gStateMgrService; - - - /** - * 修改温度控制目标温度 - */ - synchronized public void setTargetVal(Integer targetIncubatorBoxTemperature, Integer targetPlatesBoxTemperature) { - log.info("changeTemperatureCtrlTargetVal: targetIncubatorBoxTemperature = {}, targetPlatesBoxTemperature = {}", targetIncubatorBoxTemperature, targetPlatesBoxTemperature); - appSettingsMgrService.setIncubateBoxTemperature(targetIncubatorBoxTemperature); - appSettingsMgrService.setPlateBoxTemperature(targetPlatesBoxTemperature); - } - - /** - * 获取孵育盘目标温度 - * @return temp - */ - synchronized public Integer getIncubateBoxTargetTemperature() { - return temperatureCtrlService.getTargetIncubatorTemperatureSetVal(); - } - - /** - * 获取板夹仓目标温度 - * @return temp - */ - synchronized public Integer getPlateBoxTargetTemperature() { - return temperatureCtrlService.getTargetPlatesBoxTemperatureSetVal(); - } - - synchronized public Double getIncubateBoxTemp() { - return sensorDataUpdateService.getIncubateBoxTemperature(); - } - - synchronized public Double getPlateBoxTemp() { - return sensorDataUpdateService.getPlateBoxTemperature(); - } - - /** - * 获取孵育盘温度曲线 - * @return curve - */ - synchronized public List getIncubateBoxTemperatureCurve() { - return sensorDataUpdateService.getIncubateBoxTemperatureCurve(); - } - - /** - * 获取板夹仓温度曲线 - * @return curve - */ - synchronized public List getPlateBoxTemperatureCurve() { - return sensorDataUpdateService.getPlateBoxTemperatureCurve(); - } -} diff --git a/src/main/java/a8k/app/engineer_service/state/EngineerModeStateMgrService.java b/src/main/java/a8k/app/engineer_service/state/EngineerModeStateMgrService.java deleted file mode 100644 index 46d0168..0000000 --- a/src/main/java/a8k/app/engineer_service/state/EngineerModeStateMgrService.java +++ /dev/null @@ -1,25 +0,0 @@ -package a8k.app.engineer_service.state; - - -import a8k.app.engineer_service.type.EngineerModeState; -import a8k.app.engineer_service.type.EngineerWorkState; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -@RequiredArgsConstructor -public class EngineerModeStateMgrService { - EngineerModeState state = new EngineerModeState(); - - synchronized public EngineerModeState getState() { - return state; - } - - synchronized public void setEngineerWorkState(EngineerWorkState engineerWorkState) { - state.engineerWorkState = engineerWorkState; - } - - -} diff --git a/src/main/java/a8k/app/engineer_service/state/TubeholderExSettingMgr.java b/src/main/java/a8k/app/engineer_service/state/TubeholderExSettingMgr.java deleted file mode 100644 index 85a19e1..0000000 --- a/src/main/java/a8k/app/engineer_service/state/TubeholderExSettingMgr.java +++ /dev/null @@ -1,34 +0,0 @@ -package a8k.app.engineer_service.state; - -import a8k.app.engineer_service.type.TubeHolderExConfig; -import a8k.app.utils.ZJsonHelper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@RequiredArgsConstructor -@Slf4j -public class TubeholderExSettingMgr { - private TubeHolderExConfig tubeHolderExConfig = new TubeHolderExConfig(); - - synchronized public void submitTubeExConfig(TubeHolderExConfig tubeExTubeHolderExConfig) { - if (tubeExTubeHolderExConfig != null) { - this.tubeHolderExConfig = tubeExTubeHolderExConfig; - } - log.info("更新试管架配置 {}", ZJsonHelper.objectToJson(tubeHolderExConfig)); - } - - synchronized public TubeHolderExConfig getTubeExConfig() { - return tubeHolderExConfig; - } - - synchronized public void setEnabled(Boolean enabled) { - this.tubeHolderExConfig.enable = enabled; - log.info("设置试管架配置使能状态 {}", enabled); - } - - synchronized public Boolean isEnabled() { - return this.tubeHolderExConfig.enable; - } -} diff --git a/src/main/java/a8k/app/engineer_service/type/A8kCmdRunnable.java b/src/main/java/a8k/app/engineer_service/type/A8kCmdRunnable.java deleted file mode 100644 index f3c6fbc..0000000 --- a/src/main/java/a8k/app/engineer_service/type/A8kCmdRunnable.java +++ /dev/null @@ -1,8 +0,0 @@ -package a8k.app.engineer_service.type; - -import a8k.app.type.exception.AppException; - -@FunctionalInterface -public interface A8kCmdRunnable { - void run() throws AppException; -} diff --git a/src/main/java/a8k/app/engineer_service/type/EngineerActionType.java b/src/main/java/a8k/app/engineer_service/type/EngineerActionType.java deleted file mode 100644 index 736818d..0000000 --- a/src/main/java/a8k/app/engineer_service/type/EngineerActionType.java +++ /dev/null @@ -1,2 +0,0 @@ -package a8k.app.engineer_service.type; - diff --git a/src/main/java/a8k/app/engineer_service/type/EngineerModeState.java b/src/main/java/a8k/app/engineer_service/type/EngineerModeState.java deleted file mode 100644 index 718a89f..0000000 --- a/src/main/java/a8k/app/engineer_service/type/EngineerModeState.java +++ /dev/null @@ -1,7 +0,0 @@ -package a8k.app.engineer_service.type; - - -public class EngineerModeState { - public EngineerWorkState engineerWorkState = EngineerWorkState.IDLE; - -} diff --git a/src/main/java/a8k/app/engineer_service/type/EngineerWorkState.java b/src/main/java/a8k/app/engineer_service/type/EngineerWorkState.java deleted file mode 100644 index b71c995..0000000 --- a/src/main/java/a8k/app/engineer_service/type/EngineerWorkState.java +++ /dev/null @@ -1,6 +0,0 @@ -package a8k.app.engineer_service.type; - -public enum EngineerWorkState { - IDLE, - WORKING, -} diff --git a/src/main/java/a8k/app/engineer_service/type/TubeExConfig.java b/src/main/java/a8k/app/engineer_service/type/TubeExConfig.java deleted file mode 100644 index 9f381cc..0000000 --- a/src/main/java/a8k/app/engineer_service/type/TubeExConfig.java +++ /dev/null @@ -1,5 +0,0 @@ -package a8k.app.engineer_service.type; - -public class TubeExConfig { - public Integer repeatTimes = 1; -} diff --git a/src/main/java/a8k/app/engineer_service/type/TubeHolderExConfig.java b/src/main/java/a8k/app/engineer_service/type/TubeHolderExConfig.java deleted file mode 100644 index 951b1f8..0000000 --- a/src/main/java/a8k/app/engineer_service/type/TubeHolderExConfig.java +++ /dev/null @@ -1,19 +0,0 @@ -package a8k.app.engineer_service.type; - -import a8k.app.constant.AppConstant; -import lombok.Data; - -import java.util.ArrayList; -import java.util.List; - -@Data -public class TubeHolderExConfig { - public List tubeExConfigs = new ArrayList<>(); - public Boolean enable = true; - - public TubeHolderExConfig() { - for (int i = 0; i < AppConstant.TUBEHOLER_SIZE; i++) { - tubeExConfigs.add(new TubeExConfig()); - } - } -} diff --git a/src/main/java/a8k/app/engineer_service/utils/BeforeDoEngineerActionChecker.java b/src/main/java/a8k/app/engineer_service/utils/BeforeDoEngineerActionChecker.java deleted file mode 100644 index c8cc732..0000000 --- a/src/main/java/a8k/app/engineer_service/utils/BeforeDoEngineerActionChecker.java +++ /dev/null @@ -1,47 +0,0 @@ -package a8k.app.engineer_service.utils; - - -import a8k.SpringBootBeanUtil; -import a8k.app.engineer_service.state.EngineerModeStateMgrService; -import a8k.app.engineer_service.type.EngineerWorkState; -import a8k.app.iflytophald.type.protocol.A8kEcode; -import a8k.app.service.statemgr.DeviceWorkStateMgrService; -import a8k.app.service.statemgr.GStateMgrService; -import a8k.app.type.a8k.state.enumtype.A8kWorkState; -import a8k.app.type.exception.AppException; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; - -@RequiredArgsConstructor -@Component -public class BeforeDoEngineerActionChecker { - final private EngineerModeStateMgrService engineerModeStateMgrService; - final private DeviceWorkStateMgrService deviceWorkStateMgrService; - final private GStateMgrService gStateMgrService; - - void checkImpl() throws AppException { - /* - * 检查当前是否有其他项目正在进行测试 - */ - if (!gStateMgrService.isDeviceInited()) { - throw AppException.of(A8kEcode.DEVICE_NOT_INIT); - } - - if (engineerModeStateMgrService.getState().equals(EngineerWorkState.WORKING)) { - throw AppException.of(A8kEcode.DEVICE_IS_BUSY, "当前正执行其他工程师模式下的动作"); - } - - if (!deviceWorkStateMgrService.getDeviceWorkState().workState.equals(A8kWorkState.IDLE)) { - throw AppException.of(A8kEcode.DEVICE_IS_BUSY, "当前正在测试中"); - } - - if (gStateMgrService.isFatalError()) { - throw AppException.of(A8kEcode.APPE_DEVICE_IS_IN_FATAL_ERROR, "设备处于致命错误状态,请尝试重新初始化设备,或者重启设备"); - } - - } - - public static void check() throws AppException { - SpringBootBeanUtil.getBean(BeforeDoEngineerActionChecker.class).checkImpl(); - } -} diff --git a/src/main/java/a8k/app/service/engineer/executor/EngineerModeActionExecutor.java b/src/main/java/a8k/app/service/engineer/executor/EngineerModeActionExecutor.java new file mode 100644 index 0000000..704b057 --- /dev/null +++ b/src/main/java/a8k/app/service/engineer/executor/EngineerModeActionExecutor.java @@ -0,0 +1,124 @@ +package a8k.app.service.engineer.executor; + +import a8k.OS; +import a8k.app.service.engineer.state.EngineerModeStateMgrService; +import a8k.app.service.engineer.type.EngineerWorkState; +import a8k.app.service.engineer.type.A8kCmdRunnable; +import a8k.app.service.statemgr.DeviceWorkStateMgrService; +import a8k.app.service.statemgr.GStateMgrService; +import a8k.app.type.DeviceRunMode; +import a8k.app.type.a8k.state.enumtype.A8kWorkState; +import a8k.app.type.a8k.state.enumtype.A8kWorkTaskType; +import a8k.app.type.exception.AppException; +import a8k.app.type.exception.EngineerTaskBreakException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 工程师模式下的动作执行器 + * + * 存在目的: + * 1. 由于当前设备 + * + */ + + +@Component +@Slf4j +@RequiredArgsConstructor +public class EngineerModeActionExecutor { + + @FunctionalInterface + public interface Action { + void run(); + } + + private final EngineerModeStateMgrService stateMgr; + private final GStateMgrService gStateMgrService; + private final DeviceWorkStateMgrService deviceWorkStateMgrService; + + + Boolean stoppingFlag = false; + Boolean isWorking = false; + ThreadPoolExecutor executor = + new ThreadPoolExecutor(1, 1, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(1)); + + synchronized public void start(Action action) { + if (isWorking) + stoppingFlag = true; + + while (isWorking) { + OS.hsleep(100); + log.info("Waiting for the previous action to finish..."); + } + + stoppingFlag = false; + deviceWorkStateMgrService.setStartActionPending(A8kWorkTaskType.EngineerTask, true); + executor.submit(() -> { + try { + deviceWorkStateMgrService.clearPending(); + deviceWorkStateMgrService.updateWorkState(A8kWorkState.WORKING); + stateMgr.setEngineerWorkState(EngineerWorkState.WORKING); + isWorking = true; + action.run(); + } catch (EngineerTaskBreakException e) { + log.info("action was interrupted"); + } catch (Exception e) { + log.error("Error in action execution", e); + } + stateMgr.setEngineerWorkState(EngineerWorkState.IDLE); + deviceWorkStateMgrService.updateWorkState(A8kWorkState.IDLE); + isWorking = false; + }); + } + + synchronized public void stop() { + log.info("Stopping action..."); + stoppingFlag = true; + deviceWorkStateMgrService.setStopActionPending(true); + while (isWorking) { + OS.hsleep(1000); + log.info("Waiting for the action to stop..."); + } + deviceWorkStateMgrService.clearPending(); + stoppingFlag = false; + } + + public void sleep(int ms) { + if (stoppingFlag) { + throw new EngineerTaskBreakException(); + } + OS.hsleep(ms); + } + + public Boolean isStopping() { + return stoppingFlag; + } + + + public void docmd(String mark, A8kCmdRunnable runnable, A8kCmdRunnable virtualRunable) throws AppException { + log.info("DO {}", mark); + if (gStateMgrService.isInMode(DeviceRunMode.RealMode)) { + runnable.run(); + } else { + virtualRunable.run(); + } + } + + public void docmd(String mark, A8kCmdRunnable runnable) throws AppException { + docmd(mark, runnable, () -> { + sleep(1000); + }); + } + + public boolean isInRealMode() { + return gStateMgrService.isInMode(DeviceRunMode.RealMode); + } + + +} diff --git a/src/main/java/a8k/app/service/engineer/qatest/EngineerModeActionCtrlService.java b/src/main/java/a8k/app/service/engineer/qatest/EngineerModeActionCtrlService.java new file mode 100644 index 0000000..953a7e9 --- /dev/null +++ b/src/main/java/a8k/app/service/engineer/qatest/EngineerModeActionCtrlService.java @@ -0,0 +1,18 @@ +package a8k.app.service.engineer.qatest; + +import a8k.app.service.engineer.executor.EngineerModeActionExecutor; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class EngineerModeActionCtrlService { + private final EngineerModeActionExecutor executor; + + public void stop() { + executor.stop(); + } + +} diff --git a/src/main/java/a8k/app/service/engineer/qatest/ExperimentConsistencyTestingService.java b/src/main/java/a8k/app/service/engineer/qatest/ExperimentConsistencyTestingService.java new file mode 100644 index 0000000..5f1c756 --- /dev/null +++ b/src/main/java/a8k/app/service/engineer/qatest/ExperimentConsistencyTestingService.java @@ -0,0 +1,91 @@ +package a8k.app.service.engineer.qatest; + +import a8k.app.service.engineer.state.TubeholderExSettingMgr; +import a8k.app.service.data.ProjInfoMgrService; +import a8k.app.service.mainctrl.MainFlowCtrlScheduler; +import a8k.app.service.mainctrl.TubeHolderSettingMgrService; +import a8k.app.service.statemgr.*; +import a8k.app.type.exception.AppException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/* + * + * 试剂实验一致性检测 + * + * 目的: + * 1. 用于在行检中测试不同浓度的样本,多次检测后,结果的一致性是否满足要求 + * + */ +@Component +@Slf4j +@RequiredArgsConstructor +public class ExperimentConsistencyTestingService { + /* + * 状态管理器 + */ + final private ConsumablesMgrService consumablesMgrService; + final private TubeHolderSettingMgrService tubeHolderSettingMgrService; + final private TubeholderExSettingMgr tubeholderExSettingMgr; + final private MainFlowCtrlScheduler mainFlowCtrlScheduler; + final private ProjInfoMgrService projInfoMgrService; + + /** + * 开始测试 + * @param + * @throws AppException + */ + public void startTest() throws AppException { +// /* + // * 检查当前是否有其他项目正在进行测试 + // */ + // BeforeDoEngineerActionChecker.check(); + // /* + // * 核对试管配置是否符合要求 + // */ + // TubeHolderSetting tubeHolderSetting = tubeHolderSettingMgrService.getThelastActiveTubeHolderSetting(); + // if (tubeHolderSetting == null) { + // throw AppException.of(A8kEcode.APPE_TUBEHOLDER_SETTING_ERROR, "缺少试管配置"); + // } + // + // for (TubeSetting tubeSetting : tubeHolderSetting.tubeSettings) { + // for (Integer projId : tubeSetting.projId) { + // if (projId != 1) { + // throw AppException.of(A8kEcode.APPE_TUBEHOLDER_SETTING_ERROR, "目前只支持HsCrp项目"); + // } + // } + // } + // + // + // /* + // * 核对耗材数量是否足够 + // */ + // int testTotalTimes = 0; + // for (TubeSetting tubeSetting : tubeHolderSetting.tubeSettings) { + // for (Integer ignored : tubeSetting.projId) { + // testTotalTimes += tubeholderExSettingMgr.getTubeExConfig().tubeExConfigs.get(tubeSetting.tubeIndex).repeatTimes; + // } + // } + // Integer consumableNum = consumablesMgrService.getConsumableNum(projInfoMgrService.getProjBuildInInfo(1)); + // if (consumableNum < testTotalTimes) { + // throw AppException.of(A8kEcode.APPE_CONSUME_NOT_ENOUGH, + // String.format("反应板,当前剩余:%d,需要:%d",consumableNum, testTotalTimes)); + // } + // if (!consumablesMgrService.isHasEnoughTips((int) (testTotalTimes * 1.2))) { + // throw AppException.of(A8kEcode.APPE_TIP_NOT_ENOUGH, + // String.format("Tip不足,需要:%d", (int) (testTotalTimes * 1.2))); + // } + // + // + // log.info("开始试剂实验一致性检测"); + // tubeholderExSettingMgr.setEnabled(true); + // mainFlowCtrlScheduler.startWork(() -> { + // log.info("试剂实验一致性检测工作线程结束"); + // tubeholderExSettingMgr.setEnabled(false); + // }); + + } + + +} diff --git a/src/main/java/a8k/app/service/engineer/qatest/LiquidAbsorptionAndDistributionTestService.java b/src/main/java/a8k/app/service/engineer/qatest/LiquidAbsorptionAndDistributionTestService.java new file mode 100644 index 0000000..dc55b2a --- /dev/null +++ b/src/main/java/a8k/app/service/engineer/qatest/LiquidAbsorptionAndDistributionTestService.java @@ -0,0 +1,160 @@ +package a8k.app.service.engineer.qatest; + +import a8k.app.service.engineer.executor.EngineerModeActionExecutor; +import a8k.app.service.engineer.utils.BeforeDoEngineerActionChecker; +import a8k.app.iflytophald.driver.PipetteCtrlDriverV2; +import a8k.app.iflytophald.type.protocol.pipette_module.DistribuType; +import a8k.app.iflytophald.type.protocol.pipette_module.cpyidx.ContainerCpyId; +import a8k.app.iflytophald.type.protocol.pipette_module.cpyidx.LiquidConfigCpyIdx; +import a8k.app.iflytophald.type.protocol.pipette_module.param.AspirationParam; +import a8k.app.iflytophald.type.protocol.pipette_module.param.DistribuAllParam; +import a8k.app.service.lowerctrl.*; +import a8k.app.service.ctrlmodule.TipOperationCtrlModule; +import a8k.app.service.param.hbotpos.HbotLargeBottleBSPosMgr; +import a8k.app.service.utils.UISender; +import a8k.app.type.a8k.ConsumableGroup; +import a8k.app.type.a8k.Pos3d; +import a8k.app.type.exception.AppException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/* + * + * 试剂实验一致性检测 + * + * 目的: + * 1. 用于在行检中测试不同浓度的样本,多次检测后,结果的一致性是否满足要求 + * + */ +@Component +@Slf4j +@RequiredArgsConstructor +public class LiquidAbsorptionAndDistributionTestService { + //TODO:Complete + public static class Config { + public Boolean takeTipEachTime = false; + } + + final private EngineerModeActionExecutor actionExecutor; + + /* + * 状态管理器 + */ + final private HbotMoveExCtrlService hbotMoveExCtrlService; + + final private TipOperationCtrlModule tipOperationCtrlModule; + final private PipetteCtrlDriverV2 pipetteCtrlDriverV2; + + final private HbotMoveCtrlService hbotMoveCtrlService; + final private HbotLargeBottleBSPosMgr hbotLargeBottleBSPosMgr; + + + Config config = new Config(); + + + synchronized public Config getConfig() { + return config; + } + + /** + * 更新配置 + * @param config 配置 + */ + synchronized public void submitConfig(Config config) { + if (config == null) { + log.error("配置错误"); + return; + } + this.config = config; + log.info("更新配置 "); + log.info(" takeTipEachTime: {}", config.takeTipEachTime); + if (config.takeTipEachTime == null) { + config.takeTipEachTime = false; + } + } + + synchronized public void setTakeTipEachTime(boolean takeTipEachTime) { + config.takeTipEachTime = takeTipEachTime; + } + + /** + * 吸取并分配液体 + * @param ul ul + * @throws AppException appE + */ + public void absorbAndDistribute(Integer ul) throws AppException { + log.info("吸取并分配液体 {}", ul); + /* + * 检查当前是否有其他项目正在进行测试 + */ + BeforeDoEngineerActionChecker.check(); + + actionExecutor.start(() -> { + + try { + actionExecutor.docmd("移液", () -> { + + + tipOperationCtrlModule.tryTakeTip(); + + Pos3d LBBSPos1 = hbotLargeBottleBSPosMgr.getPos(ConsumableGroup.CG1); + Pos3d LBBSPos6 = hbotLargeBottleBSPosMgr.getPos(ConsumableGroup.CG6); + + hbotMoveExCtrlService.moveToXY(LBBSPos1); + pipetteCtrlDriverV2.aspirateBlock(new AspirationParam( + ul * 10, + LBBSPos1.z, + ContainerCpyId.LargeBufferCup, + LiquidConfigCpyIdx.Default, + 0, + 1, + 0, + -1, + 0, + 0, + 0, + 0 + )); + + hbotMoveExCtrlService.moveToXY(LBBSPos6); + pipetteCtrlDriverV2.distributeAllBlock(new DistribuAllParam( + LBBSPos1.z, + ContainerCpyId.LargeBufferCup, + LiquidConfigCpyIdx.Default, + true, + DistribuType.JET_DIST, + 0, + 0, + true + )); + + if (config.takeTipEachTime) + tipOperationCtrlModule.dropTip(); + + hbotMoveExCtrlService.moveQuickToZero(); + }); + + } catch (AppException e) { + UISender.txErrorPrompt(e); + } + }); + } + + /** + * 丢TIP + * @throws AppException appE + */ + public void dropTipBlock() throws AppException { + BeforeDoEngineerActionChecker.check(); + actionExecutor.start(() -> { + try { + actionExecutor.docmd("丢TIP", tipOperationCtrlModule::dropTip); + } catch (AppException e) { + UISender.txErrorMsg(log, e, "丢TIP执行失败"); + } + }); + } + + +} diff --git a/src/main/java/a8k/app/service/engineer/qatest/QATemperatureCtrlTestService.java b/src/main/java/a8k/app/service/engineer/qatest/QATemperatureCtrlTestService.java new file mode 100644 index 0000000..154e503 --- /dev/null +++ b/src/main/java/a8k/app/service/engineer/qatest/QATemperatureCtrlTestService.java @@ -0,0 +1,77 @@ +package a8k.app.service.engineer.qatest; + +import a8k.app.service.background.SensorDataUpdateService; +import a8k.app.service.background.TemperatureCtrlService; +import a8k.app.service.setting.AppSettingsMgrService; +import a8k.app.service.statemgr.GStateMgrService; +import a8k.app.type.TemperatureRecordPoint; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.List; + +/* + * + * 温度控制测试服务 + * + */ +@Component +@Slf4j +@RequiredArgsConstructor +public class QATemperatureCtrlTestService { + private final TemperatureCtrlService temperatureCtrlService; + private final AppSettingsMgrService appSettingsMgrService; + private final SensorDataUpdateService sensorDataUpdateService; + private final GStateMgrService gStateMgrService; + + + /** + * 修改温度控制目标温度 + */ + synchronized public void setTargetVal(Integer targetIncubatorBoxTemperature, Integer targetPlatesBoxTemperature) { + log.info("changeTemperatureCtrlTargetVal: targetIncubatorBoxTemperature = {}, targetPlatesBoxTemperature = {}", targetIncubatorBoxTemperature, targetPlatesBoxTemperature); + appSettingsMgrService.setIncubateBoxTemperature(targetIncubatorBoxTemperature); + appSettingsMgrService.setPlateBoxTemperature(targetPlatesBoxTemperature); + } + + /** + * 获取孵育盘目标温度 + * @return temp + */ + synchronized public Integer getIncubateBoxTargetTemperature() { + return temperatureCtrlService.getTargetIncubatorTemperatureSetVal(); + } + + /** + * 获取板夹仓目标温度 + * @return temp + */ + synchronized public Integer getPlateBoxTargetTemperature() { + return temperatureCtrlService.getTargetPlatesBoxTemperatureSetVal(); + } + + synchronized public Double getIncubateBoxTemp() { + return sensorDataUpdateService.getIncubateBoxTemperature(); + } + + synchronized public Double getPlateBoxTemp() { + return sensorDataUpdateService.getPlateBoxTemperature(); + } + + /** + * 获取孵育盘温度曲线 + * @return curve + */ + synchronized public List getIncubateBoxTemperatureCurve() { + return sensorDataUpdateService.getIncubateBoxTemperatureCurve(); + } + + /** + * 获取板夹仓温度曲线 + * @return curve + */ + synchronized public List getPlateBoxTemperatureCurve() { + return sensorDataUpdateService.getPlateBoxTemperatureCurve(); + } +} diff --git a/src/main/java/a8k/app/service/engineer/state/EngineerModeStateMgrService.java b/src/main/java/a8k/app/service/engineer/state/EngineerModeStateMgrService.java new file mode 100644 index 0000000..7101070 --- /dev/null +++ b/src/main/java/a8k/app/service/engineer/state/EngineerModeStateMgrService.java @@ -0,0 +1,25 @@ +package a8k.app.service.engineer.state; + + +import a8k.app.service.engineer.type.EngineerModeState; +import a8k.app.service.engineer.type.EngineerWorkState; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@RequiredArgsConstructor +public class EngineerModeStateMgrService { + EngineerModeState state = new EngineerModeState(); + + synchronized public EngineerModeState getState() { + return state; + } + + synchronized public void setEngineerWorkState(EngineerWorkState engineerWorkState) { + state.engineerWorkState = engineerWorkState; + } + + +} diff --git a/src/main/java/a8k/app/service/engineer/state/TubeholderExSettingMgr.java b/src/main/java/a8k/app/service/engineer/state/TubeholderExSettingMgr.java new file mode 100644 index 0000000..100b010 --- /dev/null +++ b/src/main/java/a8k/app/service/engineer/state/TubeholderExSettingMgr.java @@ -0,0 +1,34 @@ +package a8k.app.service.engineer.state; + +import a8k.app.service.engineer.type.TubeHolderExConfig; +import a8k.app.utils.ZJsonHelper; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +@Slf4j +public class TubeholderExSettingMgr { + private TubeHolderExConfig tubeHolderExConfig = new TubeHolderExConfig(); + + synchronized public void submitTubeExConfig(TubeHolderExConfig tubeExTubeHolderExConfig) { + if (tubeExTubeHolderExConfig != null) { + this.tubeHolderExConfig = tubeExTubeHolderExConfig; + } + log.info("更新试管架配置 {}", ZJsonHelper.objectToJson(tubeHolderExConfig)); + } + + synchronized public TubeHolderExConfig getTubeExConfig() { + return tubeHolderExConfig; + } + + synchronized public void setEnabled(Boolean enabled) { + this.tubeHolderExConfig.enable = enabled; + log.info("设置试管架配置使能状态 {}", enabled); + } + + synchronized public Boolean isEnabled() { + return this.tubeHolderExConfig.enable; + } +} diff --git a/src/main/java/a8k/app/service/engineer/type/A8kCmdRunnable.java b/src/main/java/a8k/app/service/engineer/type/A8kCmdRunnable.java new file mode 100644 index 0000000..10a2248 --- /dev/null +++ b/src/main/java/a8k/app/service/engineer/type/A8kCmdRunnable.java @@ -0,0 +1,8 @@ +package a8k.app.service.engineer.type; + +import a8k.app.type.exception.AppException; + +@FunctionalInterface +public interface A8kCmdRunnable { + void run() throws AppException; +} diff --git a/src/main/java/a8k/app/service/engineer/type/EngineerActionType.java b/src/main/java/a8k/app/service/engineer/type/EngineerActionType.java new file mode 100644 index 0000000..017b204 --- /dev/null +++ b/src/main/java/a8k/app/service/engineer/type/EngineerActionType.java @@ -0,0 +1,2 @@ +package a8k.app.service.engineer.type; + diff --git a/src/main/java/a8k/app/service/engineer/type/EngineerModeState.java b/src/main/java/a8k/app/service/engineer/type/EngineerModeState.java new file mode 100644 index 0000000..6c43c03 --- /dev/null +++ b/src/main/java/a8k/app/service/engineer/type/EngineerModeState.java @@ -0,0 +1,7 @@ +package a8k.app.service.engineer.type; + + +public class EngineerModeState { + public EngineerWorkState engineerWorkState = EngineerWorkState.IDLE; + +} diff --git a/src/main/java/a8k/app/service/engineer/type/EngineerWorkState.java b/src/main/java/a8k/app/service/engineer/type/EngineerWorkState.java new file mode 100644 index 0000000..c2c3145 --- /dev/null +++ b/src/main/java/a8k/app/service/engineer/type/EngineerWorkState.java @@ -0,0 +1,6 @@ +package a8k.app.service.engineer.type; + +public enum EngineerWorkState { + IDLE, + WORKING, +} diff --git a/src/main/java/a8k/app/service/engineer/type/TubeExConfig.java b/src/main/java/a8k/app/service/engineer/type/TubeExConfig.java new file mode 100644 index 0000000..ceebc8c --- /dev/null +++ b/src/main/java/a8k/app/service/engineer/type/TubeExConfig.java @@ -0,0 +1,5 @@ +package a8k.app.service.engineer.type; + +public class TubeExConfig { + public Integer repeatTimes = 1; +} diff --git a/src/main/java/a8k/app/service/engineer/type/TubeHolderExConfig.java b/src/main/java/a8k/app/service/engineer/type/TubeHolderExConfig.java new file mode 100644 index 0000000..2f40e51 --- /dev/null +++ b/src/main/java/a8k/app/service/engineer/type/TubeHolderExConfig.java @@ -0,0 +1,19 @@ +package a8k.app.service.engineer.type; + +import a8k.app.constant.AppConstant; +import lombok.Data; + +import java.util.ArrayList; +import java.util.List; + +@Data +public class TubeHolderExConfig { + public List tubeExConfigs = new ArrayList<>(); + public Boolean enable = true; + + public TubeHolderExConfig() { + for (int i = 0; i < AppConstant.TUBEHOLER_SIZE; i++) { + tubeExConfigs.add(new TubeExConfig()); + } + } +} diff --git a/src/main/java/a8k/app/service/engineer/utils/BeforeDoEngineerActionChecker.java b/src/main/java/a8k/app/service/engineer/utils/BeforeDoEngineerActionChecker.java new file mode 100644 index 0000000..5bb6730 --- /dev/null +++ b/src/main/java/a8k/app/service/engineer/utils/BeforeDoEngineerActionChecker.java @@ -0,0 +1,47 @@ +package a8k.app.service.engineer.utils; + + +import a8k.SpringBootBeanUtil; +import a8k.app.service.engineer.state.EngineerModeStateMgrService; +import a8k.app.service.engineer.type.EngineerWorkState; +import a8k.app.iflytophald.type.protocol.A8kEcode; +import a8k.app.service.statemgr.DeviceWorkStateMgrService; +import a8k.app.service.statemgr.GStateMgrService; +import a8k.app.type.a8k.state.enumtype.A8kWorkState; +import a8k.app.type.exception.AppException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@RequiredArgsConstructor +@Component +public class BeforeDoEngineerActionChecker { + final private EngineerModeStateMgrService engineerModeStateMgrService; + final private DeviceWorkStateMgrService deviceWorkStateMgrService; + final private GStateMgrService gStateMgrService; + + void checkImpl() throws AppException { + /* + * 检查当前是否有其他项目正在进行测试 + */ + if (!gStateMgrService.isDeviceInited()) { + throw AppException.of(A8kEcode.DEVICE_NOT_INIT); + } + + if (engineerModeStateMgrService.getState().equals(EngineerWorkState.WORKING)) { + throw AppException.of(A8kEcode.DEVICE_IS_BUSY, "当前正执行其他工程师模式下的动作"); + } + + if (!deviceWorkStateMgrService.getDeviceWorkState().workState.equals(A8kWorkState.IDLE)) { + throw AppException.of(A8kEcode.DEVICE_IS_BUSY, "当前正在测试中"); + } + + if (gStateMgrService.isFatalError()) { + throw AppException.of(A8kEcode.APPE_DEVICE_IS_IN_FATAL_ERROR, "设备处于致命错误状态,请尝试重新初始化设备,或者重启设备"); + } + + } + + public static void check() throws AppException { + SpringBootBeanUtil.getBean(BeforeDoEngineerActionChecker.class).checkImpl(); + } +} diff --git a/src/main/java/a8k/app/service/mainctrl/AppDeviceMainFlowCtrlService.java b/src/main/java/a8k/app/service/mainctrl/AppDeviceMainFlowCtrlService.java index 4628632..4df6f14 100644 --- a/src/main/java/a8k/app/service/mainctrl/AppDeviceMainFlowCtrlService.java +++ b/src/main/java/a8k/app/service/mainctrl/AppDeviceMainFlowCtrlService.java @@ -1,6 +1,6 @@ package a8k.app.service.mainctrl; -import a8k.app.engineer_service.qatest.EngineerModeActionCtrlService; +import a8k.app.service.engineer.qatest.EngineerModeActionCtrlService; import a8k.app.iflytophald.type.protocol.A8kEcode; import a8k.app.service.statemgr.AppFlagStateMgr; import a8k.app.service.statemgr.DeviceWorkStateMgrService; diff --git a/src/main/java/a8k/app/service/mainctrl/MainFlowCtrlScheduler.java b/src/main/java/a8k/app/service/mainctrl/MainFlowCtrlScheduler.java index 2c31e16..0cd6c34 100644 --- a/src/main/java/a8k/app/service/mainctrl/MainFlowCtrlScheduler.java +++ b/src/main/java/a8k/app/service/mainctrl/MainFlowCtrlScheduler.java @@ -1,8 +1,8 @@ package a8k.app.service.mainctrl; import a8k.OS; -import a8k.app.engineer_service.state.EngineerModeStateMgrService; -import a8k.app.engineer_service.type.EngineerWorkState; +import a8k.app.service.engineer.state.EngineerModeStateMgrService; +import a8k.app.service.engineer.type.EngineerWorkState; import a8k.app.service.ctrlmodule.TipOperationCtrlModule; import a8k.app.service.lowerctrl.HbotMoveExCtrlService; import a8k.app.service.lowerctrl.OptScanModuleLowerCtrlService; diff --git a/src/main/java/a8k/app/service/module/InFeedingCtrlModule.java b/src/main/java/a8k/app/service/module/InFeedingCtrlModule.java index 695ff54..48fc36d 100644 --- a/src/main/java/a8k/app/service/module/InFeedingCtrlModule.java +++ b/src/main/java/a8k/app/service/module/InFeedingCtrlModule.java @@ -2,8 +2,8 @@ package a8k.app.service.module; import a8k.OS; import a8k.app.dao.type.db.ReactionRecord; -import a8k.app.engineer_service.state.TubeholderExSettingMgr; -import a8k.app.engineer_service.type.A8kCmdRunnable; +import a8k.app.service.engineer.state.TubeholderExSettingMgr; +import a8k.app.service.engineer.type.A8kCmdRunnable; import a8k.app.factory.AppErrorFactory; import a8k.app.iflytophald.driver.InputDetectDriver; import a8k.app.iflytophald.type.protocol.A8kEcode; diff --git a/src/main/java/a8k/app/service/module/IncubationPlateCtrlModule.java b/src/main/java/a8k/app/service/module/IncubationPlateCtrlModule.java index 7494bb1..a7a843a 100644 --- a/src/main/java/a8k/app/service/module/IncubationPlateCtrlModule.java +++ b/src/main/java/a8k/app/service/module/IncubationPlateCtrlModule.java @@ -1,7 +1,7 @@ package a8k.app.service.module; import a8k.OS; -import a8k.app.engineer_service.type.A8kCmdRunnable; +import a8k.app.service.engineer.type.A8kCmdRunnable; import a8k.app.factory.AppErrorFactory; import a8k.app.service.lowerctrl.OptScanModuleLowerCtrlService; import a8k.app.service.lowerctrl.PlateBoxCtrlService; diff --git a/src/main/java/a8k/app/service/module/OptScanCtrlModule.java b/src/main/java/a8k/app/service/module/OptScanCtrlModule.java index 4cecf3f..5b845ba 100644 --- a/src/main/java/a8k/app/service/module/OptScanCtrlModule.java +++ b/src/main/java/a8k/app/service/module/OptScanCtrlModule.java @@ -2,7 +2,7 @@ package a8k.app.service.module; import a8k.OS; import a8k.app.dao.type.db.ReactionRecord; -import a8k.app.engineer_service.type.A8kCmdRunnable; +import a8k.app.service.engineer.type.A8kCmdRunnable; import a8k.app.factory.AppErrorFactory; import a8k.app.factory.FakeReactionRecordFactory; import a8k.app.optalgo.A8kPeakAnalyzer; diff --git a/src/main/java/a8k/app/service/module/SamplePreProcessModule.java b/src/main/java/a8k/app/service/module/SamplePreProcessModule.java index 3b1dd1c..8820190 100644 --- a/src/main/java/a8k/app/service/module/SamplePreProcessModule.java +++ b/src/main/java/a8k/app/service/module/SamplePreProcessModule.java @@ -3,7 +3,7 @@ package a8k.app.service.module; import a8k.OS; import a8k.app.dao.type.combination.ProjBuildInInfo; import a8k.app.dao.type.db.ReactionRecord; -import a8k.app.engineer_service.type.A8kCmdRunnable; +import a8k.app.service.engineer.type.A8kCmdRunnable; import a8k.app.factory.AppErrorFactory; import a8k.app.service.ctrlmodule.TipOperationCtrlModule; import a8k.app.service.lowerctrl.*; diff --git a/src/main/java/a8k/extui/page/extapp/profession_test/ExperimentConsistencyTestingPage.java b/src/main/java/a8k/extui/page/extapp/profession_test/ExperimentConsistencyTestingPage.java index ff07316..6acfef5 100644 --- a/src/main/java/a8k/extui/page/extapp/profession_test/ExperimentConsistencyTestingPage.java +++ b/src/main/java/a8k/extui/page/extapp/profession_test/ExperimentConsistencyTestingPage.java @@ -1,13 +1,13 @@ package a8k.extui.page.extapp.profession_test; -import a8k.app.engineer_service.qatest.EngineerModeActionCtrlService; -import a8k.app.engineer_service.qatest.ExperimentConsistencyTestingService; -import a8k.app.engineer_service.state.EngineerModeStateMgrService; -import a8k.app.engineer_service.state.TubeholderExSettingMgr; -import a8k.app.engineer_service.type.EngineerModeState; -import a8k.app.engineer_service.type.TubeExConfig; -import a8k.app.engineer_service.type.TubeHolderExConfig; +import a8k.app.service.engineer.qatest.EngineerModeActionCtrlService; +import a8k.app.service.engineer.qatest.ExperimentConsistencyTestingService; +import a8k.app.service.engineer.state.EngineerModeStateMgrService; +import a8k.app.service.engineer.state.TubeholderExSettingMgr; +import a8k.app.service.engineer.type.EngineerModeState; +import a8k.app.service.engineer.type.TubeExConfig; +import a8k.app.service.engineer.type.TubeHolderExConfig; import a8k.app.type.exception.AppException; import a8k.extui.mgr.ExtApiPageMgr; import a8k.extui.type.ExtApiStatu; diff --git a/src/main/java/a8k/extui/page/extapp/profession_test/P01PipetteGunVerification.java b/src/main/java/a8k/extui/page/extapp/profession_test/P01PipetteGunVerification.java index 7dce92e..03df3bf 100644 --- a/src/main/java/a8k/extui/page/extapp/profession_test/P01PipetteGunVerification.java +++ b/src/main/java/a8k/extui/page/extapp/profession_test/P01PipetteGunVerification.java @@ -1,6 +1,6 @@ package a8k.extui.page.extapp.profession_test; -import a8k.app.engineer_service.qatest.LiquidAbsorptionAndDistributionTestService; +import a8k.app.service.engineer.qatest.LiquidAbsorptionAndDistributionTestService; import a8k.app.type.exception.AppException; import a8k.extui.mgr.ExtApiPageMgr; import a8k.extui.type.ExtUIPageCfg;