|
|
@ -1,5 +1,7 @@ |
|
|
|
package a8k.service.app.appctrl.mainflowctrl.action; |
|
|
|
|
|
|
|
import a8k.service.app.appdata.AppProjInfoMgrService; |
|
|
|
import a8k.service.app.appstate.type.Tube; |
|
|
|
import a8k.service.bases.AppEventBusService; |
|
|
|
import a8k.service.bases.appevent.AppWarningNotifyEvent; |
|
|
|
import a8k.hardware.A8kCanBusService; |
|
|
@ -15,6 +17,7 @@ import a8k.service.app.appstate.type.TubeHolder; |
|
|
|
import a8k.service.app.appstate.type.state.TubeHolderState; |
|
|
|
import a8k.service.app.appstate.type.state.TubeState; |
|
|
|
import a8k.service.app.devicedriver.ctrl.SampleScanTransportCtrl; |
|
|
|
import a8k.service.db.type.A8kProjectInfo; |
|
|
|
import a8k.type.exception.AppException; |
|
|
|
import a8k.type.tube_setting.TubeHolderSetting; |
|
|
|
import a8k.type.type.A8kTubeHolderType; |
|
|
@ -59,19 +62,21 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { |
|
|
|
|
|
|
|
|
|
|
|
@Resource |
|
|
|
GStateService gstate; |
|
|
|
GStateService gstate; |
|
|
|
@Resource |
|
|
|
CondtionMgrService cmgr; |
|
|
|
CondtionMgrService cmgr; |
|
|
|
@Resource |
|
|
|
SampleScanTransportCtrl stc; |
|
|
|
SampleScanTransportCtrl stc; |
|
|
|
@Resource |
|
|
|
AppEventBusService ebus; |
|
|
|
AppEventBusService ebus; |
|
|
|
@Resource |
|
|
|
A8kCanBusService canBus; |
|
|
|
A8kCanBusService canBus; |
|
|
|
@Resource |
|
|
|
TubeSettingMgrService tubeSettingMgrService; |
|
|
|
TubeSettingMgrService tubeSettingMgrService; |
|
|
|
@Resource |
|
|
|
TubeStateMgrService tubeStateMgrService; |
|
|
|
TubeStateMgrService tubeStateMgrService; |
|
|
|
@Resource |
|
|
|
AppProjInfoMgrService appProjInfoMgr; |
|
|
|
|
|
|
|
|
|
|
|
SampleScanResult scanTubeHodler() throws AppException { |
|
|
@ -93,7 +98,6 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { |
|
|
|
String tubeType = stc.moveTubeRackToScanPosAndScan(); |
|
|
|
if (tubeType.isEmpty()) { |
|
|
|
logger.warn("扫描试管架类型失败,弹出试管架"); |
|
|
|
stc.ejectTubeHolder(); |
|
|
|
ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.ScanTubeholderTypeTimeout)); |
|
|
|
return null; |
|
|
|
} |
|
|
@ -118,7 +122,6 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { |
|
|
|
if (!hasTube) { |
|
|
|
logger.error("试管架中没有试管"); |
|
|
|
ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.TubeHolderTypeIsNotSupport)); |
|
|
|
stc.ejectTubeHolder(); |
|
|
|
return null; |
|
|
|
} |
|
|
|
result.tubeHolderType = tubeType; |
|
|
@ -126,66 +129,81 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { |
|
|
|
return result; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
A8kEcode parseOneTube(Tube tube, Integer i, SampleScanResult scanResult, TubeHolderSetting setting) { |
|
|
|
|
|
|
|
if (!scanResult.tubesScanResults[i].isTubeExist) { |
|
|
|
tube.state = TubeState.EMPTY; |
|
|
|
return A8kEcode.NoError; |
|
|
|
} |
|
|
|
|
|
|
|
tube.state = TubeState.TO_BE_PROCESSED; |
|
|
|
tube.isHighTube = scanResult.tubesScanResults[i].isHighTube; |
|
|
|
|
|
|
|
|
|
|
|
//首先赋值默认值 |
|
|
|
tube.bloodType = BloodType.WHOLE_BLOOD; |
|
|
|
tube.sampleBarcode = ""; |
|
|
|
tube.userid = ""; |
|
|
|
tube.projInfo = List.of();//不做任何项目 |
|
|
|
|
|
|
|
//然后赋值用户配置的数值 |
|
|
|
if (setting != null) { |
|
|
|
tube.bloodType = setting.tubeSettings[i].bloodType; |
|
|
|
tube.sampleBarcode = setting.tubeSettings[i].sampleBarcode; |
|
|
|
tube.userid = setting.tubeSettings[i].userid; |
|
|
|
tube.projInfo = appProjInfoMgr.getProjBrifInfo(setting.tubeSettings[i].projIndex); |
|
|
|
if (tube.projInfo == null) { |
|
|
|
logger.error("项目信息不存在,{}", setting.tubeSettings[i].projIndex); |
|
|
|
ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.ProjInfoIsNotExist)); |
|
|
|
return A8kEcode.ProjInfoIsNotExist; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (tube.userid.isEmpty()) { |
|
|
|
tube.userid = genUserId(i); |
|
|
|
} |
|
|
|
return A8kEcode.NoError; |
|
|
|
|
|
|
|
//补全试管中的项目信息 |
|
|
|
//最后赋值扫描到的数值 |
|
|
|
// |
|
|
|
//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; |
|
|
|
} |
|
|
|
|
|
|
|
TubeHolder parseScanResult(SampleScanResult scanResult) throws AppException { |
|
|
|
TubeHolder state = new TubeHolder(); |
|
|
|
TubeHolderSetting setting = tubeSettingMgrService.getThelastActiveTubeHolderSettingAndLock(); |
|
|
|
TubeHolder tubeholder = new TubeHolder(); |
|
|
|
TubeHolderSetting setting = tubeSettingMgrService.getThelastActiveTubeHolderSettingAndLock(); |
|
|
|
try { |
|
|
|
//获取试管架类型 |
|
|
|
A8kTubeHolderType tubeHolderType = A8kTubeHolderType.of(scanResult.tubeHolderType); |
|
|
|
if (tubeHolderType == null) { |
|
|
|
logger.error("不支持的试管架类型"); |
|
|
|
ebus.pushEvent(new AppWarningNotifyEvent(A8kEcode.TubeHolderTypeIsNotSupport)); |
|
|
|
stc.ejectTubeHolder(); |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
assert setting == null || setting.tubeSettings.length == state.tubes.length; |
|
|
|
assert setting == null || setting.tubeSettings.length == tubeholder.tubes.length; |
|
|
|
|
|
|
|
//逐个赋值试管配置信息 |
|
|
|
updaetGroupId(); |
|
|
|
for (int i = 0; i < state.tubes.length; i++) { |
|
|
|
|
|
|
|
if (!scanResult.tubesScanResults[i].isTubeExist) { |
|
|
|
state.tubes[i].state = TubeState.EMPTY; |
|
|
|
continue; |
|
|
|
} |
|
|
|
|
|
|
|
state.tubes[i].state = TubeState.TO_BE_PROCESSED; |
|
|
|
state.tubes[i].isHighTube = scanResult.tubesScanResults[i].isHighTube; |
|
|
|
|
|
|
|
|
|
|
|
//首先赋值默认值 |
|
|
|
state.tubes[i].bloodType = BloodType.WHOLE_BLOOD; |
|
|
|
state.tubes[i].sampleBarcode = ""; |
|
|
|
state.tubes[i].userid = ""; |
|
|
|
state.tubes[i].projIndex = List.of();//不做任何项目 |
|
|
|
|
|
|
|
//然后赋值用户配置的数值 |
|
|
|
if (setting != null) { |
|
|
|
state.tubes[i].bloodType = setting.tubeSettings[i].bloodType; |
|
|
|
state.tubes[i].sampleBarcode = setting.tubeSettings[i].sampleBarcode; |
|
|
|
state.tubes[i].userid = setting.tubeSettings[i].userid; |
|
|
|
state.tubes[i].projIndex = setting.tubeSettings[i].projIndex; |
|
|
|
} |
|
|
|
|
|
|
|
if (state.tubes[i].userid.isEmpty()) { |
|
|
|
state.tubes[i].userid = genUserId(i); |
|
|
|
for (int i = 0; i < tubeholder.tubes.length; i++) { |
|
|
|
A8kEcode ecode = parseOneTube(tubeholder.tubes[i], i, scanResult, setting); |
|
|
|
if (ecode != A8kEcode.NoError) { |
|
|
|
ebus.pushEvent(new AppWarningNotifyEvent(ecode)); |
|
|
|
return null; |
|
|
|
} |
|
|
|
|
|
|
|
//最后赋值扫描到的数值 |
|
|
|
// |
|
|
|
//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.state = TubeHolderState.PROCESSING; |
|
|
|
tubeholder.state = TubeHolderState.PROCESSING; |
|
|
|
//删除之前的试管架配置 |
|
|
|
tubeSettingMgrService.removeTubeHolderSetting(setting); |
|
|
|
return state; |
|
|
|
return tubeholder; |
|
|
|
|
|
|
|
} catch (AppException e) { |
|
|
|
//回滚部分状态 |
|
|
@ -199,20 +217,22 @@ public class SEQ1_ENTER_TUBEHOLDER_AND_SCAN extends A8kStepAction { |
|
|
|
logger.info("开始扫描试管架"); |
|
|
|
var scanResult = scanTubeHodler(); |
|
|
|
if (scanResult == null) { |
|
|
|
stc.ejectTubeHolder(); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
logger.info("解析扫描结果"); |
|
|
|
TubeHolder state = parseScanResult(scanResult); |
|
|
|
if (state == null) { |
|
|
|
TubeHolder tubeholder = parseScanResult(scanResult); |
|
|
|
if (tubeholder == null) { |
|
|
|
stc.ejectTubeHolder(); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
logger.info("将样本信息写入数据库"); |
|
|
|
tubeStateMgrService.createNewTubeContexts(state.tubes); |
|
|
|
tubeStateMgrService.createNewTubeContexts(tubeholder.tubes); |
|
|
|
|
|
|
|
logger.info("更新试管架状态"); |
|
|
|
gstate.setTubeHolder(state); |
|
|
|
gstate.setTubeHolder(tubeholder); |
|
|
|
} |
|
|
|
|
|
|
|
@Override public Boolean checkCondition() { |
|
|
|