From aa1501f36f971181032f75dd2e7d1e30636df961 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 8 Oct 2024 17:07:46 +0800 Subject: [PATCH] update --- src/main/java/a8k/constant/AppConstant.java | 5 +- .../a8k/dbservice/type/ReactionResultRecord.java | 8 +- .../service/appctrl/action/opt/PLATE_OPT_SCAN.java | 85 ++++++++++++++++++++++ .../appdata/AppReactionResultMgrService.java | 61 +++++++++++++++- .../java/a8k/service/appstate/GStateService.java | 19 +++-- .../appstate/OptScanModuleStateMgrService.java | 5 ++ src/main/java/a8k/type/ReactionResult.java | 13 ++++ .../reaction_result_type/ReactionResultStatus.java | 5 +- 8 files changed, 182 insertions(+), 19 deletions(-) create mode 100644 src/main/java/a8k/service/appctrl/action/opt/PLATE_OPT_SCAN.java create mode 100644 src/main/java/a8k/type/ReactionResult.java diff --git a/src/main/java/a8k/constant/AppConstant.java b/src/main/java/a8k/constant/AppConstant.java index 6baa1a9..58e45e3 100644 --- a/src/main/java/a8k/constant/AppConstant.java +++ b/src/main/java/a8k/constant/AppConstant.java @@ -3,6 +3,7 @@ package a8k.constant; import a8k.type.Consumable; public class AppConstant { - public static final int CONSUMABLE_NUM = 25; - public static final int TIP_NUM = 120; + public static final int CONSUMABLE_NUM = 25; + public static final int TIP_NUM = 120; + public static final String APP_VERSION = "1.0.0"; } diff --git a/src/main/java/a8k/dbservice/type/ReactionResultRecord.java b/src/main/java/a8k/dbservice/type/ReactionResultRecord.java index 09a8546..7bba1e5 100644 --- a/src/main/java/a8k/dbservice/type/ReactionResultRecord.java +++ b/src/main/java/a8k/dbservice/type/ReactionResultRecord.java @@ -27,15 +27,17 @@ public class ReactionResultRecord { public int id = 0; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - public Date date = new Date(); + public Date date = new Date(); + //样本信息 public BloodType sampleBloodType = BloodType.WHOLE_BLOOD; //血液类型 public String sampleBarcode = ""; //用于请求用户信息的条码ID public String sampleUserid = ""; //用户输入的样本ID,不做逻辑,只做展示 + public String sampleId = ""; // 样本ID,由系统生成 //项目信息 - public String projName = ""; // 项目名称 - public String lotId = ""; // 批次名称 + public String projName = ""; // 项目名称 + public String lotId = ""; // 批次名称 public Integer projIndex = 0; // 项目名称代码 @JsonFormat(pattern = "yyyy-MM-dd") public Date expiryDate; // 有效日期 diff --git a/src/main/java/a8k/service/appctrl/action/opt/PLATE_OPT_SCAN.java b/src/main/java/a8k/service/appctrl/action/opt/PLATE_OPT_SCAN.java new file mode 100644 index 0000000..efc5696 --- /dev/null +++ b/src/main/java/a8k/service/appctrl/action/opt/PLATE_OPT_SCAN.java @@ -0,0 +1,85 @@ +package a8k.service.appctrl.action.opt; + +import a8k.OS; +import a8k.dbservice.type.ReactionResultRecord; +import a8k.service.appctrl.CondtionMgrService; +import a8k.service.appctrl.action.base.A8kActionStepType; +import a8k.service.appctrl.action.base.A8kStepAction; +import a8k.service.appdata.AppReactionResultMgrService; +import a8k.service.appstate.GStateService; +import a8k.service.appstate.IncubationPlateMgrService; +import a8k.service.appstate.OptScanModuleStateMgrService; +import a8k.service.appstate.TubeProcessStateMgrService; +import a8k.service.appstate.resource.A8kPublicResourceType; +import a8k.service.appstate.type.IncubationSubTank; +import a8k.service.appstate.type.MainFlowCtrlState; +import a8k.service.appstate.type.state.IncubationSubTankState; +import a8k.type.ReactionResult; +import a8k.type.exception.AppException; +import a8k.type.reaction_result_type.ReactionResultStatus; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * 处理错误的试管 + */ +@Component +public class PLATE_OPT_SCAN extends A8kStepAction { + static Logger logger = LoggerFactory.getLogger(PLATE_OPT_SCAN.class); + + PLATE_OPT_SCAN() { + super(A8kActionStepType.PLATE_OPT_SCAN); + } + + @Resource + GStateService gstate; + @Resource + CondtionMgrService cms; + @Resource + IncubationPlateMgrService incubationPlateMgrService; + @Resource + OptScanModuleStateMgrService optScanModuleStateMgrService; + @Resource + TubeProcessStateMgrService tubeProcessStateMgrService; + @Resource + AppReactionResultMgrService appReactionResultMgrService; + + + MainFlowCtrlState mfcs; + + @PostConstruct + void init() { + mfcs = gstate.mainFlowCtrlState; + } + + + @Override public void doaction() throws AppException { + optScanModuleStateMgrService.startScanPlate(); + logger.info("扫描板夹"); + //记录扫描结果 + + //修改板夹状态 + optScanModuleStateMgrService.dropPlate(); + + appReactionResultMgrService.addRecord(optScanModuleStateMgrService.getCurProjProcessContext(), + new ReactionResult(ReactionResultStatus.SUCCESS, "12.8 mg/L"), + new ReactionResult(ReactionResultStatus.ERROR_RESULT_OUT_OF_RANGE, "")); + } + + @Override public Boolean checkCondition() { + Boolean cond1 = cms.isCanDoAction(); + Boolean cond2 = !optScanModuleStateMgrService.isEmpty(); + return cond1 && cond2; + } + + @Override public List getResourceList() { + return List.of( + A8kPublicResourceType.OPTModule + ); + } +} diff --git a/src/main/java/a8k/service/appdata/AppReactionResultMgrService.java b/src/main/java/a8k/service/appdata/AppReactionResultMgrService.java index 5e9b9e7..c9d81d6 100644 --- a/src/main/java/a8k/service/appdata/AppReactionResultMgrService.java +++ b/src/main/java/a8k/service/appdata/AppReactionResultMgrService.java @@ -5,8 +5,17 @@ import a8k.controler.extapi.utils.ExtApiFn; import a8k.controler.extapi.utils.ExtApiTab; import a8k.dbservice.ReactionRecordDBService; import a8k.dbservice.type.ReactionResultRecord; +import a8k.service.appstate.GStateService; +import a8k.service.appstate.TubeProcessContextMgrService; +import a8k.service.appstate.type.ProjProcessContext; +import a8k.service.appstate.type.TubeProcessContext; +import a8k.type.ReactionResult; +import a8k.type.reaction_result_type.ReactionResultStatus; +import a8k.utils.ZJsonHelper; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.List; @@ -15,9 +24,20 @@ import java.util.List; @ExtApiTab(cfg = ExtApiTabConfig.AppReactionResultMgrService) public class AppReactionResultMgrService { + final static Logger logger = LoggerFactory.getLogger(AppReactionResultMgrService.class); + @Resource ReactionRecordDBService reactionRecordDBService; + @Resource + TubeProcessContextMgrService tubeProcessContextMgrService; + + @Resource + AppUserMgrService appUserMgrService; + + @Resource + GStateService gstate; + @PostConstruct public void init() { } @@ -27,9 +47,44 @@ public class AppReactionResultMgrService { return reactionRecordDBService.getAll(); } - @ExtApiFn(name = "添加测试记录") - public void addRecord() { - ReactionResultRecord record = new ReactionResultRecord(); + public void addRecord(ProjProcessContext projContext, ReactionResult... reactionResults) { + ReactionResultRecord record = new ReactionResultRecord(); + TubeProcessContext tubeContext = tubeProcessContextMgrService.getTubeContext(projContext.sampleId); + + String operator = appUserMgrService.getLoginUsr() != null ? appUserMgrService.getLoginUsr().account : "UNLOGIN"; + + record.sampleBloodType = tubeContext.bloodType; + record.sampleBarcode = tubeContext.sampleBarcode; + record.sampleUserid = tubeContext.userid; + record.sampleId = tubeContext.sampleid; + record.projName = projContext.projName; + record.lotId = projContext.a8kIdCardInfo.lotId; + record.projIndex = projContext.a8kIdCardInfo.projIndex; + record.expiryDate = projContext.a8kIdCardInfo.expiryDate; + record.operator = operator; + record.appVersion = gstate.getAppVersion(); + record.mcuVersion = gstate.getMcuVersion(); + record.sn = gstate.getSn(); + + + if (reactionResults.length == 1) { + record.subProjResultStatus1 = reactionResults[0].status; + record.subProjResult1 = reactionResults[0].result; + } else if (reactionResults.length == 2) { + record.subProjResultStatus1 = reactionResults[0].status; + record.subProjResult1 = reactionResults[0].result; + record.subProjResultStatus2 = reactionResults[1].status; + record.subProjResult2 = reactionResults[1].result; + } else if (reactionResults.length == 3) { + record.subProjResultStatus1 = reactionResults[0].status; + record.subProjResult1 = reactionResults[0].result; + record.subProjResultStatus2 = reactionResults[1].status; + record.subProjResult2 = reactionResults[1].result; + record.subProjResultStatus3 = reactionResults[2].status; + record.subProjResult3 = reactionResults[2].result; + } + + logger.info("addRecord: {}", ZJsonHelper.objectToJson(record)); reactionRecordDBService.add(record); } diff --git a/src/main/java/a8k/service/appstate/GStateService.java b/src/main/java/a8k/service/appstate/GStateService.java index 5c1d93d..794e1ba 100644 --- a/src/main/java/a8k/service/appstate/GStateService.java +++ b/src/main/java/a8k/service/appstate/GStateService.java @@ -1,5 +1,6 @@ package a8k.service.appstate; +import a8k.constant.AppConstant; import a8k.service.appctrl.type.app_consumables_mgr_service.ConsumableState; import a8k.service.appstate.type.*; import a8k.service.appstate.type.state.A8kWorkState; @@ -19,12 +20,9 @@ public class GStateService { public static final Logger logger = LoggerFactory.getLogger(GStateService.class); //温度 - Integer temperature = 25; + Integer temperature = 25; //设备是否初始化过 - Boolean deviceInited = false; - //设备工作状态标识位 - - + Boolean deviceInited = false; //当前正在被处理的试管架状态 TubeHolder tubeHolder = new TubeHolder(); //急诊为状态 @@ -35,14 +33,15 @@ public class GStateService { ConsumableState consumableState = new ConsumableState(); //光学模组状态 OptScanModule optScanModule = new OptScanModule(); - // - // 耗材状态,试管配置,急诊位样本配置,均是前端提交的设置信息 - // //试管配置 List tubeHolderSettings = new ArrayList<>(); - //当前正在处理的试管 - Tube curProcessingTube = null; + Tube curProcessingTube = null; + // + String appVersion = AppConstant.APP_VERSION; + String mcuVersion = "NOTSET"; + String sn = "NOTSET"; + public Boolean debugMode = true; diff --git a/src/main/java/a8k/service/appstate/OptScanModuleStateMgrService.java b/src/main/java/a8k/service/appstate/OptScanModuleStateMgrService.java index a088454..eb7e662 100644 --- a/src/main/java/a8k/service/appstate/OptScanModuleStateMgrService.java +++ b/src/main/java/a8k/service/appstate/OptScanModuleStateMgrService.java @@ -2,6 +2,7 @@ package a8k.service.appstate; import a8k.service.appstate.type.IncubationSubTank; import a8k.service.appstate.type.OptScanModule; +import a8k.service.appstate.type.ProjProcessContext; import a8k.service.appstate.type.state.IncubationSubTankState; import a8k.service.appstate.type.state.OptScanModuleState; import jakarta.annotation.Resource; @@ -38,4 +39,8 @@ public class OptScanModuleStateMgrService { return optScanModule.state.equals(OptScanModuleState.EMPTY); } + synchronized public ProjProcessContext getCurProjProcessContext() { + return gstate.getOptScanModule().projProcessContxt; + } + } diff --git a/src/main/java/a8k/type/ReactionResult.java b/src/main/java/a8k/type/ReactionResult.java new file mode 100644 index 0000000..8353c7f --- /dev/null +++ b/src/main/java/a8k/type/ReactionResult.java @@ -0,0 +1,13 @@ +package a8k.type; + +import a8k.type.reaction_result_type.ReactionResultStatus; + +public class ReactionResult { + public ReactionResultStatus status = ReactionResultStatus.DISABLED; + public String result = ""; + + public ReactionResult(ReactionResultStatus status, String result) { + this.status = status; + this.result = result; + } +} diff --git a/src/main/java/a8k/type/reaction_result_type/ReactionResultStatus.java b/src/main/java/a8k/type/reaction_result_type/ReactionResultStatus.java index f097150..e191d35 100644 --- a/src/main/java/a8k/type/reaction_result_type/ReactionResultStatus.java +++ b/src/main/java/a8k/type/reaction_result_type/ReactionResultStatus.java @@ -1,7 +1,10 @@ package a8k.type.reaction_result_type; public enum ReactionResultStatus { - // + /* + * + * 命名规范,如果结果错误,则ERROR开头的状态,表示结果异常。 + */ DISABLED, // 未启用 SUCCESS,// 成功 ERROR,// 结果异常