Browse Source

update

tags/v0
zhaohe 10 months ago
parent
commit
a0d35f639b
  1. 11
      src/main/java/a8k/service/app/appctrl/AppTubeSettingMgrService.java
  2. 30
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/DO_PROCESS_ERROR_PLATE.java
  3. 44
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PLATE_OPT_SCAN.java
  4. 25
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PROCESS_INCUBATE_COMPLETED_PLATE.java
  5. 95
      src/main/java/a8k/service/app/appctrl/mainflowctrl/action/SEQ1_ENTER_TUBEHOLDER_AND_SCAN.java
  6. 4
      src/main/java/a8k/service/app/appdata/ReactionRecordMgrService.java
  7. 19
      src/main/java/a8k/service/app/appstate/ProjectProcessContextMgrService.java
  8. 2
      src/main/java/a8k/service/app/appstate/type/Tube.java
  9. 8
      src/main/java/a8k/service/app/devicectrl/calibration/ReactionPlatesTransmitControlerCalibration.java
  10. 5
      src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModuleCtrlService.java
  11. 10
      src/main/java/a8k/service/app/devicectrl/script/DeviceCtrlScripter.java
  12. 5
      src/main/java/a8k/service/bases/appevent/AppWarningNotifyEvent.java
  13. 13
      src/main/java/a8k/type/ecode/TubeError.java

11
src/main/java/a8k/service/app/appctrl/AppTubeSettingMgrService.java

@ -156,7 +156,7 @@ public class AppTubeSettingMgrService {
* internal use * internal use
*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
synchronized public void interUseRemoveTubeHolderSetting(TubeHolderSetting removeSetting) throws AppException {
synchronized public void interUseRemoveTubeHolderSetting(TubeHolderSetting removeSetting) {
if (removeSetting == null) { if (removeSetting == null) {
return; return;
} }
@ -176,14 +176,11 @@ public class AppTubeSettingMgrService {
return null; 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());
synchronized public void interUseUnlockTubeHolderSetting(TubeHolderSetting removeSetting) {
if (removeSetting == null) {
return; return;
} }
}
gState.getTubeHolderSettings().removeIf(setting -> setting.uuid.equals(removeSetting.uuid));
} }
/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

30
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.resource.A8kPublicResourceType;
import a8k.service.app.appstate.type.IncubationSubTank; import a8k.service.app.appstate.type.IncubationSubTank;
import a8k.service.app.appstate.type.MainFlowCtrlState; 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.TestStateMgrService;
import a8k.service.test.state.VirtualDevice; import a8k.service.test.state.VirtualDevice;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
@ -47,7 +47,7 @@ public class DO_PROCESS_ERROR_PLATE extends A8kStepAction {
ProjectProcessContextMgrService projectProcessContextMgrService; ProjectProcessContextMgrService projectProcessContextMgrService;
@Resource @Resource
OptScanModule optScanModule;
OptScanModuleCtrlService optScanModuleCtrlService;
MainFlowCtrlState mfcs; 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()) { if (testStateMgrService.isVirtualDeviceEnable()) {
virtualDevice.doVirtualThings("处理错误板夹:" + errorTank.getPos());
virtualDevice.doVirtualThings("推出板夹到光学模组");
virtualDevice.doVirtualThings("丢弃板夹"); virtualDevice.doVirtualThings("丢弃板夹");
return; return;
} }
logger.info("处理错误板夹:{}", errorTank.getPos());
optScanModule.pullPlate(errorTank.getPos());
optScanModule.dropPlate();
optScanModuleCtrlService.dropPlate();
} }
@Override public void doaction() throws AppException { @Override public void doaction() throws AppException {
//ProcessErrorBeforeContinue //ProcessErrorBeforeContinue
while (true) { while (true) {
@ -78,12 +84,10 @@ public class DO_PROCESS_ERROR_PLATE extends A8kStepAction {
if (errorTank == null) { if (errorTank == null) {
break; break;
} }
doEjectAllErrorPlate(errorTank);
//
doEjectErrorPlate(errorTank);
projectProcessContextMgrService.newPlateToOptScanPos(errorTank); projectProcessContextMgrService.newPlateToOptScanPos(errorTank);
projectProcessContextMgrService.dropPlate();
incubationPlateStateMgrService.resetIncubatorPos(errorTank.getPos());
doDropErrorPlate();
projectProcessContextMgrService.setOptModuleStateToEmpty();
} }
} }

44
src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PLATE_OPT_SCAN.java

@ -1,6 +1,5 @@
package a8k.service.app.appctrl.mainflowctrl.action; package a8k.service.app.appctrl.mainflowctrl.action;
import a8k.OS;
import a8k.service.app.appctrl.mainflowctrl.CondtionMgrService; import a8k.service.app.appctrl.mainflowctrl.CondtionMgrService;
import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType;
import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; 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.MainFlowCtrlState;
import a8k.service.app.appstate.type.OptScanModule; import a8k.service.app.appstate.type.OptScanModule;
import a8k.service.app.appstate.type.ProjProcessContext; 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.ReactionResult;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
import a8k.type.reaction_result_type.ReactionResultStatus; import a8k.type.reaction_result_type.ReactionResultStatus;
@ -25,9 +24,12 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.TestStateMgrService;
import a8k.service.test.state.VirtualDevice; import a8k.service.test.state.VirtualDevice;
/** /**
* 处理错误的试管 * 处理错误的试管
*/ */
@ -58,6 +60,9 @@ public class PLATE_OPT_SCAN extends A8kStepAction {
@Resource @Resource
ProjectProcessContextMgrService projectProcessContextMgrService; ProjectProcessContextMgrService projectProcessContextMgrService;
@Resource
OptScanModuleCtrlService optScanModuleCtrlService;
MainFlowCtrlState mfcs; MainFlowCtrlState mfcs;
@ -67,24 +72,37 @@ public class PLATE_OPT_SCAN extends A8kStepAction {
} }
List<ReactionResult> doOptScan(ProjProcessContext cxt) throws AppException {
List<ReactionResult> 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 { @Override public void doaction() throws AppException {
OptScanModule optScanModule = gstate.getOptScanModule(); OptScanModule optScanModule = gstate.getOptScanModule();
ProjProcessContext ctx = projectProcessContextMgrService.getProjProcessContext(optScanModule.getSampleId(), optScanModule.getProjIndex()); ProjProcessContext ctx = projectProcessContextMgrService.getProjProcessContext(optScanModule.getSampleId(), optScanModule.getProjIndex());
projectProcessContextMgrService.startScanPlate(); projectProcessContextMgrService.startScanPlate();
logger.info("扫描板夹"); logger.info("扫描板夹");
//记录扫描结果
if (testStateMgrService.isVirtualDeviceEnable()) {
virtualDevice.doVirtualThings("扫描板夹", 2);
} else {
}
//修改板夹状态
var scanResults = doOptScan(ctx);
projectProcessContextMgrService.dropPlate();
projectProcessContextMgrService.setOptModuleStateToEmpty();
projectProcessContextMgrService.finishProcessProj(optScanModule.getSampleId(), optScanModule.getProjIndex()); 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() { @Override public Boolean checkCondition() {

25
src/main/java/a8k/service/app/appctrl/mainflowctrl/action/PROCESS_INCUBATE_COMPLETED_PLATE.java

@ -15,18 +15,23 @@ import a8k.service.app.appstate.type.MainFlowCtrlState;
import a8k.service.app.appstate.type.ProjProcessContext; import a8k.service.app.appstate.type.ProjProcessContext;
import a8k.service.app.appstate.type.state.IncubationSubTankState; 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 a8k.type.exception.AppException;
import jakarta.annotation.PostConstruct; import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.aspectj.lang.annotation.DeclareWarning;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.List; import java.util.List;
import a8k.service.test.state.TestStateMgrService; import a8k.service.test.state.TestStateMgrService;
import a8k.service.test.state.VirtualDevice; import a8k.service.test.state.VirtualDevice;
/** /**
* 处理错误的试管
* 处理已经孵育完成的反应板
*/ */
@Component @Component
public class PROCESS_INCUBATE_COMPLETED_PLATE extends A8kStepAction { public class PROCESS_INCUBATE_COMPLETED_PLATE extends A8kStepAction {
@ -53,6 +58,8 @@ public class PROCESS_INCUBATE_COMPLETED_PLATE extends A8kStepAction {
@Resource @Resource
ProjectProcessContextMgrService projectProcessContextMgrService; ProjectProcessContextMgrService projectProcessContextMgrService;
@Resource
OptScanModuleCtrlService optScanModuleCtrlService;
MainFlowCtrlState mfcs; 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 { @Override public void doaction() throws AppException {
IncubationSubTank tank = getToBeProcessedTank(); IncubationSubTank tank = getToBeProcessedTank();
if (tank == null) { if (tank == null) {
return; return;
} }
if (testStateMgrService.isVirtualDeviceEnable()) {
virtualDevice.doVirtualThings("处理孵育完成的板夹", 2);
}
doEjectPlate(tank);
projectProcessContextMgrService.newPlateToOptScanPos(tank); projectProcessContextMgrService.newPlateToOptScanPos(tank);
incubationPlateStateMgrService.resetIncubatorPos(tank.getPos());
} }
@Override public Boolean checkCondition() { @Override public Boolean checkCondition() {

95
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.TestStateMgrService;
import a8k.service.test.state.VirtualDevice; import a8k.service.test.state.VirtualDevice;
import a8k.type.TubeHolderScanResult; import a8k.type.TubeHolderScanResult;
import a8k.type.ecode.TubeError;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
import a8k.type.tube_setting.TubeHolderSetting; import a8k.type.tube_setting.TubeHolderSetting;
import a8k.type.type.A8kTubeHolderType; import a8k.type.type.A8kTubeHolderType;
@ -55,20 +56,20 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
TestStateMgrService testStateMgrService; TestStateMgrService testStateMgrService;
@Resource @Resource
VirtualDevice virtualDevice; VirtualDevice virtualDevice;
@Resource
AppEventBusService ebus;
@Resource @Resource
CondtionMgrService cmgr; CondtionMgrService cmgr;
@Resource @Resource
TubeFeedingCtrlService stc;
@Resource
AppEventBusService ebus;
ProjectProcessContextMgrService projectProcessContextMgrService;
@Resource @Resource
AppTubeSettingMgrService appTubeSettingMgrService; AppTubeSettingMgrService appTubeSettingMgrService;
@Resource @Resource
ProjCfgMgrService appProjInfoMgr; ProjCfgMgrService appProjInfoMgr;
@Resource @Resource
ProjectProcessContextMgrService projectProcessContextMgrService;
TubeFeedingCtrlService stc;
// //
// HardwareOperation // 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) { if (!scanResult.tube[i].isTubeExist) {
tube.setState(TubeState.EMPTY); tube.setState(TubeState.EMPTY);
return A8kEcode.SUC; return A8kEcode.SUC;
} }
tube.setState(TubeState.TO_BE_PROCESSED); tube.setState(TubeState.TO_BE_PROCESSED);
tube.setIsHighTube(scanResult.tube[i].isHighTube); tube.setIsHighTube(scanResult.tube[i].isHighTube);
//首先赋值默认值 //首先赋值默认值
tube.setBloodType(BloodType.WHOLE_BLOOD); tube.setBloodType(BloodType.WHOLE_BLOOD);
tube.setSampleBarcode(""); tube.setSampleBarcode("");
@ -119,63 +123,48 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
if (tube.getProjInfo() == null) { if (tube.getProjInfo() == null) {
logger.error("项目信息不存在,{}", setting.tubeSettings[i].projIndex); 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; return A8kEcode.APPE_PROJ_INFO_IS_NOT_EXIST;
} }
} }
if (tube.getUserid().isEmpty()) {
tube.setUserid(genUserId(i));
}
return A8kEcode.SUC;
//补全试管中的项目信息
//最后赋值扫描到的数值
//
//TODO:添加请求后台的代码 //TODO:添加请求后台的代码
// //
// state.tubeStates[i].bloodType = ; // state.tubeStates[i].bloodType = ;
// state.tubeStates[i].sampleBarcode = setting.tubeSettings[i].sampleBarcode; // state.tubeStates[i].sampleBarcode = setting.tubeSettings[i].sampleBarcode;
// state.tubeStates[i].userid = setting.tubeSettings[i].userid; // state.tubeStates[i].userid = setting.tubeSettings[i].userid;
// state.tubeStates[i].projIndex = setting.tubeSettings[i].projIndex; // state.tubeStates[i].projIndex = setting.tubeSettings[i].projIndex;
if (tube.getProjIndex().isEmpty()) {
logger.error("试管{}待做项目为空", i);
return A8kEcode.APPE_PROJ_INDEX_IS_EMPTY;
} }
TubeHolder parseScanResult(TubeHolderScanResult scanResult) throws AppException {
return A8kEcode.SUC;
}
TubeHolder parseScanResult(TubeHolderScanResult scanResult, TubeHolderSetting setting) {
TubeHolder tubeholder = new TubeHolder(); TubeHolder tubeholder = new TubeHolder();
TubeHolderSetting setting = appTubeSettingMgrService.interUseGetThelastActiveTubeHolderSettingAndLock();
try {
Assert.isTrue(setting == null || setting.tubeSettings.length == tubeholder.tubes.length, "试管架配置信息与试管数量不匹配");
//获取试管架类型 //获取试管架类型
A8kTubeHolderType tubeHolderType = A8kTubeHolderType.of(scanResult.tubeHolderType); A8kTubeHolderType tubeHolderType = A8kTubeHolderType.of(scanResult.tubeHolderType);
if (tubeHolderType == null) { if (tubeHolderType == null) {
logger.error("不支持的试管架类型,{}", scanResult.tubeHolderType);
ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_TUBE_HOLDER_TYPE_IS_NOT_SUPPORT)); ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.APPE_TUBE_HOLDER_TYPE_IS_NOT_SUPPORT));
return null; 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++) { 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));
A8kEcode ecode = initOneTube(tubeholder.tubes[i], i, scanResult, setting);
if (!ecode.equals(A8kEcode.SUC)) {
ebus.pushEvent(new AppWarningNotifyEvent(new TubeError(ecode, i)));
return null; return null;
} }
} }
//设置试管架状态 //设置试管架状态
tubeholder.setState(TubeHolderState.PROCESSING); tubeholder.setState(TubeHolderState.PROCESSING);
//删除之前的试管架配置
appTubeSettingMgrService.interUseRemoveTubeHolderSetting(setting);
return tubeholder; return tubeholder;
} catch (AppException e) {
//回滚部分状态
if (setting != null)
appTubeSettingMgrService.interUseUnlockTubeHolderSetting(setting.uuid);
throw e;
}
} }
@ -189,14 +178,17 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
} }
logger.info("扫描到一个试管架:{}", scanResult); logger.info("扫描到一个试管架:{}", scanResult);
logger.info("解析扫描结果"); logger.info("解析扫描结果");
TubeHolder tubeholder = parseScanResult(scanResult);
TubeHolderSetting setting = appTubeSettingMgrService.interUseGetThelastActiveTubeHolderSettingAndLock();
TubeHolder tubeholder = parseScanResult(scanResult, setting);
if (tubeholder == null) { if (tubeholder == null) {
appTubeSettingMgrService.interUseUnlockTubeHolderSetting(setting);
logger.warn("结果解析异常"); logger.warn("结果解析异常");
doEjectHodler(); doEjectHodler();
return; return;
} }
appTubeSettingMgrService.interUseRemoveTubeHolderSetting(setting);
logger.info("更新试管架状态"); logger.info("更新试管架状态");
projectProcessContextMgrService.newTubeHolder(tubeholder); projectProcessContextMgrService.newTubeHolder(tubeholder);
} }
@ -209,32 +201,5 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction {
return List.of(A8kPublicResourceType.ShakeModule); 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;
}
} }

4
src/main/java/a8k/service/app/appdata/ReactionRecordMgrService.java

@ -41,6 +41,10 @@ public class ReactionRecordMgrService {
return reactionRecordDBService.getAll(); return reactionRecordDBService.getAll();
} }
public void addRecord(ProjProcessContext projContext, List<ReactionResult> results) {
addRecord(projContext, results.toArray(new ReactionResult[0]));
}
public void addRecord(ProjProcessContext projContext, ReactionResult... reactionResults) { public void addRecord(ProjProcessContext projContext, ReactionResult... reactionResults) {
ReactionResultRecord record = new ReactionResultRecord(); ReactionResultRecord record = new ReactionResultRecord();

19
src/main/java/a8k/service/app/appstate/ProjectProcessContextMgrService.java

@ -108,7 +108,11 @@ public class ProjectProcessContextMgrService {
sampleRecord.bloodType = tube.getBloodType(); sampleRecord.bloodType = tube.getBloodType();
sampleRecord.isEmergency = tube.getIsEmergency(); sampleRecord.isEmergency = tube.getIsEmergency();
sampleRecord.sampleBarcode = tube.getSampleBarcode(); sampleRecord.sampleBarcode = tube.getSampleBarcode();
if (tube.getUserid().isEmpty()) {
sampleRecord.userid = sampleRecord.sampleid;
} else {
sampleRecord.userid = tube.getUserid(); sampleRecord.userid = tube.getUserid();
}
sampleRecord.projIndex = tube.getProjIndex(); sampleRecord.projIndex = tube.getProjIndex();
tube.setSampleId(sampleRecord.sampleid); tube.setSampleId(sampleRecord.sampleid);
sampleRecordDBService.add(sampleRecord); sampleRecordDBService.add(sampleRecord);
@ -231,7 +235,7 @@ public class ProjectProcessContextMgrService {
synchronized public Boolean takeResourceConsumable(Tube tube) { synchronized public Boolean takeResourceConsumable(Tube tube) {
for (Integer projIndex : tube.getProjIndex()) { for (Integer projIndex : tube.getProjIndex()) {
ProjProcessContext cxt = getProjProcessContext(tube.getSampleId(), projIndex); ProjProcessContext cxt = getProjProcessContext(tube.getSampleId(), projIndex);
Assert.isTrue(cxt != null,"cxt != null");
Assert.isTrue(cxt != null, "cxt != null");
cxt.consumable = consumablesMgrService.takeConsumables(projIndex); cxt.consumable = consumablesMgrService.takeConsumables(projIndex);
if (cxt.consumable == null) { if (cxt.consumable == null) {
return false; return false;
@ -245,7 +249,7 @@ public class ProjectProcessContextMgrService {
var subtanks = incubationState.subtanks; var subtanks = incubationState.subtanks;
for (Integer projIndex : tube.getProjIndex()) { for (Integer projIndex : tube.getProjIndex()) {
ProjProcessContext cxt = getProjProcessContext(tube.getSampleId(), projIndex); ProjProcessContext cxt = getProjProcessContext(tube.getSampleId(), projIndex);
Assert.isTrue(cxt != null,"cxt != null");
Assert.isTrue(cxt != null, "cxt != null");
cxt.incubatorPos = incubationPlateStateMgrService.takeOneIncubationIDLEPos(); cxt.incubatorPos = incubationPlateStateMgrService.takeOneIncubationIDLEPos();
if (cxt.incubatorPos == null) { if (cxt.incubatorPos == null) {
return false; return false;
@ -259,7 +263,7 @@ public class ProjectProcessContextMgrService {
synchronized public Boolean takeResourceTip(Tube tube) { synchronized public Boolean takeResourceTip(Tube tube) {
for (Integer projIndex : tube.getProjIndex()) { for (Integer projIndex : tube.getProjIndex()) {
ProjProcessContext cxt = getProjProcessContext(tube.getSampleId(), projIndex); ProjProcessContext cxt = getProjProcessContext(tube.getSampleId(), projIndex);
Assert.isTrue(cxt != null,"cxt != null");
Assert.isTrue(cxt != null, "cxt != null");
A8kReactionFlowType flow = projCfgMgrService.getReactionFlowType(projIndex); A8kReactionFlowType flow = projCfgMgrService.getReactionFlowType(projIndex);
cxt.tipPos = consumablesMgrService.takeTip(flow); cxt.tipPos = consumablesMgrService.takeTip(flow);
if (cxt.tipPos == null) { if (cxt.tipPos == null) {
@ -272,7 +276,7 @@ public class ProjectProcessContextMgrService {
synchronized public void bakAllTubeAResource(Tube tube) { synchronized public void bakAllTubeAResource(Tube tube) {
for (Integer projIndex : tube.getProjIndex()) { for (Integer projIndex : tube.getProjIndex()) {
ProjProcessContext cxt = getProjProcessContext(tube.getSampleId(), projIndex); ProjProcessContext cxt = getProjProcessContext(tube.getSampleId(), projIndex);
Assert.isTrue(cxt != null,"cxt != null");
Assert.isTrue(cxt != null, "cxt != null");
if (cxt.tipPos != null) { if (cxt.tipPos != null) {
consumablesMgrService.backTipList(cxt.tipPos); consumablesMgrService.backTipList(cxt.tipPos);
@ -292,7 +296,7 @@ public class ProjectProcessContextMgrService {
synchronized public void prepareProjInfoData(Tube tube) { synchronized public void prepareProjInfoData(Tube tube) {
for (Integer projIndex : tube.getProjIndex()) { for (Integer projIndex : tube.getProjIndex()) {
ProjProcessContext cxt = getProjProcessContext(tube.getSampleId(), projIndex); 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); cxt.projCfg = projCfgMgrService.findByProjIndexWithCheck(cxt.consumable.lotId);
} }
} }
@ -351,9 +355,10 @@ public class ProjectProcessContextMgrService {
OptScanModule optScanModule = gstate.getOptScanModule(); OptScanModule optScanModule = gstate.getOptScanModule();
optScanModule.state = OptScanModuleState.PLATE_IS_READY; optScanModule.state = OptScanModuleState.PLATE_IS_READY;
optScanModule.syncCfg(tank); optScanModule.syncCfg(tank);
incubationPlateStateMgrService.resetIncubatorPos(tank.getPos());
} }
synchronized public void dropPlate() {
synchronized public void setOptModuleStateToEmpty() {
OptScanModule optScanModule = gstate.getOptScanModule(); OptScanModule optScanModule = gstate.getOptScanModule();
optScanModule.state = OptScanModuleState.EMPTY; optScanModule.state = OptScanModuleState.EMPTY;
} }
@ -365,7 +370,7 @@ public class ProjectProcessContextMgrService {
synchronized public void finishProcessProj(String sampleId, Integer projIndex) { synchronized public void finishProcessProj(String sampleId, Integer projIndex) {
ProjProcessContext cxt = getProjProcessContext(sampleId, projIndex); ProjProcessContext cxt = getProjProcessContext(sampleId, projIndex);
Assert.isTrue(cxt != null,"cxt != null");
Assert.isTrue(cxt != null, "cxt != null");
cxt.state = ProjProcessState.FINISH; cxt.state = ProjProcessState.FINISH;
} }

2
src/main/java/a8k/service/app/appstate/type/Tube.java

@ -32,7 +32,7 @@ public class Tube {
return ProjBriefInfo.toPorjIndex(projInfo); return ProjBriefInfo.toPorjIndex(projInfo);
} }
public List<String> getProjIndexStrList(){
public List<String> getProjIndexStrList() {
List<String> projIndexStrList = new ArrayList<>(); List<String> projIndexStrList = new ArrayList<>();
for (ProjBriefInfo info : projInfo) { for (ProjBriefInfo info : projInfo) {
projIndexStrList.add(info.projShotName); projIndexStrList.add(info.projShotName);

8
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.pagecontrol.ExtApiTabConfig;
import a8k.extapi_controler.utils.ExtApiFn; import a8k.extapi_controler.utils.ExtApiFn;
import a8k.extapi_controler.utils.ExtApiTab; 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.ctrlservice.PlateBoxCtrlService;
import a8k.service.app.devicectrl.driver.HbotDriver; import a8k.service.app.devicectrl.driver.HbotDriver;
import a8k.service.app.devicectrl.driver.MiniServoDriver; import a8k.service.app.devicectrl.driver.MiniServoDriver;
@ -42,7 +42,7 @@ public class ReactionPlatesTransmitControlerCalibration {
@Resource @Resource
PlateBoxCtrlService plateBoxCtrlService; PlateBoxCtrlService plateBoxCtrlService;
@Resource @Resource
OptScanModule optScanModule;
OptScanModuleCtrlService optScanModuleCtrlService;
@Resource @Resource
PipetteCtrlDriver pipetteCtrlDriver; PipetteCtrlDriver pipetteCtrlDriver;
@ -232,8 +232,8 @@ public class ReactionPlatesTransmitControlerCalibration {
@ExtApiFn(name = "反应板.推一丢一", group = "校验", order = 1003) @ExtApiFn(name = "反应板.推一丢一", group = "校验", order = 1003)
public void pushOneAndRemove(ConsumableGroup PBCh, IncubatorPos incubatorPos) throws AppException { public void pushOneAndRemove(ConsumableGroup PBCh, IncubatorPos incubatorPos) throws AppException {
plateBoxCtrlService.pushPlateQuick(PBCh, incubatorPos); plateBoxCtrlService.pushPlateQuick(PBCh, incubatorPos);
optScanModule.pullPlate(incubatorPos);
optScanModule.dropPlate();
optScanModuleCtrlService.pullPlate(incubatorPos);
optScanModuleCtrlService.dropPlate();
} }
@ExtApiFn(name = "反应板.推所有丢所有", group = "校验", order = 1004) @ExtApiFn(name = "反应板.推所有丢所有", group = "校验", order = 1004)

5
src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModule.java → src/main/java/a8k/service/app/devicectrl/ctrlservice/OptScanModuleCtrlService.java

@ -2,12 +2,9 @@ package a8k.service.app.devicectrl.ctrlservice;
import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; import a8k.extapi_controler.pagecontrol.ExtApiTabConfig;
import a8k.extapi_controler.utils.ExtApiTab; import a8k.extapi_controler.utils.ExtApiTab;
import a8k.hardware.A8kCanBusService;
import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver; import a8k.service.app.devicectrl.driver.StepMotorCtrlDriver;
import a8k.service.app.devicectrl.driver.type.StepMotorMId; import a8k.service.app.devicectrl.driver.type.StepMotorMId;
import a8k.service.app.devicectrl.param.OptModuleParamsMgr; 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.service.bases.ActionReactorService;
import a8k.type.IncubatorPos; import a8k.type.IncubatorPos;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
@ -18,7 +15,7 @@ import org.springframework.stereotype.Component;
@Component @Component
@Slf4j @Slf4j
@ExtApiTab(cfg = ExtApiTabConfig.ReactionPlatesTransmitCtrl) @ExtApiTab(cfg = ExtApiTabConfig.ReactionPlatesTransmitCtrl)
public class OptScanModule {
public class OptScanModuleCtrlService {
static final Integer overtime = 10000; static final Integer overtime = 10000;

10
src/main/java/a8k/service/app/devicectrl/script/DeviceCtrlScripter.java

@ -1,6 +1,6 @@
package a8k.service.app.devicectrl.script; 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.service.bases.ActionReactorService;
import a8k.type.IncubatorPos; import a8k.type.IncubatorPos;
import a8k.type.exception.AppException; import a8k.type.exception.AppException;
@ -16,15 +16,15 @@ public class DeviceCtrlScripter {
ActionReactorService actionReactor; ActionReactorService actionReactor;
@Resource @Resource
OptScanModule optScanModule;
OptScanModuleCtrlService optScanModuleCtrlService;
public void dropAllPlates() throws AppException { public void dropAllPlates() throws AppException {
log.info("清空孵育盘"); log.info("清空孵育盘");
actionReactor.dosome("丢板", () -> optScanModule.dropPlate());
actionReactor.dosome("丢板", () -> optScanModuleCtrlService.dropPlate());
for (var incubatorPos : IncubatorPos.values()) { 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());
} }
} }
} }

5
src/main/java/a8k/service/bases/appevent/AppWarningNotifyEvent.java

@ -15,9 +15,4 @@ public class AppWarningNotifyEvent extends AppEvent {
super(AppWarningNotifyEvent.class.getSimpleName()); super(AppWarningNotifyEvent.class.getSimpleName());
this.error = new AppError(errorCode); this.error = new AppError(errorCode);
} }
public AppWarningNotifyEvent(Integer errorCode) {
super(AppWarningNotifyEvent.class.getSimpleName());
this.error = new AppError(A8kEcode.fromInt(errorCode));
}
} }

13
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;
}
}
Loading…
Cancel
Save