diff --git a/README.md b/README.md index f5bc27f..e0c5245 100644 --- a/README.md +++ b/README.md @@ -144,7 +144,11 @@ TODO: ``` DO_ENTER_TUBEHOLDER_AND_SCAN(入料) -> 修改试管架状态为READY - DO_ + DO_SWITCH_TO_THE_NEXT_TUBE + -> + + + DO_CHECK_TUBE_IS_OK_TO_PROCESS(检查试管是否可以被处理,如果检查不合格,则不切换状态) -> 修改试管状态为PROCESSING @@ -164,11 +168,25 @@ TODO: DO_PUSH_REACTION_PLATE(推出反应板) - DO_OPT_SCAN - +``` + + +``` +任务列表: + 0. 重新思考整个系统的状态 + + 1. 尽可能完成整个流程的控制,如果中间缺少某些位置参数,则只修改状态,让整个流程执行下去。 + 2. 支持急诊位置 + 3. 根据配置,修改对应的动作的细节,使其支持更多的试管架类型,更多的项目类型。 + 4. 完善日志 + + 3. 完成剩余动作的校准工作。(取样本,取耗材,滴定,光学扫描,结果分析) + 5. 添加温度控制。 + 5. 支持吸空检测。 + 6. 支持反应板夹类型检测。 ``` \ No newline at end of file diff --git a/src/main/java/a8k/controler/extapi/pagecontrol/ExtApiTabConfig.java b/src/main/java/a8k/controler/extapi/pagecontrol/ExtApiTabConfig.java index 668e775..c183e4e 100644 --- a/src/main/java/a8k/controler/extapi/pagecontrol/ExtApiTabConfig.java +++ b/src/main/java/a8k/controler/extapi/pagecontrol/ExtApiTabConfig.java @@ -6,6 +6,7 @@ public enum ExtApiTabConfig { AppDeviceCtrlService("应用控制.应用控制", true), AppConsumablesMgrService("应用控制.耗材管理", true), AppTubeSettingMgrService("应用控制.试管(样本)配置", true),//OK + AppEmergencySamplePosStateMgrService("应用控制.急诊位状态管理", true),//OK AppUserMgrService("应用数据.用户管理", true), //Ok AppSettingsMgr("应用数据.设备配置管理", true), //OK diff --git a/src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java b/src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java index ab44b74..6ba0ae1 100644 --- a/src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java +++ b/src/main/java/a8k/hardware/type/a8kcanprotocol/A8kEcode.java @@ -56,6 +56,7 @@ public enum A8kEcode { TubeHolderSettingIsLocked(138),//试管架设置被锁定 TubeHolderSettingNotFound(139),//试管架设置未找到 TubeHolderTypeIsNotSupport(140),//试管架类型不支持 + EmergencySampleIsProcessing(141),//急诊样本正在处理中 /** * 特殊服务错误码 @@ -224,10 +225,10 @@ public enum A8kEcode { WaterCoolingPumpIsError(1903), WaterCoolingPelterIsError(1904), - ; + ; public final int index; - public int unknownIndex = 0; + public int unknownIndex = 0; A8kEcode(int index) { this.index = index; @@ -257,4 +258,4 @@ public enum A8kEcode { return String.format("unkown(%d)", id); } - } +} diff --git a/src/main/java/a8k/service/appdevicectrl/AppEmergencySamplePosStateMgrService.java b/src/main/java/a8k/service/appdevicectrl/AppEmergencySamplePosStateMgrService.java new file mode 100644 index 0000000..883f1da --- /dev/null +++ b/src/main/java/a8k/service/appdevicectrl/AppEmergencySamplePosStateMgrService.java @@ -0,0 +1,73 @@ +package a8k.service.appdevicectrl; + +import a8k.controler.extapi.pagecontrol.ExtApiTabConfig; +import a8k.controler.extapi.utils.EnginnerPageActionParam; +import a8k.controler.extapi.utils.ExtApiFn; +import a8k.controler.extapi.utils.ExtApiTab; +import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.service.appstate.AppA8kGStateService; +import a8k.service.appstate.type.EmergencyPosRunState; +import a8k.service.bak_appbase.progress.EmergencySampleState; +import a8k.type.exception.AppException; +import a8k.type.type.BloodType; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +@ExtApiTab(cfg = ExtApiTabConfig.AppEmergencySamplePosStateMgrService) +@Component +public class AppEmergencySamplePosStateMgrService { + + @Resource + AppA8kGStateService gstate; + + /* + * 状态变化 + * + * 初始时: + * getEmergencyPosRunState() -> state = IDLE + * + * 提交样本配置后 + * getEmergencySampleSetting() -> state = PENDING + * + * 提交样本配置,且机器开始处理急诊样本时候 + * getEmergencyPosRunState() -> state = PROCESSING + * + * 机器处理完急诊样本后 + * getEmergencyPosRunState() -> state = FINISHED + */ + + + /** + * 提交紧急样本设置 + * @param userid 用户ID + * @param barcodeid 样本条码 + * @param bloodType 血型 + * @param projIndexList + * + * 提交后就默认样本已经放置好了,所以需要前台提醒用户需要先暂停设备,放好样本 + */ + @ExtApiFn(name = "提交紧急样本设置", group = "紧急样本设置") + public void commitEmergencySampleSetting(String userid, String barcodeid, BloodType bloodType,// + @EnginnerPageActionParam(name = "逗号分割项目列表(例子1,2,3)") String projIndexList) throws AppException { + EmergencyPosRunState state = gstate.getEmergencyPosRunState(); + if (state.state.equals(EmergencySampleState.IDLE) || state.state.equals(EmergencySampleState.FINISHED)) { + state.userid = userid; + state.bloodType = bloodType; + state.barcodeid = barcodeid; + state.projIndex.clear(); + for (String index : projIndexList.split(",")) { + state.projIndex.add(Integer.parseInt(index)); + } + state.state = EmergencySampleState.PENDING; + } else { + throw new AppException(A8kEcode.EmergencySampleIsProcessing.index); + } + } + + @ExtApiFn(name = "获取急诊样本位状态", group = "急诊样本位状态") + public EmergencyPosRunState getEmergencyPosRunState() { + return gstate.getEmergencyPosRunState(); + } + + +} diff --git a/src/main/java/a8k/service/appdevicectrl/action/DO_EJECT_TUBEHOLDER.java b/src/main/java/a8k/service/appdevicectrl/action/DO_EJECT_TUBEHOLDER.java index 5bdc2b0..c1d2ae7 100644 --- a/src/main/java/a8k/service/appdevicectrl/action/DO_EJECT_TUBEHOLDER.java +++ b/src/main/java/a8k/service/appdevicectrl/action/DO_EJECT_TUBEHOLDER.java @@ -33,8 +33,6 @@ public class DO_EJECT_TUBEHOLDER extends A8kStepAction { mfcs = gstate.mainFlowCtrlState; } - - @Override public void doaction() throws AppException { stc.ejectTubeHolder(); stc.moveTubeRackMoveToEnterPos(); diff --git a/src/main/java/a8k/service/appdevicectrl/action/DO_START.java b/src/main/java/a8k/service/appdevicectrl/action/DO_START.java index 5aab0b2..87e4703 100644 --- a/src/main/java/a8k/service/appdevicectrl/action/DO_START.java +++ b/src/main/java/a8k/service/appdevicectrl/action/DO_START.java @@ -37,6 +37,8 @@ public class DO_START extends A8kStepAction { @Override public void doaction() throws AppException { if (gstate.mainFlowCtrlState.workState.equals(A8kWorkState.IDLE)) { sstc.ejectTubeHolder(); + //TODO: 弹出所有反应板夹 + } gstate.mainFlowCtrlState.workState = A8kWorkState.WORKING; } diff --git a/src/main/java/a8k/service/appstate/AppA8kGStateService.java b/src/main/java/a8k/service/appstate/AppA8kGStateService.java index 8a3650a..f27b77d 100644 --- a/src/main/java/a8k/service/appstate/AppA8kGStateService.java +++ b/src/main/java/a8k/service/appstate/AppA8kGStateService.java @@ -28,18 +28,21 @@ public class AppA8kGStateService { //设备工作状态标识位 A8kWorkState workState = A8kWorkState.IDLE; // + //当前正在被处理的试管架状态 - TubeHolderState tubeHolderState = new TubeHolderState(); + TubeHolderState tubeHolderState = new TubeHolderState(); //急诊为状态 - EmergencyPosRunState emergencyPosRunState = new EmergencyPosRunState(); + EmergencyPosRunState emergencyPosRunState = new EmergencyPosRunState(); //孵育盘状态 - IncubationPlateStatus incubationPlateStatus = new IncubationPlateStatus(); + IncubationPlateStatus incubationPlateStatus = new IncubationPlateStatus(); + // + // 耗材状态,试管配置,急诊位样本配置,均是前端提交的设置信息 + // //耗材状态 - ConsumableState consumableState = new ConsumableState(); + ConsumableState consumableState = new ConsumableState(); //试管配置 - List tubeHolderSettings = new ArrayList<>(); - + List tubeHolderSettings = new ArrayList<>(); public MainFlowCtrlState mainFlowCtrlState = new MainFlowCtrlState(); diff --git a/src/main/java/a8k/service/appstate/type/EmergencyPosRunState.java b/src/main/java/a8k/service/appstate/type/EmergencyPosRunState.java index f56633f..f119278 100644 --- a/src/main/java/a8k/service/appstate/type/EmergencyPosRunState.java +++ b/src/main/java/a8k/service/appstate/type/EmergencyPosRunState.java @@ -1,14 +1,16 @@ package a8k.service.appstate.type; -import a8k.type.sampleinfo.SampleInfo; -import a8k.service.bak_appbase.result.ReactionResult; -import a8k.service.bak_appbase.progress.EmergencySampleProgress; +import a8k.service.bak_appbase.progress.EmergencySampleState; +import a8k.type.type.BloodType; + +import java.util.ArrayList; +import java.util.List; public class EmergencyPosRunState { - //急诊位状态 - public EmergencySampleProgress emergencySampleProgress = EmergencySampleProgress.IDLE; - //样本位状态 - SampleInfo sampleState = new SampleInfo(); //绑定的样本运行状态 - //急诊位反应结果 - public ReactionResult emergencyResult = new ReactionResult(); + public String userid = ""; //用户输入的样本ID,不做逻辑,只做展示 + public String barcodeid = ""; //用于请求用户信息的条码ID + public List projIndex = new ArrayList<>(); //项目代码 + public BloodType bloodType = BloodType.WHOLE_BLOOD; //血型 + + public EmergencySampleState state = EmergencySampleState.IDLE; //急诊位状态 } diff --git a/src/main/java/a8k/service/bak_appbase/progress/EmergencySampleProgress.java b/src/main/java/a8k/service/bak_appbase/progress/EmergencySampleProgress.java deleted file mode 100644 index e3dc41e..0000000 --- a/src/main/java/a8k/service/bak_appbase/progress/EmergencySampleProgress.java +++ /dev/null @@ -1,8 +0,0 @@ -package a8k.service.bak_appbase.progress; - -public enum EmergencySampleProgress { - IDLE,// - WAITING_SAMPLE,// - PROCESSING,// - PROCESS_COMPLETE,// -} diff --git a/src/main/java/a8k/service/bak_appbase/progress/EmergencySampleState.java b/src/main/java/a8k/service/bak_appbase/progress/EmergencySampleState.java new file mode 100644 index 0000000..8a18320 --- /dev/null +++ b/src/main/java/a8k/service/bak_appbase/progress/EmergencySampleState.java @@ -0,0 +1,8 @@ +package a8k.service.bak_appbase.progress; + +public enum EmergencySampleState { + IDLE,// + PENDING,// + PROCESSING,// + FINISHED,// +} diff --git a/src/main/java/a8k/type/type/BloodType.java b/src/main/java/a8k/type/type/BloodType.java index b20ab37..2719821 100644 --- a/src/main/java/a8k/type/type/BloodType.java +++ b/src/main/java/a8k/type/type/BloodType.java @@ -2,5 +2,5 @@ package a8k.type.type; public enum BloodType { WHOLE_BLOOD,//全血 - SERUM;//血清或者血浆 + SERUM_OR_PLASMA,//血清或者血浆 } diff --git a/src/main/java/a8k/type/type/SupportBloodType.java b/src/main/java/a8k/type/type/SupportBloodType.java new file mode 100644 index 0000000..a4d47f4 --- /dev/null +++ b/src/main/java/a8k/type/type/SupportBloodType.java @@ -0,0 +1,18 @@ +package a8k.type.type; + +//ID卡中的类型 +public enum SupportBloodType { + WHOLE_BLOOD(0),//全血 + PLASMA(1),//血浆 + SERUM(2), + SERUM_AND_PLASMA(3),//血清或者血浆 + WHOLE_BLOOD_AND_PLASMA(4),//全血和血浆 + WHOLE_BLOOD_AND_SERUM_AND_PLASMA(5),//全血和血清或者血浆 + URINE(6),//尿液 + FAECES(7),//粪便 + ; + final int index; + SupportBloodType(int index) { + this.index = index; + } +}