From a0d35f639b6fa53f10dc45eae87f7e49c0667a40 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Sun, 20 Oct 2024 20:32:52 +0800 Subject: [PATCH] update --- .../app/appctrl/AppTubeSettingMgrService.java | 13 +- .../action/DO_PROCESS_ERROR_PLATE.java | 30 +++-- .../mainflowctrl/action/PLATE_OPT_SCAN.java | 60 +++++---- .../action/PROCESS_INCUBATE_COMPLETED_PLATE.java | 39 ++++-- .../action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java | 135 ++++++++------------- .../app/appdata/ReactionRecordMgrService.java | 6 +- .../appstate/ProjectProcessContextMgrService.java | 23 ++-- .../java/a8k/service/app/appstate/type/Tube.java | 2 +- ...ReactionPlatesTransmitControlerCalibration.java | 10 +- .../app/devicectrl/ctrlservice/OptScanModule.java | 49 -------- .../ctrlservice/OptScanModuleCtrlService.java | 46 +++++++ .../app/devicectrl/script/DeviceCtrlScripter.java | 10 +- .../bases/appevent/AppWarningNotifyEvent.java | 5 - src/main/java/a8k/type/ecode/TubeError.java | 13 ++ 14 files changed, 226 insertions(+), 215 deletions(-) delete mode 100644 src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModule.java create mode 100644 src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModuleCtrlService.java create mode 100644 src/main/java/a8k/type/ecode/TubeError.java diff --git a/src/main/java/a8k/service/app/appctrl/AppTubeSettingMgrService.java b/src/main/java/a8k/service/app/appctrl/AppTubeSettingMgrService.java index fe90357..4ae76a0 100644 --- a/src/main/java/a8k/service/app/appctrl/AppTubeSettingMgrService.java +++ b/src/main/java/a8k/service/app/appctrl/AppTubeSettingMgrService.java @@ -156,7 +156,7 @@ public class AppTubeSettingMgrService { * internal use *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ - synchronized public void interUseRemoveTubeHolderSetting(TubeHolderSetting removeSetting) throws AppException { + synchronized public void interUseRemoveTubeHolderSetting(TubeHolderSetting removeSetting) { if (removeSetting == null) { return; } @@ -176,14 +176,11 @@ public class AppTubeSettingMgrService { return null; } - synchronized public void interUseUnlockTubeHolderSetting(String uuid) { - for (TubeHolderSetting setting : gState.getTubeHolderSettings()) { - if (setting.uuid.equals(uuid)) { - setting.lock = false; - ebus.pushEvent(new AppTubeholderSettingUpdateEvent()); - return; - } + synchronized public void interUseUnlockTubeHolderSetting(TubeHolderSetting removeSetting) { + if (removeSetting == null) { + return; } + gState.getTubeHolderSettings().removeIf(setting -> setting.uuid.equals(removeSetting.uuid)); } /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 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 5476a88..1aa87da 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 @@ -9,7 +9,7 @@ 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.devicectrl.ctrlservice.OptScanModule; +import a8k.service.app.devicectrl.ctrlservice.OptScanModuleCtrlService; import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; import a8k.type.exception.AppException; @@ -47,7 +47,7 @@ public class DO_PROCESS_ERROR_PLATE extends A8kStepAction { ProjectProcessContextMgrService projectProcessContextMgrService; @Resource - OptScanModule optScanModule; + OptScanModuleCtrlService optScanModuleCtrlService; MainFlowCtrlState mfcs; @@ -58,19 +58,25 @@ public class DO_PROCESS_ERROR_PLATE extends A8kStepAction { } - void doEjectAllErrorPlate(IncubationSubTank errorTank) throws AppException { + void doEjectErrorPlate(IncubationSubTank errorTank) throws AppException { + if (testStateMgrService.isVirtualDeviceEnable()) { + virtualDevice.doVirtualThings("推出板夹 From " + errorTank.toString()); + return; + } + + optScanModuleCtrlService.pullPlate(errorTank.getPos()); + } + + void doDropErrorPlate() throws AppException { if (testStateMgrService.isVirtualDeviceEnable()) { - virtualDevice.doVirtualThings("处理错误板夹:" + errorTank.getPos()); - virtualDevice.doVirtualThings("推出板夹到光学模组"); virtualDevice.doVirtualThings("丢弃板夹"); return; } - logger.info("处理错误板夹:{}", errorTank.getPos()); - optScanModule.pullPlate(errorTank.getPos()); - optScanModule.dropPlate(); + optScanModuleCtrlService.dropPlate(); } + @Override public void doaction() throws AppException { //ProcessErrorBeforeContinue while (true) { @@ -78,12 +84,10 @@ public class DO_PROCESS_ERROR_PLATE extends A8kStepAction { if (errorTank == null) { break; } - - doEjectAllErrorPlate(errorTank); - // + doEjectErrorPlate(errorTank); projectProcessContextMgrService.newPlateToOptScanPos(errorTank); - projectProcessContextMgrService.dropPlate(); - incubationPlateStateMgrService.resetIncubatorPos(errorTank.getPos()); + doDropErrorPlate(); + projectProcessContextMgrService.setOptModuleStateToEmpty(); } } 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 f3d3a4f..09c1b15 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 @@ -1,6 +1,5 @@ package a8k.service.app.appctrl.mainflowctrl.action; -import a8k.OS; import a8k.service.app.appctrl.mainflowctrl.CondtionMgrService; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; @@ -14,8 +13,8 @@ import a8k.service.app.appstate.resource.A8kPublicResourceType; import a8k.service.app.appstate.type.MainFlowCtrlState; import a8k.service.app.appstate.type.OptScanModule; import a8k.service.app.appstate.type.ProjProcessContext; -import a8k.service.app.appstate.type.state.ProjProcessState; - + +import a8k.service.app.devicectrl.ctrlservice.OptScanModuleCtrlService; import a8k.type.ReactionResult; import a8k.type.exception.AppException; import a8k.type.reaction_result_type.ReactionResultStatus; @@ -25,9 +24,12 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.List; + import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; + /** * 处理错误的试管 */ @@ -40,24 +42,27 @@ public class PLATE_OPT_SCAN extends A8kStepAction { } @Resource - GStateService gstate; - @Resource + GStateService gstate; + @Resource TestStateMgrService testStateMgrService; @Resource VirtualDevice virtualDevice; @Resource - CondtionMgrService cms; + CondtionMgrService cms; @Resource - IncubationPlateStateMgrService incubationPlateStateMgrService; + IncubationPlateStateMgrService incubationPlateStateMgrService; @Resource - OptScanModuleStateMgrService optScanModuleStateMgrService; + OptScanModuleStateMgrService optScanModuleStateMgrService; @Resource - ReactionRecordMgrService reactionRecordMgrService; - + ReactionRecordMgrService reactionRecordMgrService; + @Resource ProjectProcessContextMgrService projectProcessContextMgrService; + @Resource + OptScanModuleCtrlService optScanModuleCtrlService; + MainFlowCtrlState mfcs; @@ -67,24 +72,37 @@ public class PLATE_OPT_SCAN extends A8kStepAction { } + List doOptScan(ProjProcessContext cxt) throws AppException { + + List reactionResults = new ArrayList<>(); + if (testStateMgrService.isVirtualDeviceEnable()) { + virtualDevice.doVirtualThings("扫描板夹", 2); + reactionResults.add(new ReactionResult(ReactionResultStatus.SUCCESS, "12.8 mg/L")); + reactionResults.add(new ReactionResult(ReactionResultStatus.ERROR_RESULT_OUT_OF_RANGE, "")); + return reactionResults; + } + + //TODO 扫描反应板 + //丢板 + optScanModuleCtrlService.dropPlate(); + + reactionResults.add(new ReactionResult(ReactionResultStatus.SUCCESS, "12.8 mg/L")); + reactionResults.add(new ReactionResult(ReactionResultStatus.ERROR_RESULT_OUT_OF_RANGE, "")); + return reactionResults; + } + + @Override public void doaction() throws AppException { OptScanModule optScanModule = gstate.getOptScanModule(); ProjProcessContext ctx = projectProcessContextMgrService.getProjProcessContext(optScanModule.getSampleId(), optScanModule.getProjIndex()); - projectProcessContextMgrService.startScanPlate(); + logger.info("扫描板夹"); - //记录扫描结果 - if (testStateMgrService.isVirtualDeviceEnable()) { - virtualDevice.doVirtualThings("扫描板夹", 2); - } else { - } - //修改板夹状态 + var scanResults = doOptScan(ctx); - projectProcessContextMgrService.dropPlate(); + projectProcessContextMgrService.setOptModuleStateToEmpty(); projectProcessContextMgrService.finishProcessProj(optScanModule.getSampleId(), optScanModule.getProjIndex()); - reactionRecordMgrService.addRecord(ctx, - new ReactionResult(ReactionResultStatus.SUCCESS, "12.8 mg/L"), - new ReactionResult(ReactionResultStatus.ERROR_RESULT_OUT_OF_RANGE, "")); + reactionRecordMgrService.addRecord(ctx, scanResults); } @Override public Boolean checkCondition() { 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 7ff8623..9996ffc 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 @@ -14,19 +14,24 @@ import a8k.service.app.appstate.type.IncubationSubTank; import a8k.service.app.appstate.type.MainFlowCtrlState; import a8k.service.app.appstate.type.ProjProcessContext; import a8k.service.app.appstate.type.state.IncubationSubTankState; - + +import a8k.service.app.devicectrl.ctrlservice.OptScanModuleCtrlService; +import a8k.service.app.devicectrl.ctrlservice.TurnableMoveCtrlService; import a8k.type.exception.AppException; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; +import org.aspectj.lang.annotation.DeclareWarning; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.List; + import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; + /** - * 处理错误的试管 + * 处理已经孵育完成的反应板 */ @Component public class PROCESS_INCUBATE_COMPLETED_PLATE extends A8kStepAction { @@ -37,22 +42,24 @@ public class PROCESS_INCUBATE_COMPLETED_PLATE extends A8kStepAction { } @Resource - GStateService gstate; - @Resource + GStateService gstate; + @Resource TestStateMgrService testStateMgrService; @Resource VirtualDevice virtualDevice; @Resource - CondtionMgrService cms; + CondtionMgrService cms; @Resource - IncubationPlateStateMgrService incubationPlateStateMgrService; + IncubationPlateStateMgrService incubationPlateStateMgrService; @Resource - OptScanModuleStateMgrService optScanModuleStateMgrService; - + OptScanModuleStateMgrService optScanModuleStateMgrService; + @Resource ProjectProcessContextMgrService projectProcessContextMgrService; + @Resource + OptScanModuleCtrlService optScanModuleCtrlService; MainFlowCtrlState mfcs; @@ -66,17 +73,23 @@ public class PROCESS_INCUBATE_COMPLETED_PLATE extends A8kStepAction { } + void doEjectPlate(IncubationSubTank tank) throws AppException { + if (testStateMgrService.isVirtualDeviceEnable()) { + virtualDevice.doVirtualThings(String.format("推出反应板夹从%s到光学模组", tank.getPos())); + return; + } + optScanModuleCtrlService.pullPlate(tank.getPos()); + } + + @Override public void doaction() throws AppException { IncubationSubTank tank = getToBeProcessedTank(); if (tank == null) { return; } - if (testStateMgrService.isVirtualDeviceEnable()) { - virtualDevice.doVirtualThings("处理孵育完成的板夹", 2); - } - + doEjectPlate(tank); projectProcessContextMgrService.newPlateToOptScanPos(tank); - incubationPlateStateMgrService.resetIncubatorPos(tank.getPos()); + } @Override public Boolean checkCondition() { 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 d002114..57f7b4e 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 @@ -21,6 +21,7 @@ import a8k.service.app.devicectrl.ctrlservice.TubeFeedingCtrlService; import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.VirtualDevice; import a8k.type.TubeHolderScanResult; +import a8k.type.ecode.TubeError; import a8k.type.exception.AppException; import a8k.type.tube_setting.TubeHolderSetting; import a8k.type.type.A8kTubeHolderType; @@ -55,20 +56,20 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { TestStateMgrService testStateMgrService; @Resource VirtualDevice virtualDevice; - @Resource - CondtionMgrService cmgr; + AppEventBusService ebus; + @Resource - TubeFeedingCtrlService stc; + CondtionMgrService cmgr; @Resource - AppEventBusService ebus; + ProjectProcessContextMgrService projectProcessContextMgrService; @Resource - AppTubeSettingMgrService appTubeSettingMgrService; + AppTubeSettingMgrService appTubeSettingMgrService; @Resource - ProjCfgMgrService appProjInfoMgr; + ProjCfgMgrService appProjInfoMgr; @Resource - ProjectProcessContextMgrService projectProcessContextMgrService; + TubeFeedingCtrlService stc; // // HardwareOperation @@ -93,16 +94,19 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { } - A8kEcode parseOneTube(Tube tube, Integer i, TubeHolderScanResult scanResult, TubeHolderSetting setting) { + /** + * + */ + A8kEcode initOneTube(Tube tube, Integer i, TubeHolderScanResult scanResult, TubeHolderSetting setting) { if (!scanResult.tube[i].isTubeExist) { tube.setState(TubeState.EMPTY); return A8kEcode.SUC; } + tube.setState(TubeState.TO_BE_PROCESSED); tube.setIsHighTube(scanResult.tube[i].isHighTube); - //首先赋值默认值 tube.setBloodType(BloodType.WHOLE_BLOOD); tube.setSampleBarcode(""); @@ -119,63 +123,48 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { if (tube.getProjInfo() == null) { logger.error("项目信息不存在,{}", setting.tubeSettings[i].projIndex); - ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_PROJ_INFO_IS_NOT_EXIST)); return A8kEcode.APPE_PROJ_INFO_IS_NOT_EXIST; } } - - if (tube.getUserid().isEmpty()) { - tube.setUserid(genUserId(i)); - } - return A8kEcode.SUC; - - //补全试管中的项目信息 - //最后赋值扫描到的数值 - // //TODO:添加请求后台的代码 // - // state.tubeStates[i].bloodType = ; - // state.tubeStates[i].sampleBarcode = setting.tubeSettings[i].sampleBarcode; - // state.tubeStates[i].userid = setting.tubeSettings[i].userid; - // state.tubeStates[i].projIndex = setting.tubeSettings[i].projIndex; + // state.tubeStates[i].bloodType = ; + // state.tubeStates[i].sampleBarcode = setting.tubeSettings[i].sampleBarcode; + // state.tubeStates[i].userid = setting.tubeSettings[i].userid; + // state.tubeStates[i].projIndex = setting.tubeSettings[i].projIndex; + + if (tube.getProjIndex().isEmpty()) { + logger.error("试管{}待做项目为空", i); + return A8kEcode.APPE_PROJ_INDEX_IS_EMPTY; + } + + + return A8kEcode.SUC; } - TubeHolder parseScanResult(TubeHolderScanResult scanResult) throws AppException { - TubeHolder tubeholder = new TubeHolder(); - TubeHolderSetting setting = appTubeSettingMgrService.interUseGetThelastActiveTubeHolderSettingAndLock(); - try { - //获取试管架类型 - A8kTubeHolderType tubeHolderType = A8kTubeHolderType.of(scanResult.tubeHolderType); - if (tubeHolderType == null) { - logger.error("不支持的试管架类型,{}", scanResult.tubeHolderType); - ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_TUBE_HOLDER_TYPE_IS_NOT_SUPPORT)); - return null; - } + TubeHolder parseScanResult(TubeHolderScanResult scanResult, TubeHolderSetting setting) { + TubeHolder tubeholder = new TubeHolder(); + Assert.isTrue(setting == null || setting.tubeSettings.length == tubeholder.tubes.length, "试管架配置信息与试管数量不匹配"); + + //获取试管架类型 + A8kTubeHolderType tubeHolderType = A8kTubeHolderType.of(scanResult.tubeHolderType); + if (tubeHolderType == null) { + ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_TUBE_HOLDER_TYPE_IS_NOT_SUPPORT)); + return null; + } - // Assert.isTrue(setting == null || setting.tubeSettings.length == tubeholder.tubes.length; - Assert.isTrue(setting == null || setting.tubeSettings.length == tubeholder.tubes.length, "试管架配置信息与试管数量不匹配"); - - //逐个赋值试管配置信息 - updaetGroupId(); - for (int i = 0; i < tubeholder.tubes.length; i++) { - A8kEcode ecode = parseOneTube(tubeholder.tubes[i], i, scanResult, setting); - if (ecode != A8kEcode.SUC) { - ebus.pushEvent(new AppWarningNotifyEvent(ecode)); - return null; - } + //逐个赋值试管配置信息 + for (int i = 0; i < tubeholder.tubes.length; i++) { + A8kEcode ecode = initOneTube(tubeholder.tubes[i], i, scanResult, setting); + if (!ecode.equals(A8kEcode.SUC)) { + ebus.pushEvent(new AppWarningNotifyEvent(new TubeError(ecode, i))); + return null; } - //设置试管架状态 - tubeholder.setState(TubeHolderState.PROCESSING); - //删除之前的试管架配置 - appTubeSettingMgrService.interUseRemoveTubeHolderSetting(setting); - return tubeholder; - - } catch (AppException e) { - //回滚部分状态 - if (setting != null) - appTubeSettingMgrService.interUseUnlockTubeHolderSetting(setting.uuid); - throw e; } + + //设置试管架状态 + tubeholder.setState(TubeHolderState.PROCESSING); + return tubeholder; } @@ -189,14 +178,17 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { } logger.info("扫描到一个试管架:{}", scanResult); - logger.info("解析扫描结果"); - TubeHolder tubeholder = parseScanResult(scanResult); + TubeHolderSetting setting = appTubeSettingMgrService.interUseGetThelastActiveTubeHolderSettingAndLock(); + TubeHolder tubeholder = parseScanResult(scanResult, setting); if (tubeholder == null) { + appTubeSettingMgrService.interUseUnlockTubeHolderSetting(setting); logger.warn("结果解析异常"); doEjectHodler(); return; } + appTubeSettingMgrService.interUseRemoveTubeHolderSetting(setting); + logger.info("更新试管架状态"); projectProcessContextMgrService.newTubeHolder(tubeholder); } @@ -209,32 +201,5 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { return List.of(A8kPublicResourceType.ShakeModule); } - // - // UTILS - // - - static Integer usrgroupidoff = 10; - static Boolean tryUpdateGroupId = false; - - String genUserId(Integer tubeoff) { - if (tryUpdateGroupId) { - usrgroupidoff++; - if (usrgroupidoff >= 100) { - usrgroupidoff = 10; - } - tryUpdateGroupId = false; - } - //构造用户ID, 年月日时分秒_试管偏移量 - int usrReadableOff = tubeoff + 1; - if (usrReadableOff >= 10) { - usrReadableOff = 0; - } - return String.format("%2d%d", usrgroupidoff, usrReadableOff); - } - - void updaetGroupId() { - tryUpdateGroupId = true; - } - } diff --git a/src/main/java/a8k/service/app/appdata/ReactionRecordMgrService.java b/src/main/java/a8k/service/app/appdata/ReactionRecordMgrService.java index 2961286..637bf93 100644 --- a/src/main/java/a8k/service/app/appdata/ReactionRecordMgrService.java +++ b/src/main/java/a8k/service/app/appdata/ReactionRecordMgrService.java @@ -41,8 +41,12 @@ public class ReactionRecordMgrService { return reactionRecordDBService.getAll(); } + public void addRecord(ProjProcessContext projContext, List results) { + addRecord(projContext, results.toArray(new ReactionResult[0])); + } + public void addRecord(ProjProcessContext projContext, ReactionResult... reactionResults) { - ReactionResultRecord record = new ReactionResultRecord(); + ReactionResultRecord record = new ReactionResultRecord(); String operator = appUserMgrService.getLoginUsr() != null ? appUserMgrService.getLoginUsr().account : "UNLOGIN"; diff --git a/src/main/java/a8k/service/app/appstate/ProjectProcessContextMgrService.java b/src/main/java/a8k/service/app/appstate/ProjectProcessContextMgrService.java index 8c2574c..b8c2b0c 100644 --- a/src/main/java/a8k/service/app/appstate/ProjectProcessContextMgrService.java +++ b/src/main/java/a8k/service/app/appstate/ProjectProcessContextMgrService.java @@ -108,8 +108,12 @@ public class ProjectProcessContextMgrService { sampleRecord.bloodType = tube.getBloodType(); sampleRecord.isEmergency = tube.getIsEmergency(); sampleRecord.sampleBarcode = tube.getSampleBarcode(); - sampleRecord.userid = tube.getUserid(); - sampleRecord.projIndex = tube.getProjIndex(); + if (tube.getUserid().isEmpty()) { + sampleRecord.userid = sampleRecord.sampleid; + } else { + sampleRecord.userid = tube.getUserid(); + } + sampleRecord.projIndex = tube.getProjIndex(); tube.setSampleId(sampleRecord.sampleid); sampleRecordDBService.add(sampleRecord); } @@ -231,7 +235,7 @@ public class ProjectProcessContextMgrService { synchronized public Boolean takeResourceConsumable(Tube tube) { for (Integer projIndex : tube.getProjIndex()) { ProjProcessContext cxt = getProjProcessContext(tube.getSampleId(), projIndex); - Assert.isTrue(cxt != null,"cxt != null"); + Assert.isTrue(cxt != null, "cxt != null"); cxt.consumable = consumablesMgrService.takeConsumables(projIndex); if (cxt.consumable == null) { return false; @@ -245,7 +249,7 @@ public class ProjectProcessContextMgrService { var subtanks = incubationState.subtanks; for (Integer projIndex : tube.getProjIndex()) { ProjProcessContext cxt = getProjProcessContext(tube.getSampleId(), projIndex); - Assert.isTrue(cxt != null,"cxt != null"); + Assert.isTrue(cxt != null, "cxt != null"); cxt.incubatorPos = incubationPlateStateMgrService.takeOneIncubationIDLEPos(); if (cxt.incubatorPos == null) { return false; @@ -259,7 +263,7 @@ public class ProjectProcessContextMgrService { synchronized public Boolean takeResourceTip(Tube tube) { for (Integer projIndex : tube.getProjIndex()) { ProjProcessContext cxt = getProjProcessContext(tube.getSampleId(), projIndex); - Assert.isTrue(cxt != null,"cxt != null"); + Assert.isTrue(cxt != null, "cxt != null"); A8kReactionFlowType flow = projCfgMgrService.getReactionFlowType(projIndex); cxt.tipPos = consumablesMgrService.takeTip(flow); if (cxt.tipPos == null) { @@ -272,7 +276,7 @@ public class ProjectProcessContextMgrService { synchronized public void bakAllTubeAResource(Tube tube) { for (Integer projIndex : tube.getProjIndex()) { ProjProcessContext cxt = getProjProcessContext(tube.getSampleId(), projIndex); - Assert.isTrue(cxt != null,"cxt != null"); + Assert.isTrue(cxt != null, "cxt != null"); if (cxt.tipPos != null) { consumablesMgrService.backTipList(cxt.tipPos); @@ -292,7 +296,7 @@ public class ProjectProcessContextMgrService { synchronized public void prepareProjInfoData(Tube tube) { for (Integer projIndex : tube.getProjIndex()) { ProjProcessContext cxt = getProjProcessContext(tube.getSampleId(), projIndex); - Assert.isTrue(cxt != null,"cxt != null"); + Assert.isTrue(cxt != null, "cxt != null"); cxt.projCfg = projCfgMgrService.findByProjIndexWithCheck(cxt.consumable.lotId); } } @@ -351,9 +355,10 @@ public class ProjectProcessContextMgrService { OptScanModule optScanModule = gstate.getOptScanModule(); optScanModule.state = OptScanModuleState.PLATE_IS_READY; optScanModule.syncCfg(tank); + incubationPlateStateMgrService.resetIncubatorPos(tank.getPos()); } - synchronized public void dropPlate() { + synchronized public void setOptModuleStateToEmpty() { OptScanModule optScanModule = gstate.getOptScanModule(); optScanModule.state = OptScanModuleState.EMPTY; } @@ -365,7 +370,7 @@ public class ProjectProcessContextMgrService { synchronized public void finishProcessProj(String sampleId, Integer projIndex) { ProjProcessContext cxt = getProjProcessContext(sampleId, projIndex); - Assert.isTrue(cxt != null,"cxt != null"); + Assert.isTrue(cxt != null, "cxt != null"); cxt.state = ProjProcessState.FINISH; } diff --git a/src/main/java/a8k/service/app/appstate/type/Tube.java b/src/main/java/a8k/service/app/appstate/type/Tube.java index a9152c2..6534a41 100644 --- a/src/main/java/a8k/service/app/appstate/type/Tube.java +++ b/src/main/java/a8k/service/app/appstate/type/Tube.java @@ -32,7 +32,7 @@ public class Tube { return ProjBriefInfo.toPorjIndex(projInfo); } - public List getProjIndexStrList(){ + public List getProjIndexStrList() { List projIndexStrList = new ArrayList<>(); for (ProjBriefInfo info : projInfo) { projIndexStrList.add(info.projShotName); diff --git a/src/main/java/a8k/service/app/devicectrl/calibration/ReactionPlatesTransmitControlerCalibration.java b/src/main/java/a8k/service/app/devicectrl/calibration/ReactionPlatesTransmitControlerCalibration.java index 42f1949..d871231 100644 --- a/src/main/java/a8k/service/app/devicectrl/calibration/ReactionPlatesTransmitControlerCalibration.java +++ b/src/main/java/a8k/service/app/devicectrl/calibration/ReactionPlatesTransmitControlerCalibration.java @@ -3,7 +3,7 @@ package a8k.service.app.devicectrl.calibration; import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; import a8k.extapi_controler.utils.ExtApiFn; import a8k.extapi_controler.utils.ExtApiTab; -import a8k.service.app.devicectrl.ctrlservice.OptScanModule; +import a8k.service.app.devicectrl.ctrlservice.OptScanModuleCtrlService; import a8k.service.app.devicectrl.ctrlservice.PlateBoxCtrlService; import a8k.service.app.devicectrl.driver.HbotDriver; import a8k.service.app.devicectrl.driver.MiniServoDriver; @@ -40,9 +40,9 @@ public class ReactionPlatesTransmitControlerCalibration { @Resource TurnableMoveCtrlService turnableMoveCtrlService; @Resource - PlateBoxCtrlService plateBoxCtrlService; + PlateBoxCtrlService plateBoxCtrlService; @Resource - OptScanModule optScanModule; + OptScanModuleCtrlService optScanModuleCtrlService; @Resource PipetteCtrlDriver pipetteCtrlDriver; @@ -232,8 +232,8 @@ public class ReactionPlatesTransmitControlerCalibration { @ExtApiFn(name = "反应板.推一丢一", group = "校验", order = 1003) public void pushOneAndRemove(ConsumableGroup PBCh, IncubatorPos incubatorPos) throws AppException { plateBoxCtrlService.pushPlateQuick(PBCh, incubatorPos); - optScanModule.pullPlate(incubatorPos); - optScanModule.dropPlate(); + optScanModuleCtrlService.pullPlate(incubatorPos); + optScanModuleCtrlService.dropPlate(); } @ExtApiFn(name = "反应板.推所有丢所有", group = "校验", order = 1004) diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModule.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModule.java deleted file mode 100644 index 0bd1641..0000000 --- a/src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModule.java +++ /dev/null @@ -1,49 +0,0 @@ -package a8k.service.app.devicectrl.ctrlservice; - -import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; -import a8k.extapi_controler.utils.ExtApiTab; -import a8k.hardware.A8kCanBusService; -import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; -import a8k.service.app.devicectrl.driver.type.StepMotorMId; -import a8k.service.app.devicectrl.param.OptModuleParamsMgr; -import a8k.service.app.devicectrl.param.PlatesBoxPosParamMgr; -import a8k.service.app.devicectrl.param.TurntablePosParamMgr; -import a8k.service.bases.ActionReactorService; -import a8k.type.IncubatorPos; -import a8k.type.exception.AppException; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Component -@Slf4j -@ExtApiTab(cfg = ExtApiTabConfig.ReactionPlatesTransmitCtrl) -public class OptScanModule { - static final Integer overtime = 10000; - - - @Resource - StepMotorCtrlDriver stepMotorCtrlDriver; - @Resource - ActionReactorService actionReactor; - - @Resource - OptModuleParamsMgr optModuleParamsMgr; - @Resource - TurnableMoveCtrlService turnableMoveCtrlService; - - - public void pullPlate(IncubatorPos turntablePosIndex) throws AppException { - turnableMoveCtrlService.trunableMoveToPullPos(turntablePosIndex); - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModScannerM, optModuleParamsMgr.getOptScanerScandbyPos(), overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModPullM, optModuleParamsMgr.getPullerTargetPos(), overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.OptModPullM, overtime); - } - - public void dropPlate() throws AppException { - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModScannerM, optModuleParamsMgr.getOptScanerDropPos(), overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.OptModScannerM, overtime); - stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModScannerM, optModuleParamsMgr.getOptScanerScandbyPos(), overtime); - } - -} diff --git a/src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModuleCtrlService.java b/src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModuleCtrlService.java new file mode 100644 index 0000000..d720e9d --- /dev/null +++ b/src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModuleCtrlService.java @@ -0,0 +1,46 @@ +package a8k.service.app.devicectrl.ctrlservice; + +import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; +import a8k.extapi_controler.utils.ExtApiTab; +import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; +import a8k.service.app.devicectrl.driver.type.StepMotorMId; +import a8k.service.app.devicectrl.param.OptModuleParamsMgr; +import a8k.service.bases.ActionReactorService; +import a8k.type.IncubatorPos; +import a8k.type.exception.AppException; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Component +@Slf4j +@ExtApiTab(cfg = ExtApiTabConfig.ReactionPlatesTransmitCtrl) +public class OptScanModuleCtrlService { + static final Integer overtime = 10000; + + + @Resource + StepMotorCtrlDriver stepMotorCtrlDriver; + @Resource + ActionReactorService actionReactor; + + @Resource + OptModuleParamsMgr optModuleParamsMgr; + @Resource + TurnableMoveCtrlService turnableMoveCtrlService; + + + public void pullPlate(IncubatorPos turntablePosIndex) throws AppException { + turnableMoveCtrlService.trunableMoveToPullPos(turntablePosIndex); + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModScannerM, optModuleParamsMgr.getOptScanerScandbyPos(), overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModPullM, optModuleParamsMgr.getPullerTargetPos(), overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.OptModPullM, overtime); + } + + public void dropPlate() throws AppException { + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModScannerM, optModuleParamsMgr.getOptScanerDropPos(), overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToZeroPointQuickBlock(StepMotorMId.OptModScannerM, overtime); + stepMotorCtrlDriver.stepMotorEasyMoveToBlock(StepMotorMId.OptModScannerM, optModuleParamsMgr.getOptScanerScandbyPos(), overtime); + } + +} diff --git a/src/main/java/a8k/service/app/devicectrl/script/DeviceCtrlScripter.java b/src/main/java/a8k/service/app/devicectrl/script/DeviceCtrlScripter.java index e16dfa3..bd91370 100644 --- a/src/main/java/a8k/service/app/devicectrl/script/DeviceCtrlScripter.java +++ b/src/main/java/a8k/service/app/devicectrl/script/DeviceCtrlScripter.java @@ -1,6 +1,6 @@ package a8k.service.app.devicectrl.script; -import a8k.service.app.devicectrl.ctrlservice.OptScanModule; +import a8k.service.app.devicectrl.ctrlservice.OptScanModuleCtrlService; import a8k.service.bases.ActionReactorService; import a8k.type.IncubatorPos; import a8k.type.exception.AppException; @@ -16,15 +16,15 @@ public class DeviceCtrlScripter { ActionReactorService actionReactor; @Resource - OptScanModule optScanModule; + OptScanModuleCtrlService optScanModuleCtrlService; public void dropAllPlates() throws AppException { log.info("清空孵育盘"); - actionReactor.dosome("丢板", () -> optScanModule.dropPlate()); + actionReactor.dosome("丢板", () -> optScanModuleCtrlService.dropPlate()); for (var incubatorPos : IncubatorPos.values()) { - actionReactor.dosome("拉板" + incubatorPos.name(), () -> optScanModule.pullPlate(incubatorPos)); - actionReactor.dosome("丢板", () -> optScanModule.dropPlate()); + actionReactor.dosome("拉板" + incubatorPos.name(), () -> optScanModuleCtrlService.pullPlate(incubatorPos)); + actionReactor.dosome("丢板", () -> optScanModuleCtrlService.dropPlate()); } } } diff --git a/src/main/java/a8k/service/bases/appevent/AppWarningNotifyEvent.java b/src/main/java/a8k/service/bases/appevent/AppWarningNotifyEvent.java index 2f4452d..a7ce5e2 100644 --- a/src/main/java/a8k/service/bases/appevent/AppWarningNotifyEvent.java +++ b/src/main/java/a8k/service/bases/appevent/AppWarningNotifyEvent.java @@ -15,9 +15,4 @@ public class AppWarningNotifyEvent extends AppEvent { super(AppWarningNotifyEvent.class.getSimpleName()); this.error = new AppError(errorCode); } - - public AppWarningNotifyEvent(Integer errorCode) { - super(AppWarningNotifyEvent.class.getSimpleName()); - this.error = new AppError(A8kEcode.fromInt(errorCode)); - } } diff --git a/src/main/java/a8k/type/ecode/TubeError.java b/src/main/java/a8k/type/ecode/TubeError.java new file mode 100644 index 0000000..a9d8dca --- /dev/null +++ b/src/main/java/a8k/type/ecode/TubeError.java @@ -0,0 +1,13 @@ +package a8k.type.ecode; + +import a8k.hardware.type.a8kcanprotocol.A8kEcode; + +public class TubeError extends AppError { + public Integer tubeOff; + + public TubeError(A8kEcode ecode, Integer tubeOff) { + super(ecode); + this.tubeOff = tubeOff; + } + +}