diff --git a/app.db b/app.db index 068ea14..f8db355 100644 Binary files a/app.db and b/app.db differ 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 854ea89..45f6fb7 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 @@ -3,7 +3,7 @@ package a8k.service.app.appctrl.mainflowctrl.action; import a8k.service.app.appctrl.mainflowctrl.CondtionMgrService; import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; import a8k.service.app.appctrl.mainflowctrl.base.A8kStepAction; -import a8k.service.app.appdata.AppReactionResultMgrService; +import a8k.service.app.appdata.ReactionRecordMgrService; import a8k.service.app.appstate.GStateService; import a8k.service.app.appstate.IncubationPlateMgrService; import a8k.service.app.appstate.OptScanModuleStateMgrService; @@ -42,9 +42,9 @@ public class PLATE_OPT_SCAN extends A8kStepAction { @Resource OptScanModuleStateMgrService optScanModuleStateMgrService; @Resource - TubeStateMgrService tubeStateMgrService; + TubeStateMgrService tubeStateMgrService; @Resource - AppReactionResultMgrService appReactionResultMgrService; + ReactionRecordMgrService reactionRecordMgrService; MainFlowCtrlState mfcs; @@ -63,7 +63,7 @@ public class PLATE_OPT_SCAN extends A8kStepAction { //修改板夹状态 optScanModuleStateMgrService.dropPlate(); - appReactionResultMgrService.addRecord(optScanModuleStateMgrService.getCurProjProcessContext(), + reactionRecordMgrService.addRecord(optScanModuleStateMgrService.getCurProjProcessContext(), new ReactionResult(ReactionResultStatus.SUCCESS, "12.8 mg/L"), new ReactionResult(ReactionResultStatus.ERROR_RESULT_OUT_OF_RANGE, "")); } diff --git a/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kActionStepType.java b/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kActionStepType.java index 9ea3a69..cfa70b3 100644 --- a/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kActionStepType.java +++ b/src/main/java/a8k/service/app/appctrl/mainflowctrl/base/A8kActionStepType.java @@ -10,19 +10,19 @@ public enum A8kActionStepType { SEQ1_ENTER_TUBEHOLDER_AND_SCAN, //入料并扫描 SEQ2_SWITCH_TO_THE_NEXT_TUBE,// 切换到下一个试管 SEQ3_APPLAY_RESOURCE,//申请资源 - SEQ4_PRE_PROCESS, - SEQ5_PROCESS, - SEQ6_POST_PROCESS, + SEQ4_PRE_PROCESS,//样本预处理 + SEQ5_PROCESS,//样本处理中 + SEQ6_POST_PROCESS,//样本后处理 SEQ7_EJECT_TUBEHOLDER, //弹出试管架 //incubate PROCESS_INCUBATE_COMPLETED_PLATE,//处理孵育完成的板 //OPT - PLATE_OPT_SCAN, + PLATE_OPT_SCAN,//光学扫描 //Error DO_CLEAR_ERROR_BEFORE_WORK,//在启动前,清除错误 - DO_PROCESS_ERROR_TUBE, - DO_PROCESS_ERROR_PLATE, + DO_PROCESS_ERROR_TUBE,//处理异常的样本 + DO_PROCESS_ERROR_PLATE,//处理异常的孵育盘 } diff --git a/src/main/java/a8k/service/app/appdata/AppReactionResultMgrService.java b/src/main/java/a8k/service/app/appdata/ReactionRecordMgrService.java similarity index 96% rename from src/main/java/a8k/service/app/appdata/AppReactionResultMgrService.java rename to src/main/java/a8k/service/app/appdata/ReactionRecordMgrService.java index 15b9807..a9bdbce 100644 --- a/src/main/java/a8k/service/app/appdata/AppReactionResultMgrService.java +++ b/src/main/java/a8k/service/app/appdata/ReactionRecordMgrService.java @@ -21,9 +21,9 @@ import java.util.List; @Component @ExtApiTab(cfg = ExtApiTabConfig.AppReactionResultMgrService) -public class AppReactionResultMgrService { +public class ReactionRecordMgrService { - final static Logger logger = LoggerFactory.getLogger(AppReactionResultMgrService.class); + final static Logger logger = LoggerFactory.getLogger(ReactionRecordMgrService.class); @Resource ReactionRecordDBService reactionRecordDBService; diff --git a/src/main/java/a8k/service/bases/appevent/AppWarningNotifyEvent.java b/src/main/java/a8k/service/bases/appevent/AppWarningNotifyEvent.java index a8f6cf7..2f4452d 100644 --- a/src/main/java/a8k/service/bases/appevent/AppWarningNotifyEvent.java +++ b/src/main/java/a8k/service/bases/appevent/AppWarningNotifyEvent.java @@ -1,24 +1,23 @@ package a8k.service.bases.appevent; import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.type.ecode.AppError; public class AppWarningNotifyEvent extends AppEvent { - public Integer errorCode; - public String errorCodeStr; + public AppError error; - public AppWarningNotifyEvent(Integer errorCode) { + public AppWarningNotifyEvent(AppError erro) { super(AppWarningNotifyEvent.class.getSimpleName()); - - this.errorCode = errorCode; - this.errorCodeStr = A8kEcode.toDisPlayString(errorCode); + this.error = erro; } - public AppWarningNotifyEvent(A8kEcode ecode) { - this(ecode.index); + public AppWarningNotifyEvent(A8kEcode errorCode) { + super(AppWarningNotifyEvent.class.getSimpleName()); + this.error = new AppError(errorCode); } - public String toString() { - return String.format("%s", errorCodeStr); + public AppWarningNotifyEvent(Integer errorCode) { + super(AppWarningNotifyEvent.class.getSimpleName()); + this.error = new AppError(A8kEcode.fromInt(errorCode)); } - } diff --git a/src/main/java/a8k/service/db/ReactionRecordDBService.java b/src/main/java/a8k/service/db/ReactionRecordDBService.java index dc32e40..f544518 100644 --- a/src/main/java/a8k/service/db/ReactionRecordDBService.java +++ b/src/main/java/a8k/service/db/ReactionRecordDBService.java @@ -1,7 +1,9 @@ package a8k.service.db; import a8k.service.db.type.ReactionResultRecord; +import a8k.service.debug.AppDebugHelperService; import a8k.utils.ZSqliteJdbcHelper; +import freemarker.debug.impl.DebuggerService; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import lombok.SneakyThrows; @@ -23,9 +25,17 @@ public class ReactionRecordDBService { @Resource JdbcTemplate jdbcTemplate; + @Resource + AppDebugHelperService appDebugHelperService; + + @PostConstruct void init() { + if(appDebugHelperService.isDebug()) { + ZSqliteJdbcHelper.forceDeleteTable(jdbcTemplate, tableName); + ZSqliteJdbcHelper.createTable(jdbcTemplate, tableName, tClass); + } if (!ZSqliteJdbcHelper.isTableExist(jdbcTemplate, tableName)) { ZSqliteJdbcHelper.createTable(jdbcTemplate, tableName, tClass); } diff --git a/src/main/java/a8k/service/db/type/ReactionResultRecord.java b/src/main/java/a8k/service/db/type/ReactionResultRecord.java index 42370d0..85d0655 100644 --- a/src/main/java/a8k/service/db/type/ReactionResultRecord.java +++ b/src/main/java/a8k/service/db/type/ReactionResultRecord.java @@ -2,6 +2,8 @@ package a8k.service.db.type; import a8k.type.reaction_result_type.ReactionResultStatus; import a8k.type.type.BloodType; +import a8k.utils.DateUtil; +import a8k.utils.ZDateUtils; import com.fasterxml.jackson.annotation.JsonFormat; import java.util.Date; @@ -26,8 +28,7 @@ import java.util.Date; public class ReactionResultRecord { public int id = 0; - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - public Date date = new Date(); + public Integer creatDate = ZDateUtils.getTimestamp(); //样本信息 public BloodType sampleBloodType = BloodType.WHOLE_BLOOD; //血液类型 diff --git a/src/main/java/a8k/service/debug/AppDebugHelperService.java b/src/main/java/a8k/service/debug/AppDebugHelperService.java index b5f96a9..bd08e3e 100644 --- a/src/main/java/a8k/service/debug/AppDebugHelperService.java +++ b/src/main/java/a8k/service/debug/AppDebugHelperService.java @@ -1,17 +1,29 @@ package a8k.service.debug; +import a8k.OS; import a8k.SpringBootBeanUtil; import a8k.extapi_controler.pagecontrol.ExtApiTabConfig; import a8k.extapi_controler.utils.ExtApiFn; import a8k.extapi_controler.utils.ExtApiTab; +import a8k.hardware.type.a8kcanprotocol.A8kEcode; +import a8k.hardware.type.a8kcanprotocol.CmdId; +import a8k.hardware.type.a8kcanprotocol.MId; import a8k.service.app.appctrl.CheckPointType; +import a8k.service.app.appctrl.mainflowctrl.base.A8kActionStepType; +import a8k.service.app.appctrl.mainflowctrl.base.A8kErrorContext; +import a8k.service.app.appdata.ReactionRecordMgrService; +import a8k.service.app.appstate.GStateService; +import a8k.service.app.appstate.type.ProjProcessContext; import a8k.service.bases.AppEventBusService; -import a8k.service.bases.appevent.A8kHardwareReport; +import a8k.service.bases.appevent.*; import a8k.service.db.A8kProjIdCardDBService; import a8k.service.db.A8kProjInfoDBService; +import a8k.service.db.ReactionRecordDBService; import a8k.service.db.type.A8kIdCardInfo; import a8k.service.db.type.A8kProjOptConfig; import a8k.service.db.type.A8kProjectInfo; +import a8k.service.db.type.ReactionResultRecord; +import a8k.service.db.type.a8kidcard.zenum.A8kReactionFlowType; import a8k.service.debug.fakeprojinfo.*; import a8k.type.ConsumableGroup; import a8k.type.ConsumableOneChResult; @@ -19,15 +31,24 @@ import a8k.type.ConsumableScanRawResult; import a8k.type.checkpoint.CheckResult; import a8k.type.checkpoint.Checkpoint; import a8k.type.consumables.ConsumablesErrorType; +import a8k.type.ecode.AppCodeError; +import a8k.type.ecode.AppError; +import a8k.type.ecode.ConsumeNotEnoughError; +import a8k.type.ecode.HardwareError; import a8k.type.exception.AppException; +import a8k.type.reaction_result_type.ReactionResultStatus; +import a8k.type.type.BloodType; import a8k.utils.A8kPacketBuilder; +import a8k.utils.AppExceptionBuilder; import a8k.utils.ReactionPlate2DCodeHelper; +import a8k.utils.ZDateUtils; import jakarta.annotation.PostConstruct; import jakarta.annotation.Resource; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.Arrays; +import java.util.Date; import java.util.List; @Component @@ -50,9 +71,12 @@ public class AppDebugHelperService { P22_PCTAndHsCRP p22_pctAndHsCRP; @Resource AppEventBusService eventBus; + @Resource + GStateService gstate; FakeProjInfo mountIdcard; + String[] consumables = new String[6]; ConsumablesErrorType[] consumablesErrorType = new ConsumablesErrorType[6]; @@ -149,6 +173,71 @@ public class AppDebugHelperService { Arrays.fill(consumables, ""); } + @ExtApiFn(name = "添加反应结果记录", group = "虚拟数据", order = 4) + public void addVirtualReactionRecord() { + ReactionRecordDBService service = SpringBootBeanUtil.getBean(ReactionRecordDBService.class); + ReactionResultRecord record = new ReactionResultRecord(); + + record.sampleBloodType = BloodType.WHOLE_BLOOD; + record.sampleBarcode = "XXXXXXXXXXXXXXX"; + record.sampleUserid = "ABCDEFG"; + record.projName = "hscrp"; + record.lotId = "CAHAC46U"; + record.projIndex = 1; + record.sampleId = "20120904_1"; + record.expiryDate = ZDateUtils.nextDay(); + record.operator = "admin"; // 操作员 + record.appVersion = gstate.getAppVersion();//上层应用版本 + record.mcuVersion = gstate.getMcuVersion(); // MCU软件版本 + record.sn = gstate.getSn(); // 仪器序列号 =; + record.subProjResultStatus1 = ReactionResultStatus.SUCCESS; + record.subProjResultStatus2 = ReactionResultStatus.ERROR_RESULT_OUT_OF_RANGE; + record.subProjResultStatus3 = ReactionResultStatus.ERROR_QUALITY_PEAK_DETECTION; + record.subProjResult1 = "12.3mg/L,12.5g/ml,125mol/L"; //子项目1 结果 + record.subProjResult2 = ""; //子项目2 结果 + record.subProjResult3 = ""; //子项目3 结果 + service.add(record); + } + //A8kEcodeContextListPromptEvent + //AppWarningNotifyEvent + //A8kErrorPromptEvent + //AppTubeholderSettingUpdateEvent + //DoA8kStepActionEvent + + + @ExtApiFn(name = "发送AppWarningNotifyEvent", group = "虚拟事件", order = 1) + public void buildAndSendAppWarningNotifyEvent() { + AppWarningNotifyEvent event = new AppWarningNotifyEvent(A8kEcode.UsrNotExitError); + eventBus.pushEvent(event); + } + + @ExtApiFn(name = "A8kErrorPromptEvent", group = "虚拟事件", order = 2) + public void buildAndSendA8kErrorPromptEvent() { + A8kErrorPromptEvent event = new A8kErrorPromptEvent(new ConsumeNotEnoughError("Hscrp")); + eventBus.pushEvent(event); + event = new A8kErrorPromptEvent(new AppCodeError("XXXX额外的错误说明XXXX")); + eventBus.pushEvent(event); + event = new A8kErrorPromptEvent(new HardwareError(A8kEcode.StepMotorOverVoltage, MId.HbotM, CmdId.step_motor_read_pos)); + eventBus.pushEvent(event); + } + + @ExtApiFn(name = "发送AppTubeholderSettingUpdateEvent", group = "虚拟事件", order = 3) + public void buildAndSendAppTubeholderSettingUpdateEvent() { + eventBus.pushEvent(new AppTubeholderSettingUpdateEvent()); + } + + @ExtApiFn(name = "发送DoA8kStepActionEvent", group = "虚拟事件", order = 4) + public void buildAndSendDoA8kStepActionEvent() { + eventBus.pushEvent(new DoA8kStepActionEvent(A8kActionStepType.SEQ1_ENTER_TUBEHOLDER_AND_SCAN)); + } + + @ExtApiFn(name = "发送A8kEcodeContextListPromptEvent", group = "虚拟事件", order = 5) + public void buildAndSendA8kEcodeContextListPromptEvent() { + List errorContexts = new ArrayList<>(); + errorContexts.add(new A8kErrorContext(A8kActionStepType.SEQ1_ENTER_TUBEHOLDER_AND_SCAN, new AppError(A8kEcode.TubeHolderTypeIsNotSupport))); + errorContexts.add(new A8kErrorContext(A8kActionStepType.SEQ5_PROCESS, new AppError(A8kEcode.NoTubeInHolder))); + eventBus.pushEvent(new A8kEcodeContextListPromptEvent(errorContexts)); + } //InterUse public Boolean getVirtualIDCard() { @@ -187,6 +276,7 @@ public class AppDebugHelperService { public ConsumableOneChResult scanOneCH(Integer ch) { + OS.forceSleep(1500); ConsumableOneChResult result = new ConsumableOneChResult(ch); switch (consumablesErrorType[ch]) { case PASS: //通过 diff --git a/src/main/java/a8k/type/ecode/AppError.java b/src/main/java/a8k/type/ecode/AppError.java index cf794e4..78620e0 100644 --- a/src/main/java/a8k/type/ecode/AppError.java +++ b/src/main/java/a8k/type/ecode/AppError.java @@ -4,9 +4,11 @@ import a8k.hardware.type.a8kcanprotocol.A8kEcode; public class AppError { public A8kEcode code; + public String errorType; public AppError(A8kEcode errorCode) { this.code = errorCode; + this.errorType = this.getClass().getSimpleName(); } public String toString() { diff --git a/src/main/java/a8k/type/ecode/ConsumeNotEnoughError.java b/src/main/java/a8k/type/ecode/ConsumeNotEnoughError.java index 6fb883d..b5b7436 100644 --- a/src/main/java/a8k/type/ecode/ConsumeNotEnoughError.java +++ b/src/main/java/a8k/type/ecode/ConsumeNotEnoughError.java @@ -3,11 +3,11 @@ package a8k.type.ecode; import a8k.hardware.type.a8kcanprotocol.A8kEcode; public class ConsumeNotEnoughError extends AppError { - public Integer projIndex; public String projName; - public ConsumeNotEnoughError(String projName, Integer projIndex) { + public ConsumeNotEnoughError(String projName) { super(A8kEcode.ConsumeNotEnough); + this.projName = projName; } } diff --git a/src/main/java/a8k/type/ecode/HardwareError.java b/src/main/java/a8k/type/ecode/HardwareError.java index 818e0dc..2900ad5 100644 --- a/src/main/java/a8k/type/ecode/HardwareError.java +++ b/src/main/java/a8k/type/ecode/HardwareError.java @@ -5,14 +5,12 @@ import a8k.hardware.type.a8kcanprotocol.CmdId; import a8k.hardware.type.a8kcanprotocol.MId; public class HardwareError extends AppError { - public MId mid; - public CmdId cmdId; + public MId mid; + public CmdId cmdId; public HardwareError(A8kEcode errorCode, MId mid, CmdId cmdId) { super(errorCode); + this.mid = mid; + this.cmdId = cmdId; } - - - - } 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 e191d35..371ffa4 100644 --- a/src/main/java/a8k/type/reaction_result_type/ReactionResultStatus.java +++ b/src/main/java/a8k/type/reaction_result_type/ReactionResultStatus.java @@ -9,5 +9,5 @@ public enum ReactionResultStatus { SUCCESS,// 成功 ERROR,// 结果异常 ERROR_RESULT_OUT_OF_RANGE,// 结果超出范围 - ERROR_DEPENDENT_VAR_OUT_OF_RANGE,// 依赖变量超出范围 + ERROR_QUALITY_PEAK_DETECTION,// 质峰检测错误 } diff --git a/src/main/java/a8k/utils/AppExceptionBuilder.java b/src/main/java/a8k/utils/AppExceptionBuilder.java index 6376974..5b15754 100644 --- a/src/main/java/a8k/utils/AppExceptionBuilder.java +++ b/src/main/java/a8k/utils/AppExceptionBuilder.java @@ -22,7 +22,7 @@ public class AppExceptionBuilder { public AppException buildConsumeNotEnoughError(Integer projIndex) { String projName = projConfigMgrService.getProjNameByLotId(projIndex); - return new AppException(new ConsumeNotEnoughError(projName, projIndex)); + return new AppException(new ConsumeNotEnoughError(projName)); } public AppException buildMutiErrorAppException(List errors) { diff --git a/src/main/java/a8k/utils/ZDateUtils.java b/src/main/java/a8k/utils/ZDateUtils.java index 624ea05..4482657 100644 --- a/src/main/java/a8k/utils/ZDateUtils.java +++ b/src/main/java/a8k/utils/ZDateUtils.java @@ -10,4 +10,8 @@ public class ZDateUtils { public static Date nextDay() { return addOneDay(new Date()); } + + public static Integer getTimestamp() { + return (int) (System.currentTimeMillis() / 1000); + } }