Browse Source

重构虚拟状态生成模式

master
zhaohe 4 days ago
parent
commit
dc981521c3
  1. 6
      src/main/java/a8k/app/service/data/SubModuleRegInitialValueMgrService.java
  2. 63
      src/main/java/a8k/app/service/engineer/qatest/ExperimentConsistencyTestingService.java
  3. 36
      src/main/java/a8k/app/service/os/OSDeviceInfoMgrService.java
  4. 37
      src/main/java/a8k/app/service/statemgr/AppFlagStateMgr.java
  5. 296
      src/main/java/a8k/app/service/virtualstate/DeviceVirtualStateMgrService.java
  6. 7
      src/main/java/a8k/app/service/virtualstate/VirtualStateMode.java
  7. 22
      src/main/java/a8k/app/service/virtualstate/VirtualStateModeMgr.java
  8. 51
      src/main/java/a8k/app/service/virtualstate/generator/ConsumableStateGenerator.java
  9. 118
      src/main/java/a8k/app/service/virtualstate/generator/DeviceFlagStateVirtualStateGenerator.java
  10. 100
      src/main/java/a8k/app/service/virtualstate/generator/TubeVirtualStateGenerator.java
  11. 59
      src/main/java/a8k/app/service/virtualstate/generator/VirtualDeviceWorkStateGenerator.java
  12. 139
      src/main/java/a8k/app/service/virtualstate/generator/VirtualIncubationPlateStateGenerator.java
  13. 64
      src/main/java/a8k/app/service/virtualstate/generator/VirtualOptScannerStateGenerator.java
  14. 101
      src/main/java/a8k/app/service/virtualstate/generator/VirtualPreReactionGridGroupStateGenerator.java
  15. 60
      src/main/java/a8k/app/service/virtualstate/generator/VirtualSensorStateGenerator.java
  16. 2
      src/main/java/a8k/app/type/GState.java
  17. 95
      src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java
  18. 6
      src/main/java/a8k/extui/mgr/ExtApiPageMgr.java
  19. 40
      src/main/java/a8k/extui/page/extapp/VirtualStateGenerateModeSettingPage.java
  20. 35
      src/main/java/a8k/extui/page/extapp/debug_assistant/DeviceVirtualStateMgrSettingPage.java
  21. 38
      src/main/java/a8k/extui/page/extapp/debug_assistant/VirtualReportModeOperationPage.java
  22. 10
      src/main/java/a8k/extui/page/factory/DeviceExSettingPage.java
  23. 40
      src/main/java/a8k/extui/page/factory/DeviceIdSettingPage.java
  24. 2
      src/main/java/a8k/extui/page/factory/hardwaretest/A8kSubModuleRegAndConfigInitPage.java
  25. 2
      src/main/java/a8k/extui/page/factory/hardwaretest/HBotHardwareTestPage.java
  26. 2
      src/main/java/a8k/extui/page/factory/hardwaretest/ICCardReaderTestPage.java
  27. 2
      src/main/java/a8k/extui/page/factory/hardwaretest/InputIOStateHardwareTestPage.java
  28. 2
      src/main/java/a8k/extui/page/factory/hardwaretest/LISUartTestPage.java
  29. 2
      src/main/java/a8k/extui/page/factory/hardwaretest/MiniServoHardwareTestPage.java
  30. 2
      src/main/java/a8k/extui/page/factory/hardwaretest/MiniServoPosCalibratePage.java
  31. 2
      src/main/java/a8k/extui/page/factory/hardwaretest/MiscHardwareTestPage.java
  32. 2
      src/main/java/a8k/extui/page/factory/hardwaretest/MotorHardwareTestPage.java
  33. 2
      src/main/java/a8k/extui/page/factory/hardwaretest/MotorPPSHardwareTestPage.java
  34. 2
      src/main/java/a8k/extui/page/factory/hardwaretest/OutputIOCtrlTestPage.java
  35. 2
      src/main/java/a8k/extui/page/factory/hardwaretest/PipetteGunHardwareTestPage.java
  36. 2
      src/main/java/a8k/extui/page/factory/hardwaretest/SubBoardProberPage.java
  37. 2
      src/main/java/a8k/extui/page/factory/hardwaretest/SubModuleVersionPreviewPage.java
  38. 2
      src/main/java/a8k/extui/page/factory/hardwaretest/WaterTempControllerTestPage.java
  39. 2
      src/main/java/a8k/extui/page/factory/opt/A8kOptVerification.java
  40. 2
      src/main/java/a8k/extui/page/factory/opt/OptModuleParamCalibration.java
  41. 2
      src/main/java/a8k/extui/page/factory/verification/HbotCodeScanPosVerificationPage.java
  42. 2
      src/main/java/a8k/extui/page/factory/verification/P10ProjejIDCardTestPage.java
  43. 2
      src/main/java/a8k/extui/page/factory/verification/P30InfeedAndPreProcessPosVerificationPage.java
  44. 2
      src/main/java/a8k/extui/page/factory/verification/P31ReactionPlatesTransmitPosVerificationPage.java
  45. 2
      src/main/java/a8k/extui/page/factory/verification/P32HbotPosVerificationPage.java
  46. 2
      src/main/java/a8k/extui/page/factory/verification/P33HbotSamplePosVerificationPage.java
  47. 2
      src/main/java/a8k/extui/page/factory/verification/P34LiquidOperationTestPage.java
  48. 2
      src/main/java/a8k/extui/page/factory/verification/P50VerificationScriptPage.java
  49. 20
      src/main/resources/application.yml

6
src/main/java/a8k/app/service/data/SubModuleRegInitialValueMgrService.java

@ -1,6 +1,8 @@
package a8k.app.service.data;
import a8k.app.iflytophald.type.protocol.A8kEcode;
import a8k.app.service.statemgr.GStateMgrService;
import a8k.app.type.DeviceRunMode;
import a8k.app.type.exception.AppException;
import a8k.app.config.A8kSubModuleInitRegConfig;
import a8k.app.dao.SubModuleRegInitialValueDao;
@ -25,6 +27,7 @@ public class SubModuleRegInitialValueMgrService {
private final SubModuleRegInitialValueDao subModuleRegInitialValueDao;
private final A8kCanBusBaseDriver canBus;
private final A8kSubModuleInitRegConfig a8kSubModuleInitRegConfig;
private final GStateMgrService gStateMgrService;
/**
@ -93,6 +96,9 @@ public class SubModuleRegInitialValueMgrService {
public void syncAllInputIOConfig() throws AppException {
log.info("===SyncAllInputIOConfig===");
if (gStateMgrService.isInMode(DeviceRunMode.RealMode)) {
return;
}
for (MId mid : MId.values()) {
if (mid == MId.NotSet)

63
src/main/java/a8k/app/service/engineer/qatest/ExperimentConsistencyTestingService.java

@ -22,70 +22,7 @@ import org.springframework.stereotype.Component;
@Slf4j
@RequiredArgsConstructor
public class ExperimentConsistencyTestingService {
/*
* 状态管理器
*/
final private ConsumablesMgrService consumablesMgrService;
final private TubeHolderSettingMgrService tubeHolderSettingMgrService;
final private TubeholderExSettingMgr tubeholderExSettingMgr;
final private MainFlowCtrlScheduler mainFlowCtrlScheduler;
final private ProjInfoMgrService projInfoMgrService;
/**
* 开始测试
* @param
* @throws AppException
*/
public void startTest() throws AppException {
// /*
// * 检查当前是否有其他项目正在进行测试
// */
// BeforeDoEngineerActionChecker.check();
// /*
// * 核对试管配置是否符合要求
// */
// TubeHolderSetting tubeHolderSetting = tubeHolderSettingMgrService.getThelastActiveTubeHolderSetting();
// if (tubeHolderSetting == null) {
// throw AppException.of(A8kEcode.APPE_TUBEHOLDER_SETTING_ERROR, "缺少试管配置");
// }
//
// for (TubeSetting tubeSetting : tubeHolderSetting.tubeSettings) {
// for (Integer projId : tubeSetting.projId) {
// if (projId != 1) {
// throw AppException.of(A8kEcode.APPE_TUBEHOLDER_SETTING_ERROR, "目前只支持HsCrp项目");
// }
// }
// }
//
//
// /*
// * 核对耗材数量是否足够
// */
// int testTotalTimes = 0;
// for (TubeSetting tubeSetting : tubeHolderSetting.tubeSettings) {
// for (Integer ignored : tubeSetting.projId) {
// testTotalTimes += tubeholderExSettingMgr.getTubeExConfig().tubeExConfigs.get(tubeSetting.tubeIndex).repeatTimes;
// }
// }
// Integer consumableNum = consumablesMgrService.getConsumableNum(projInfoMgrService.getProjBuildInInfo(1));
// if (consumableNum < testTotalTimes) {
// throw AppException.of(A8kEcode.APPE_CONSUME_NOT_ENOUGH,
// String.format("反应板,当前剩余:%d,需要:%d",consumableNum, testTotalTimes));
// }
// if (!consumablesMgrService.isHasEnoughTips((int) (testTotalTimes * 1.2))) {
// throw AppException.of(A8kEcode.APPE_TIP_NOT_ENOUGH,
// String.format("Tip不足,需要:%d", (int) (testTotalTimes * 1.2)));
// }
//
//
// log.info("开始试剂实验一致性检测");
// tubeholderExSettingMgr.setEnabled(true);
// mainFlowCtrlScheduler.startWork(() -> {
// log.info("试剂实验一致性检测工作线程结束");
// tubeholderExSettingMgr.setEnabled(false);
// });
}
}

36
src/main/java/a8k/app/service/os/OSDeviceInfoMgrService.java

@ -34,7 +34,7 @@ public class OSDeviceInfoMgrService {
}
public String readSN() {
return getEnv("/iflytop/env/sn", gStateMgrService::getSn);
return getEnv("/iflytop/env/sn", "TEST001");
}
public String setAssetId(String assetId) throws AppException {
@ -43,7 +43,7 @@ public class OSDeviceInfoMgrService {
}
public String readAssetId() {
return getEnv("/iflytop/env/assetid", gStateMgrService::getAssetId);
return getEnv("/iflytop/env/assetid", "TEST001");
}
public String setDeviceType(String deviceType) throws AppException {
@ -52,7 +52,7 @@ public class OSDeviceInfoMgrService {
}
public String readDeviceType() {
return getEnv("/iflytop/env/device-type", gStateMgrService::getDeviceType);
return getEnv("/iflytop/env/device-type", "A8000");
}
public String setDeviceVersion(String deviceVersion) throws AppException {
@ -61,7 +61,7 @@ public class OSDeviceInfoMgrService {
}
public String readDeviceVersion() {
return getEnv("/iflytop/env/device-version", gStateMgrService::getDeviceVersion);
return getEnv("/iflytop/env/device-version", "1");
}
public String setManufactureDate(String manufactureDate) throws AppException {
@ -70,22 +70,22 @@ public class OSDeviceInfoMgrService {
}
public String readManufactureDate() {
return getEnv("/iflytop/env/manufacture-date", gStateMgrService::getManufactureDate);
return getEnv("/iflytop/env/manufacture-date", "NotSet");
}
private String getEnv(String path, EnvReadCallback readStateFn) {
private String getEnv(String path, String defaultVal) {
if (OS.isRunOnWindows()) {
if (readStateFn != null) {
return readStateFn.read();
}
return "NULL";
path = "./runenv/virtual/" + path;
}
try {
return FileUtil.readUtf8String(path);
String val = FileUtil.readUtf8String(path);
if (val == null || val.isEmpty()) {
return defaultVal;
}
return val;
} catch (Exception e) {
log.error("读取设备信息失败: {}", e.getMessage());
return "Error";
return defaultVal;
}
}
@ -94,9 +94,7 @@ public class OSDeviceInfoMgrService {
throw AppException.of(A8kEcode.CODEERROR, String.format("设备%s不能为空", path));
}
if (OS.isRunOnWindows()) {
if (updateStateFn != null)
updateStateFn.update(val);
return;
path = "./runenv/virtual/" + path;
}
try {
@ -106,18 +104,14 @@ public class OSDeviceInfoMgrService {
} catch (Exception e) {
throw AppException.of(A8kEcode.CODEERROR, String.format("设备%s设置失败: %s", path, e.getMessage()));
}
}
@FunctionalInterface
public interface EnvUpdateCallback {
void update(String val) throws AppException;
}
@FunctionalInterface
public interface EnvReadCallback {
String read();
}
@PostConstruct
void init() {

37
src/main/java/a8k/app/service/statemgr/AppFlagStateMgr.java

@ -47,8 +47,7 @@ public class AppFlagStateMgr {
private final GStateMgrService gstate;
DeviceWarningFlagStateGroup deviceWarningFlagState = new DeviceWarningFlagStateGroup();
DeviceWarningFlagStateGroup virtualWarningState = new DeviceWarningFlagStateGroup(); //虚拟状态,用于前端状态测试
DeviceWarningFlagStateGroup deviceWarningFlagState = new DeviceWarningFlagStateGroup();
@PostConstruct
@ -58,12 +57,13 @@ public class AppFlagStateMgr {
continue;
deviceWarningFlagState.states.add(new AppFlagState(flagKey, flagKey.flagType));
}
virtualWarningState = deviceVirtualStateMgrService.getDeviceFlagStateVirtualStateInitVal(deviceWarningFlagState);
deviceVirtualStateMgrService.initDeviceFlagStateVirtualState(deviceWarningFlagState);
}
synchronized public DeviceWarningFlagStateGroup getFlagState() {
if (gstate.isInMode(DeviceRunMode.VirtualStateGenerateMode)) {
return virtualWarningState;
return deviceVirtualStateMgrService.getDeviceFlagStateVirtualState();
}
// 正常状态下返回值
return ObjectUtil.clone(deviceWarningFlagState);
@ -71,7 +71,7 @@ public class AppFlagStateMgr {
synchronized public Integer getStateVersion() {
if (gstate.isInMode(DeviceRunMode.VirtualStateGenerateMode)) {
return virtualWarningState.version; //
return deviceVirtualStateMgrService.getDeviceFlagStateVirtualStateVersion();
}
return deviceWarningFlagState.version; //返回当前状态版本号
}
@ -112,15 +112,15 @@ public class AppFlagStateMgr {
if (!flagKey.enabled)
return;
var state = deviceWarningFlagState;
if (gstate.isInMode(DeviceRunMode.VirtualStateGenerateMode)) {
state = virtualWarningState; //如果是虚拟状态,则使用虚拟状态
deviceVirtualStateMgrService.deviceFlagStateVirtualStateSetFlagStateVal(flagKey, val);
return;
}
for (AppFlagState flagState : state.states) {
for (AppFlagState flagState : deviceWarningFlagState.states) {
if (flagState.keyName.equals(flagKey)) {
flagState.state = val;
state.version++;
deviceWarningFlagState.version++;
return;
}
}
@ -131,17 +131,17 @@ public class AppFlagStateMgr {
return;
log.info("clearFlagState: {}", flagKey);
var state = deviceWarningFlagState;
if (gstate.isInMode(DeviceRunMode.VirtualStateGenerateMode)) {
state = virtualWarningState; //如果是虚拟状态,则使用虚拟状态
deviceVirtualStateMgrService.deviceFlagStateVirtualStateClearFlagState(flagKey);
return;
}
for (AppFlagState flagState : state.states) {
for (AppFlagState flagState : deviceWarningFlagState.states) {
if (flagState.keyName.equals(flagKey)) {
flagState.state = false;
flagState.errorDetailInfo = null;
flagState.errorPromptInfo = null;
state.version++;
deviceWarningFlagState.version++;
return;
}
}
@ -149,12 +149,12 @@ public class AppFlagStateMgr {
synchronized public void clearAllFlagState() {
log.info("clearAllFlagState: Clear all DeviceWarningFlagState");
var state = deviceWarningFlagState;
if (gstate.isInMode(DeviceRunMode.VirtualStateGenerateMode)) {
state = virtualWarningState; //如果是虚拟状态,则使用虚拟状态
deviceVirtualStateMgrService.deviceFlagStateVirtualStateClearAllFlagState();
return;
}
for (AppFlagState flagState : state.states) {
for (AppFlagState flagState : deviceWarningFlagState.states) {
if (flagState.flagType.equals(AppFlagType.NormalFlag) || flagState.flagType.equals(AppFlagType.WarningFlag)) {
continue;
}
@ -165,7 +165,7 @@ public class AppFlagStateMgr {
}
}
state.version++;
deviceWarningFlagState.version++;
}
synchronized public boolean isFlagTrigger(AppFlagKey flagType) {
@ -183,7 +183,4 @@ public class AppFlagStateMgr {
}
synchronized public void resetVirtualState() {
virtualWarningState = deviceVirtualStateMgrService.getDeviceFlagStateVirtualStateInitVal(deviceWarningFlagState);
}
}

296
src/main/java/a8k/app/service/virtualstate/DeviceVirtualStateMgrService.java

@ -1,257 +1,161 @@
package a8k.app.service.virtualstate;
import a8k.app.iflytophald.type.protocol.A8kEcode;
import a8k.app.constant.AppConstant;
import a8k.app.factory.FakeA8kConsumableContainerFactory;
import a8k.app.factory.FakeAppErrorFactory;
import a8k.app.factory.ZAppPromptFactory;
import a8k.app.service.utils.ProjInfoUtils;
import a8k.app.service.virtualstate.generator.*;
import a8k.app.type.AppFlagKey;
import a8k.app.type.DeviceWarningFlagStateGroup;
import a8k.app.type.PreReactionGrid;
import a8k.app.type.PreReactionGridGroup;
import a8k.app.type.a8k.BloodType;
import a8k.app.type.a8k.ConsumableGroup;
import a8k.app.type.a8k.LittleBottleConsumableType;
import a8k.app.type.a8k.container.A8kConsumableContainer;
import a8k.app.type.a8k.proj.ProjBriefInfo;
import a8k.app.type.a8k.state.*;
import a8k.app.type.a8k.state.enumtype.*;
import a8k.app.type.error.AppError;
import a8k.app.type.exception.AppException;
import cn.hutool.core.util.ObjectUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
@RequiredArgsConstructor
@Slf4j
public class DeviceVirtualStateMgrService {
private final VirtualStateModeMgr virtualStateModeMgr;
private final TubeVirtualStateGenerator tubeVirtualStateGenerator;
private final TubeVirtualStateGenerator tubeVirtualStateGenerator;
private final DeviceFlagStateVirtualStateGenerator deviceFlagStateVirtualStateGenerator;
private final ConsumableStateGenerator consumableStateGenerator;
private final VirtualIncubationPlateStateGenerator virtualIncubationPlateStateGenerator;
private final VirtualPreReactionGridGroupStateGenerator virtualPreReactionGridGroupStateGenerator;
private final VirtualOptScannerStateGenerator virtualOptScannerStateGenerator;
private final VirtualDeviceWorkStateGenerator virtualDeviceWorkStateGenerator;
private final VirtualSensorStateGenerator virtualSensorStateGenerator;
public TubeHolder getVirtualTubeHolderState() {
//
// 试管架状态
//
synchronized public TubeHolder getVirtualTubeHolderState() {
return tubeVirtualStateGenerator.getVirtualTubeHolderState();
}
public EmergencyTubePos getVirtualEmergencyTube() {
synchronized public EmergencyTubePos getVirtualEmergencyTube() {
return tubeVirtualStateGenerator.getVirtualEmergencyTube();
}
public Integer getVirtualTubeStateVersion() {
synchronized public Integer getVirtualTubeStateVersion() {
return tubeVirtualStateGenerator.getVirtualTubeStateVersion();
}
public void setEmptyTubeState(TubeState emptyTubeState) {
tubeVirtualStateGenerator.setEmptyTubeState(emptyTubeState);
}
//
// 设备状态标志位
//
synchronized public A8kConsumableContainer getVirtualConsumableContainerState() {
//虚拟状态生成模式
A8kConsumableContainer state = new A8kConsumableContainer();
state.tips[0].tipNum = 100;
state.tips[1].tipNum = 101;
state.tips[2].tipNum = 102;
for (int i = 0; i < 6; i++) {
try {
FakeA8kConsumableContainerFactory.buildA8kConsumableContainerState(state, i);
} catch (AppException ignored) {
}
}
return state;
public void initDeviceFlagStateVirtualState(DeviceWarningFlagStateGroup group) {
deviceFlagStateVirtualStateGenerator.init(group);
}
synchronized public Integer getVirtualConsumableContainerStateVersion() {
//虚拟状态生成模式
return Integer.MAX_VALUE;
public DeviceWarningFlagStateGroup getDeviceFlagStateVirtualState() {
return deviceFlagStateVirtualStateGenerator.getDeviceFlagStateVirtualState();
}
public Integer getDeviceFlagStateVirtualStateVersion() {
return deviceFlagStateVirtualStateGenerator.getVersion();
}
/**
* 获取虚拟孵育盘状态
* @return 虚拟孵育盘状态
*/
synchronized public IncubationPlate getVirtualIncubationPlateState() {
IncubationPlate incubationPlate = new IncubationPlate();
int i = 0;
for (IncubationSubTank subtank : incubationPlate.subtanks) {
i++;
switch (i) {
case 1 -> subtank.state = IncubationSubTankState.RESERVED;
case 2 -> subtank.state = IncubationSubTankState.WAITING_FOR_DROP;
case 3 -> subtank.state = IncubationSubTankState.INCUBATING;
case 4 -> subtank.state = IncubationSubTankState.ERROR;
case 5 -> subtank.state = IncubationSubTankState.INCUBATION_COMPLETE;
default -> subtank.state = IncubationSubTankState.EMPTY;
}
subtank.sampleInfo = new SampleInfo(
"250109_001E01", 0, false, false, BloodType.WHOLE_BLOOD, "B3A7KK8DKF", "250109_001E"
);
subtank.sampleInfo.bloodType = BloodType.WHOLE_BLOOD;
subtank.sampleInfo.sampleBarcode = "112334455667";
subtank.sampleInfo.userid = "250109_001E";
subtank.projInfo = new ProjBriefInfo();
subtank.projInfo.projId = 1;
subtank.projInfo.projName = "hsCRP";
subtank.projInfo.projShortName = "CA";
subtank.projInfo.color = "#DC143C";
subtank.sampleInfo.sampleId = "250109_001E01";
subtank.projId = 1;
subtank.lotId = "CA123456";
subtank.isEmergency = i == 2;
if (subtank.state.equals(IncubationSubTankState.ERROR)) {
subtank.error = new AppError(A8kEcode.PROJ_CARD_ERROR_WRONG_UNSUPPORTED, "");
subtank.errorInfo = ZAppPromptFactory.buildAppPrompt(subtank.error);
}
subtank.startIncubatedTime = new Date().getTime();
subtank.incubatedTimeSec = 3 * 60;
subtank.remainTimeSec = 3 * 60;
}
return incubationPlate;
public void deviceFlagStateVirtualStateSetFlagStateVal(AppFlagKey flagKey, boolean val) {
deviceFlagStateVirtualStateGenerator.setFlagStateVal(flagKey, val);
}
public void deviceFlagStateVirtualStateClearFlagState(AppFlagKey flagKey) {
deviceFlagStateVirtualStateGenerator.clearFlagState(flagKey);
}
public PreReactionGridGroup getFakePreReactionGridGroup(ConsumableGroup group) {
PreReactionGridGroup gridGroup = new PreReactionGridGroup(group);
gridGroup.group = group;
if (group.off % 2 == 0) {
gridGroup.installed = true;
gridGroup.hasSomeGridInReacting = true;
gridGroup.hasSomeGridReactedCompleted = true;
} else {
gridGroup.installed = false;
gridGroup.hasSomeGridInReacting = false;
gridGroup.hasSomeGridReactedCompleted = false;
}
gridGroup.consumableType = LittleBottleConsumableType.BufferSolution;
var projBuildInInfo = FakeA8kConsumableContainerFactory.buildFakeProjBuildInInfo(group.off);
gridGroup.projBriefInfo = ProjInfoUtils.buildProjBrefInfo(projBuildInInfo);
gridGroup.version = 10;
for (int i = 0; i < AppConstant.CONSUMABLE_NUM; i++) {
gridGroup.grids.get(i).projId = projBuildInInfo.projId;
gridGroup.grids.get(i).projBuildinInfo = projBuildInInfo;
gridGroup.grids.get(i).projExtInfoCard = null;
switch (i / 5) {
case 0 -> {
gridGroup.grids.get(i).state = PreReactionGrid.State.UNINSTALL;
}
case 1 -> {
gridGroup.grids.get(i).state = PreReactionGrid.State.USED;
}
case 2 -> {
gridGroup.grids.get(i).state = PreReactionGrid.State.REACTION_COMPLETED;
gridGroup.grids.get(i).sampleInfo.userid = "UID123";
}
case 3 -> {
gridGroup.grids.get(i).state = PreReactionGrid.State.REACTING;
gridGroup.grids.get(i).sampleInfo.userid = "UID123";
gridGroup.grids.get(i).reactionRemainingTime = 3 * 60L;
}
case 4 -> {
gridGroup.grids.get(i).state = PreReactionGrid.State.TO_BE_USED;
}
}
}
return gridGroup;
public void deviceFlagStateVirtualStateClearAllFlagState() {
deviceFlagStateVirtualStateGenerator.clearAllFlagState();
}
int cnt = 0;
//
// 耗材状态
//
public SensorState getVirtualSensorState() {
SensorState sensorState = new SensorState();
sensorState.setPboxTemperature(24);
sensorState.setIncubateBoxTemperature(25);
sensorState.setWasteBinFullFlag(false);
cnt++;
sensorState.setIncubateBoxTemperatureReady(cnt % 2 == 0); //每次调用切换一次状态
sensorState.setPboxTemperatureReady(cnt % 2 == 0); //每次调用切换一次状态
synchronized public A8kConsumableContainer getVirtualConsumableContainerState() {
return consumableStateGenerator.getVirtualConsumableContainerState();
}
synchronized public Integer getVirtualConsumableContainerStateVersion() {
return consumableStateGenerator.getVersion();
}
return sensorState;
//
// 获取虚拟孵育盘状态
//
synchronized public IncubationPlate getVirtualIncubationPlateState() {
return virtualIncubationPlateStateGenerator.getVirtualIncubationPlateState();
}
//
// VIRTUAL_OPERATION
// 获取虚拟预反应格状态
//
public DeviceWarningFlagStateGroup getDeviceFlagStateVirtualStateInitVal(DeviceWarningFlagStateGroup deviceWarningFlagState) {
DeviceWarningFlagStateGroup virtualWarningState = ObjectUtil.clone(deviceWarningFlagState); //初始化时复制一份状态版本号
virtualWarningState.version = 10000;
//设置VirtualState初始值
var consumeNotEnoughState = virtualWarningState.find(AppFlagKey.ConsumeNotEnoughState);
consumeNotEnoughState.state = true; //
consumeNotEnoughState.errorDetailInfo = FakeAppErrorFactory.buildAEConsumeNotEnoughError();
consumeNotEnoughState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(consumeNotEnoughState.errorDetailInfo);
var tipNotEnoughState = virtualWarningState.find(AppFlagKey.TipNotEnoughState);
tipNotEnoughState.state = true; //
tipNotEnoughState.errorDetailInfo = FakeAppErrorFactory.buildError(A8kEcode.APPE_TIP_NOT_ENOUGH);
tipNotEnoughState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(tipNotEnoughState.errorDetailInfo);
var infeedExceptionState = virtualWarningState.find(AppFlagKey.InfeedExceptionState);
infeedExceptionState.state = true; //
infeedExceptionState.errorDetailInfo = FakeAppErrorFactory.buildAEHardwareError();
infeedExceptionState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(infeedExceptionState.errorDetailInfo);
var outfeedAreaFullState = virtualWarningState.find(AppFlagKey.OutfeedAreaFullState);
outfeedAreaFullState.state = true; //
outfeedAreaFullState.errorDetailInfo = FakeAppErrorFactory.buildError(A8kEcode.APPE_OUTFEED_AREA_IS_FULL);
outfeedAreaFullState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(outfeedAreaFullState.errorDetailInfo);
var wasteBinFullState = virtualWarningState.find(AppFlagKey.WasteBinFull);
wasteBinFullState.state = true; //
wasteBinFullState.errorDetailInfo = FakeAppErrorFactory.buildError(A8kEcode.APPE_WAST_BIN_IS_FULL);
wasteBinFullState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(wasteBinFullState.errorDetailInfo);
if (AppFlagKey.InfeedPPSFlag.enabled)
virtualWarningState.find(AppFlagKey.InfeedPPSFlag).state = true; //入料区光电
if (AppFlagKey.OutfeedPPSFlag.enabled)
virtualWarningState.find(AppFlagKey.OutfeedPPSFlag).state = false; //入料区光电
if (AppFlagKey.TubeholderChannelPPSFlag.enabled)
virtualWarningState.find(AppFlagKey.TubeholderChannelPPSFlag).state = true; //入料区光电
if (AppFlagKey.PlateBoxLidPPSState.enabled)
virtualWarningState.find(AppFlagKey.PlateBoxLidPPSState).state = false; //入料区光电
return virtualWarningState;
public PreReactionGridGroup getFakePreReactionGridGroup(ConsumableGroup group) {
return virtualPreReactionGridGroupStateGenerator.getGroupState(group);
}
synchronized public OptScanModuleState getVirtualOptScanModuleState() {
return virtualOptScannerStateGenerator.getVirtualOptScanModuleState();
}
synchronized public Integer getVirtualOptScanModuleStateVersion() {
return virtualOptScannerStateGenerator.getVersion();
}
//
// DeviceWorkState
//
synchronized public DeviceWorkState getVirtualDeviceWorkState() {
DeviceWorkState deviceWorkState = new DeviceWorkState();
deviceWorkState.workState = A8kWorkState.WORKING;
return deviceWorkState;
return virtualDeviceWorkStateGenerator.getState();
}
synchronized public Integer getVirtualDeviceWorkStateVersion() {
//虚拟状态生成模式
return Integer.MAX_VALUE;
return virtualDeviceWorkStateGenerator.getVersion();
}
synchronized public OptScanModuleState getVirtualOptScanModuleState() {
OptScanModuleState optScanModuleState = new OptScanModuleState();
optScanModuleState.state = OptScanModuleStateEnum.SCANNING;
optScanModuleState.sampleInfo = new SampleInfo(
"SAMPLEID-123456", 1, true, false, BloodType.WHOLE_BLOOD, "1234567890", "2250103_003"
);
optScanModuleState.setProjInfo(new ProjBriefInfo(1, "hsCRP", "CA", "#DC143C"));
optScanModuleState.setProjId(1);
optScanModuleState.setLotId("CA123456");
return optScanModuleState;
//
// SensorState
//
public SensorState getVirtualSensorState() {
return virtualSensorStateGenerator.getState();
}
synchronized public Integer getVirtualOptScanModuleStateVersion() {
//虚拟状态生成模式
return Integer.MAX_VALUE;
//
// 状态修改方法
//
synchronized public void changeEmergencyTubeState(TubeState state) {
tubeVirtualStateGenerator.changeEmergencyTubeState(state);
}
synchronized public TubeState getEmergencyTubeState() {
return tubeVirtualStateGenerator.emergencyTubeState;
}
synchronized public void changeVirtualStateMode(VirtualStateMode mode) {
virtualStateModeMgr.virtualStateMode = mode;
tubeVirtualStateGenerator.incrementVersion();
deviceFlagStateVirtualStateGenerator.incrementVersion();
consumableStateGenerator.incrementVersion();
virtualIncubationPlateStateGenerator.incrementVersion();
virtualPreReactionGridGroupStateGenerator.incrementVersion();
virtualOptScannerStateGenerator.incrementVersion();
virtualDeviceWorkStateGenerator.incrementVersion();
virtualSensorStateGenerator.incrementVersion();
}
synchronized public VirtualStateMode getMode() {
return virtualStateModeMgr.virtualStateMode;
}
}

7
src/main/java/a8k/app/service/virtualstate/VirtualStateMode.java

@ -0,0 +1,7 @@
package a8k.app.service.virtualstate;
public enum VirtualStateMode {
UI_TEST_MODE,//状态尽可能能全面的测试前端显示
INSTRUCTION_BOOK_IDLE,//设备空闲
INSTRUCTION_BOOK_RUNNING,//设备运行中
}

22
src/main/java/a8k/app/service/virtualstate/VirtualStateModeMgr.java

@ -0,0 +1,22 @@
package a8k.app.service.virtualstate;
import a8k.app.type.a8k.state.enumtype.TubeState;
import org.springframework.stereotype.Component;
@Component
public class VirtualStateModeMgr {
public VirtualStateMode virtualStateMode = VirtualStateMode.UI_TEST_MODE;
public Boolean isInMode(VirtualStateMode... modes) {
if (modes == null) {
return false;
}
for (VirtualStateMode m : modes) {
if (virtualStateMode.equals(m)) {
return true;
}
}
return false;
}
}

51
src/main/java/a8k/app/service/virtualstate/generator/ConsumableStateGenerator.java

@ -0,0 +1,51 @@
package a8k.app.service.virtualstate.generator;
import a8k.app.factory.FakeA8kConsumableContainerFactory;
import a8k.app.service.virtualstate.VirtualStateModeMgr;
import a8k.app.type.a8k.container.A8kConsumableContainer;
import a8k.app.type.exception.AppException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@RequiredArgsConstructor
public class ConsumableStateGenerator {
private final VirtualStateModeMgr virtualStateModeMgr;
private Integer version = Integer.MAX_VALUE / 2;
A8kConsumableContainer state = new A8kConsumableContainer();
//
// 耗材状态
//
synchronized public A8kConsumableContainer getVirtualConsumableContainerState() {
switch (virtualStateModeMgr.virtualStateMode) {
case UI_TEST_MODE, INSTRUCTION_BOOK_RUNNING, INSTRUCTION_BOOK_IDLE -> {
//虚拟状态生成模式
state = new A8kConsumableContainer();
state.tips[0].tipNum = 100;
state.tips[1].tipNum = 101;
state.tips[2].tipNum = 102;
for (int i = 0; i < 6; i++) {
try {
FakeA8kConsumableContainerFactory.buildA8kConsumableContainerState(state, i);
} catch (AppException ignored) {
}
}
}
}
return state;
}
synchronized public Integer getVersion() {
//虚拟状态生成模式
return version;
}
synchronized public void incrementVersion() {
version++;
}
}

118
src/main/java/a8k/app/service/virtualstate/generator/DeviceFlagStateVirtualStateGenerator.java

@ -0,0 +1,118 @@
package a8k.app.service.virtualstate.generator;
import a8k.app.factory.FakeAppErrorFactory;
import a8k.app.factory.ZAppPromptFactory;
import a8k.app.iflytophald.type.protocol.A8kEcode;
import a8k.app.service.statemgr.AppFlagStateMgr;
import a8k.app.service.virtualstate.VirtualStateModeMgr;
import a8k.app.type.AppFlagKey;
import a8k.app.type.AppFlagType;
import a8k.app.type.DeviceWarningFlagStateGroup;
import cn.hutool.core.util.ObjectUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@RequiredArgsConstructor
public class DeviceFlagStateVirtualStateGenerator {
private final VirtualStateModeMgr virtualStateModeMgr;
public DeviceWarningFlagStateGroup state;
//
// VIRTUAL_OPERATION
//
public DeviceWarningFlagStateGroup getDeviceFlagStateVirtualState() {
return state;
}
public void init(DeviceWarningFlagStateGroup deviceWarningFlagState) {
DeviceWarningFlagStateGroup virtualWarningState = ObjectUtil.clone(deviceWarningFlagState); //初始化时复制一份状态版本号
virtualWarningState.version = 10000;
//设置VirtualState初始值
var consumeNotEnoughState = virtualWarningState.find(AppFlagKey.ConsumeNotEnoughState);
consumeNotEnoughState.state = true; //
consumeNotEnoughState.errorDetailInfo = FakeAppErrorFactory.buildAEConsumeNotEnoughError();
consumeNotEnoughState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(consumeNotEnoughState.errorDetailInfo);
var tipNotEnoughState = virtualWarningState.find(AppFlagKey.TipNotEnoughState);
tipNotEnoughState.state = true; //
tipNotEnoughState.errorDetailInfo = FakeAppErrorFactory.buildError(A8kEcode.APPE_TIP_NOT_ENOUGH);
tipNotEnoughState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(tipNotEnoughState.errorDetailInfo);
var infeedExceptionState = virtualWarningState.find(AppFlagKey.InfeedExceptionState);
infeedExceptionState.state = true; //
infeedExceptionState.errorDetailInfo = FakeAppErrorFactory.buildAEHardwareError();
infeedExceptionState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(infeedExceptionState.errorDetailInfo);
var outfeedAreaFullState = virtualWarningState.find(AppFlagKey.OutfeedAreaFullState);
outfeedAreaFullState.state = true; //
outfeedAreaFullState.errorDetailInfo = FakeAppErrorFactory.buildError(A8kEcode.APPE_OUTFEED_AREA_IS_FULL);
outfeedAreaFullState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(outfeedAreaFullState.errorDetailInfo);
var wasteBinFullState = virtualWarningState.find(AppFlagKey.WasteBinFull);
wasteBinFullState.state = true; //
wasteBinFullState.errorDetailInfo = FakeAppErrorFactory.buildError(A8kEcode.APPE_WAST_BIN_IS_FULL);
wasteBinFullState.errorPromptInfo = ZAppPromptFactory.buildAppPrompt(wasteBinFullState.errorDetailInfo);
if (AppFlagKey.InfeedPPSFlag.enabled)
virtualWarningState.find(AppFlagKey.InfeedPPSFlag).state = true; //入料区光电
if (AppFlagKey.OutfeedPPSFlag.enabled)
virtualWarningState.find(AppFlagKey.OutfeedPPSFlag).state = false; //入料区光电
if (AppFlagKey.TubeholderChannelPPSFlag.enabled)
virtualWarningState.find(AppFlagKey.TubeholderChannelPPSFlag).state = true; //入料区光电
if (AppFlagKey.PlateBoxLidPPSState.enabled)
virtualWarningState.find(AppFlagKey.PlateBoxLidPPSState).state = false; //入料区光电
state = virtualWarningState;
state.version = 10000; //初始化时设置版本号为10000
}
public void incrementVersion() {
state.version++;
}
public Integer getVersion() {
return state.version;
}
public void setFlagStateVal(AppFlagKey flagKey, boolean val) {
for (AppFlagStateMgr.AppFlagState flagState : state.states) {
if (flagState.keyName.equals(flagKey)) {
flagState.state = val;
incrementVersion();
return;
}
}
}
public void clearFlagState(AppFlagKey flagKey) {
for (AppFlagStateMgr.AppFlagState flagState : state.states) {
if (flagState.keyName.equals(flagKey)) {
flagState.state = false;
flagState.errorDetailInfo = null;
flagState.errorPromptInfo = null;
incrementVersion();
return;
}
}
}
public void clearAllFlagState() {
for (AppFlagStateMgr.AppFlagState flagState : state.states) {
if (flagState.flagType.equals(AppFlagType.NormalFlag) || flagState.flagType.equals(AppFlagType.WarningFlag)) {
continue;
}
if (flagState.state) {
flagState.state = false;
flagState.errorDetailInfo = null;
flagState.errorPromptInfo = null;
incrementVersion();
}
}
}
}

100
src/main/java/a8k/app/service/virtualstate/TubeVirtualStateGenerator.java → src/main/java/a8k/app/service/virtualstate/generator/TubeVirtualStateGenerator.java

@ -1,8 +1,9 @@
package a8k.app.service.virtualstate;
package a8k.app.service.virtualstate.generator;
import a8k.app.factory.FakeA8kConsumableContainerFactory;
import a8k.app.factory.FakeAppErrorFactory;
import a8k.app.factory.ZAppPromptFactory;
import a8k.app.service.virtualstate.VirtualStateModeMgr;
import a8k.app.type.a8k.BloodType;
import a8k.app.type.a8k.proj.ProjBriefInfo;
import a8k.app.type.a8k.state.EmergencyTubePos;
@ -10,23 +11,75 @@ import a8k.app.type.a8k.state.Tube;
import a8k.app.type.a8k.state.TubeHolder;
import a8k.app.type.a8k.state.enumtype.TubeHolderState;
import a8k.app.type.a8k.state.enumtype.TubeState;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@RequiredArgsConstructor
public class TubeVirtualStateGenerator {
private final VirtualStateModeMgr virtualStateModeMgr;
private Integer version = Integer.MAX_VALUE / 2;
public TubeState emergencyTubeState = TubeState.EMPTY;
TubeState emptyTubeState = TubeState.EMPTY;
Integer stateVersion = Integer.MAX_VALUE / 2;
void addProjInfoToTube(Tube tube, Integer projId) {
public TubeHolder getVirtualTubeHolderState() {
TubeHolder tubeHolder = new TubeHolder();
switch (virtualStateModeMgr.virtualStateMode) {
case UI_TEST_MODE, INSTRUCTION_BOOK_RUNNING -> {
tubeHolder.setState(TubeHolderState.PROCESSING);
tubeHolder.setTubes(new Tube[]{
createFakeTube(1),
createFakeTube(2),
createFakeTube(3),
createFakeTube(4),
createFakeTube(5),
createFakeTube(6),
createFakeTube(7),
createFakeTube(8),
createFakeTube(9),
createFakeTube(10)
});
}
case INSTRUCTION_BOOK_IDLE -> {
tubeHolder.setState(TubeHolderState.IDLE);
}
}
return tubeHolder;
}
public EmergencyTubePos getVirtualEmergencyTube() {
var tubePosState = new EmergencyTubePos();
switch (virtualStateModeMgr.virtualStateMode) {
case UI_TEST_MODE, INSTRUCTION_BOOK_RUNNING -> {
tubePosState.tube = createFakeTube(0);
tubePosState.tube.setPos(0);
tubePosState.tube.setIsEmergency(true);
tubePosState.tube.setState(emergencyTubeState);
}
case INSTRUCTION_BOOK_IDLE -> {
tubePosState.tube.setState(emergencyTubeState);
}
}
return tubePosState;
}
public Integer getVirtualTubeStateVersion() {
return version;
}
public void incrementVersion() {
version++;
}
private void addProjInfoToTube(Tube tube, Integer projId) {
ProjBriefInfo projBriefInfo = FakeA8kConsumableContainerFactory.buildFakeProjBriefInfo(projId);
tube.getProjInfo().add(projBriefInfo);
tube.getProjIds().add(projBriefInfo.projId);
}
Tube createFakeTube(Integer pos) {
private Tube createFakeTube(Integer pos) {
Tube tube = new Tube(pos);
tube.setSampleId("250109_001E0" + pos);
tube.setBloodType(BloodType.WHOLE_BLOOD);
@ -67,40 +120,9 @@ public class TubeVirtualStateGenerator {
return tube;
}
public TubeHolder getVirtualTubeHolderState() {
TubeHolder tubeHolder = new TubeHolder();
tubeHolder.setTubes(new Tube[]{
createFakeTube(1),
createFakeTube(2),
createFakeTube(3),
createFakeTube(4),
createFakeTube(5),
createFakeTube(6),
createFakeTube(7),
createFakeTube(8),
createFakeTube(9),
createFakeTube(10)
});
tubeHolder.setState(TubeHolderState.PROCESSING);
return tubeHolder;
}
public EmergencyTubePos getVirtualEmergencyTube() {
var tubePosState = new EmergencyTubePos();
tubePosState.tube = createFakeTube(0);
tubePosState.tube.setPos(0);
tubePosState.tube.setIsEmergency(true);
tubePosState.tube.setState(emptyTubeState);
return tubePosState;
}
public Integer getVirtualTubeStateVersion() {
//虚拟状态生成模式
return stateVersion;
synchronized public void changeEmergencyTubeState(TubeState state) {
this.emergencyTubeState = state;
incrementVersion();
}
public void setEmptyTubeState(TubeState emptyTubeState) {
this.emptyTubeState = emptyTubeState;
stateVersion++;
}
}

59
src/main/java/a8k/app/service/virtualstate/generator/VirtualDeviceWorkStateGenerator.java

@ -0,0 +1,59 @@
package a8k.app.service.virtualstate.generator;
import a8k.app.constant.AppConstant;
import a8k.app.factory.FakeA8kConsumableContainerFactory;
import a8k.app.service.utils.ProjInfoUtils;
import a8k.app.service.virtualstate.VirtualStateModeMgr;
import a8k.app.type.PreReactionGrid;
import a8k.app.type.PreReactionGridGroup;
import a8k.app.type.a8k.ConsumableGroup;
import a8k.app.type.a8k.LittleBottleConsumableType;
import a8k.app.type.a8k.state.DeviceWorkState;
import a8k.app.type.a8k.state.enumtype.A8kWorkState;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@RequiredArgsConstructor
public class VirtualDeviceWorkStateGenerator {
private final VirtualStateModeMgr virtualStateModeMgr;
private Integer version = Integer.MAX_VALUE / 2;
synchronized public DeviceWorkState getState() {
switch (virtualStateModeMgr.virtualStateMode) {
case UI_TEST_MODE -> { //UI测试
return getRunningState();
}
case INSTRUCTION_BOOK_IDLE -> { //说明书-耗材页面-空闲
return getIDLEState();
}
case INSTRUCTION_BOOK_RUNNING -> { //说明书运行中
return getRunningState();
}
}
return null;
}
synchronized public Integer getVersion() {
return version;
}
synchronized public void incrementVersion() {
version++;
}
private DeviceWorkState getIDLEState() {
DeviceWorkState deviceWorkState = new DeviceWorkState();
deviceWorkState.workState = A8kWorkState.IDLE;
return deviceWorkState;
}
private DeviceWorkState getRunningState() {
DeviceWorkState deviceWorkState = new DeviceWorkState();
deviceWorkState.workState = A8kWorkState.WORKING;
return deviceWorkState;
}
}

139
src/main/java/a8k/app/service/virtualstate/generator/VirtualIncubationPlateStateGenerator.java

@ -0,0 +1,139 @@
package a8k.app.service.virtualstate.generator;
import a8k.app.factory.ZAppPromptFactory;
import a8k.app.iflytophald.type.protocol.A8kEcode;
import a8k.app.service.virtualstate.VirtualStateModeMgr;
import a8k.app.type.a8k.BloodType;
import a8k.app.type.a8k.proj.ProjBriefInfo;
import a8k.app.type.a8k.state.IncubationPlate;
import a8k.app.type.a8k.state.IncubationSubTank;
import a8k.app.type.a8k.state.SampleInfo;
import a8k.app.type.a8k.state.enumtype.IncubationSubTankState;
import a8k.app.type.error.AppError;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
@Slf4j
@RequiredArgsConstructor
public class VirtualIncubationPlateStateGenerator {
private final VirtualStateModeMgr virtualStateModeMgr;
synchronized public IncubationPlate getVirtualIncubationPlateState() {
switch (virtualStateModeMgr.virtualStateMode) {
case UI_TEST_MODE -> { //UI测试
return getStateInUITestMode();
}
case INSTRUCTION_BOOK_IDLE -> { //说明书-耗材页面-空闲
return getStateInInstructionBookIDLE();
}
case INSTRUCTION_BOOK_RUNNING -> { //说明书运行中
return getStateInInstructionBookRunning();
}
}
return null;
}
public void incrementVersion() {}
//
// PRIVATE
//
synchronized private IncubationPlate getStateInInstructionBookIDLE() {
IncubationPlate incubationPlate = new IncubationPlate();
for (IncubationSubTank subtank : incubationPlate.subtanks) {
subtank.state = IncubationSubTankState.EMPTY;
}
return incubationPlate;
}
synchronized private IncubationPlate getStateInUITestMode() {
/*
* 尽可能展示所有状态测试前端页面
*/
IncubationPlate incubationPlate = new IncubationPlate();
int i = 0;
for (IncubationSubTank subtank : incubationPlate.subtanks) {
assignSubTankState(subtank);
i++;
switch (i % 6) {
case 1 -> subtank.state = IncubationSubTankState.RESERVED;
case 2 -> subtank.state = IncubationSubTankState.WAITING_FOR_DROP;
case 3 -> subtank.state = IncubationSubTankState.INCUBATING;
case 4 -> subtank.state = IncubationSubTankState.ERROR;
case 5 -> subtank.state = IncubationSubTankState.INCUBATION_COMPLETE;
default -> subtank.state = IncubationSubTankState.EMPTY;
}
subtank.isEmergency = (i % 2 == 0);
}
return incubationPlate;
}
synchronized private IncubationPlate getStateInInstructionBookRunning() {
IncubationPlate incubationPlate = new IncubationPlate();
int i = 0;
for (IncubationSubTank subtank : incubationPlate.subtanks) {
i++;
switch (i) {
case 1 -> {
assignSubTankState(subtank);
subtank.state = IncubationSubTankState.RESERVED;
}
case 2 -> {
assignSubTankState(subtank);
subtank.state = IncubationSubTankState.WAITING_FOR_DROP;
subtank.isEmergency = (true);
}
case 3 -> {
assignSubTankState(subtank);
subtank.state = IncubationSubTankState.INCUBATING;
}
case 4 -> {
assignSubTankState(subtank);
subtank.state = IncubationSubTankState.ERROR;
}
case 5 -> {
assignSubTankState(subtank);
subtank.state = IncubationSubTankState.INCUBATION_COMPLETE;
}
default -> {
subtank.state = IncubationSubTankState.EMPTY;
}
}
}
return incubationPlate;
}
private void assignSubTankState(IncubationSubTank subtank) {
subtank.sampleInfo = new SampleInfo(
"250109_001E01", 0, false, false, BloodType.WHOLE_BLOOD, "B3A7KK8DKF", "250109_001E"
);
subtank.sampleInfo.bloodType = BloodType.WHOLE_BLOOD;
subtank.sampleInfo.sampleBarcode = "112334455667";
subtank.sampleInfo.userid = "250109_001E";
subtank.projInfo = new ProjBriefInfo();
subtank.projInfo.projId = 1;
subtank.projInfo.projName = "hsCRP";
subtank.projInfo.projShortName = "CA";
subtank.projInfo.color = "#DC143C";
subtank.sampleInfo.sampleId = "250109_001E01";
subtank.projId = 1;
subtank.lotId = "CA123456";
subtank.isEmergency = false;
if (subtank.state.equals(IncubationSubTankState.ERROR)) {
subtank.error = new AppError(A8kEcode.PROJ_CARD_ERROR_WRONG_UNSUPPORTED, "");
subtank.errorInfo = ZAppPromptFactory.buildAppPrompt(subtank.error);
}
subtank.startIncubatedTime = new Date().getTime();
subtank.incubatedTimeSec = 3 * 60;
subtank.remainTimeSec = 3 * 60;
}
}

64
src/main/java/a8k/app/service/virtualstate/generator/VirtualOptScannerStateGenerator.java

@ -0,0 +1,64 @@
package a8k.app.service.virtualstate.generator;
import a8k.app.service.virtualstate.VirtualStateModeMgr;
import a8k.app.type.a8k.BloodType;
import a8k.app.type.a8k.proj.ProjBriefInfo;
import a8k.app.type.a8k.state.OptScanModuleState;
import a8k.app.type.a8k.state.SampleInfo;
import a8k.app.type.a8k.state.enumtype.OptScanModuleStateEnum;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@RequiredArgsConstructor
public class VirtualOptScannerStateGenerator {
private final VirtualStateModeMgr virtualStateModeMgr;
private Integer version = Integer.MAX_VALUE / 2;
synchronized public OptScanModuleState getVirtualOptScanModuleState() {
switch (virtualStateModeMgr.virtualStateMode) {
case UI_TEST_MODE -> { //UI测试
return getRunningState();
}
case INSTRUCTION_BOOK_IDLE -> { //说明书-耗材页面-空闲
return getIDLEState();
}
case INSTRUCTION_BOOK_RUNNING -> { //说明书运行中
return getRunningState();
}
}
return null;
}
synchronized public Integer getVersion() {
return version;
}
synchronized public void incrementVersion() {
version++;
}
synchronized private OptScanModuleState getIDLEState() {
OptScanModuleState optScanModuleState = new OptScanModuleState();
optScanModuleState.state = OptScanModuleStateEnum.EMPTY;
return optScanModuleState;
}
synchronized private OptScanModuleState getRunningState() {
OptScanModuleState optScanModuleState = new OptScanModuleState();
optScanModuleState.state = OptScanModuleStateEnum.SCANNING;
optScanModuleState.sampleInfo = new SampleInfo(
"SAMPLE-123456", 1, true, false, BloodType.WHOLE_BLOOD, "1234567890", "2250103_003"
);
optScanModuleState.setProjInfo(new ProjBriefInfo(1, "hsCRP", "CA", "#DC143C"));
optScanModuleState.setProjId(1);
optScanModuleState.setLotId("CA123456");
return optScanModuleState;
}
}

101
src/main/java/a8k/app/service/virtualstate/generator/VirtualPreReactionGridGroupStateGenerator.java

@ -0,0 +1,101 @@
package a8k.app.service.virtualstate.generator;
import a8k.app.constant.AppConstant;
import a8k.app.factory.FakeA8kConsumableContainerFactory;
import a8k.app.service.utils.ProjInfoUtils;
import a8k.app.service.virtualstate.VirtualStateModeMgr;
import a8k.app.type.PreReactionGrid;
import a8k.app.type.PreReactionGridGroup;
import a8k.app.type.a8k.ConsumableGroup;
import a8k.app.type.a8k.LittleBottleConsumableType;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@RequiredArgsConstructor
public class VirtualPreReactionGridGroupStateGenerator {
private final VirtualStateModeMgr virtualStateModeMgr;
private Integer version = Integer.MAX_VALUE / 2;
synchronized public PreReactionGridGroup getGroupState(ConsumableGroup group) {
switch (virtualStateModeMgr.virtualStateMode) {
case UI_TEST_MODE -> { //UI测试
return getRunningState(group);
}
case INSTRUCTION_BOOK_IDLE -> { //说明书-耗材页面-空闲
return getIDLEState(group);
}
case INSTRUCTION_BOOK_RUNNING -> { //说明书运行中
return getRunningState(group);
}
}
return null;
}
synchronized public Integer getVersion() {
return version;
}
synchronized public void incrementVersion() {
version++;
}
private PreReactionGridGroup getIDLEState(ConsumableGroup group) {
PreReactionGridGroup gridGroup = new PreReactionGridGroup(group);
gridGroup.group = group;
gridGroup.installed = false;
gridGroup.hasSomeGridInReacting = false;
gridGroup.hasSomeGridReactedCompleted = false;
return gridGroup;
}
private PreReactionGridGroup getRunningState(ConsumableGroup group) {
PreReactionGridGroup gridGroup = new PreReactionGridGroup(group);
gridGroup.group = group;
if (group.off % 2 == 0) {
gridGroup.installed = true;
gridGroup.hasSomeGridInReacting = true;
gridGroup.hasSomeGridReactedCompleted = true;
} else {
gridGroup.installed = false;
gridGroup.hasSomeGridInReacting = false;
gridGroup.hasSomeGridReactedCompleted = false;
}
gridGroup.consumableType = LittleBottleConsumableType.BufferSolution;
var projBuildInInfo = FakeA8kConsumableContainerFactory.buildFakeProjBuildInInfo(group.off);
gridGroup.projBriefInfo = ProjInfoUtils.buildProjBrefInfo(projBuildInInfo);
gridGroup.version = 10;
for (int i = 0; i < AppConstant.CONSUMABLE_NUM; i++) {
gridGroup.grids.get(i).projId = projBuildInInfo.projId;
gridGroup.grids.get(i).projBuildinInfo = projBuildInInfo;
gridGroup.grids.get(i).projExtInfoCard = null;
switch (i / 5) {
case 0 -> {
gridGroup.grids.get(i).state = PreReactionGrid.State.UNINSTALL;
}
case 1 -> {
gridGroup.grids.get(i).state = PreReactionGrid.State.USED;
}
case 2 -> {
gridGroup.grids.get(i).state = PreReactionGrid.State.REACTION_COMPLETED;
gridGroup.grids.get(i).sampleInfo.userid = "UID123";
}
case 3 -> {
gridGroup.grids.get(i).state = PreReactionGrid.State.REACTING;
gridGroup.grids.get(i).sampleInfo.userid = "UID123";
gridGroup.grids.get(i).reactionRemainingTime = 3 * 60L;
}
case 4 -> {
gridGroup.grids.get(i).state = PreReactionGrid.State.TO_BE_USED;
}
}
}
return gridGroup;
}
}

60
src/main/java/a8k/app/service/virtualstate/generator/VirtualSensorStateGenerator.java

@ -0,0 +1,60 @@
package a8k.app.service.virtualstate.generator;
import a8k.app.service.virtualstate.VirtualStateModeMgr;
import a8k.app.type.a8k.state.DeviceWorkState;
import a8k.app.type.a8k.state.SensorState;
import a8k.app.type.a8k.state.enumtype.A8kWorkState;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@RequiredArgsConstructor
public class VirtualSensorStateGenerator {
private final VirtualStateModeMgr virtualStateModeMgr;
private Integer version = Integer.MAX_VALUE / 2;
private Integer cnt = 0;
synchronized public SensorState getState() {
switch (virtualStateModeMgr.virtualStateMode) {
case UI_TEST_MODE -> { //UI测试
return getRunningState();
}
case INSTRUCTION_BOOK_IDLE -> { //说明书-耗材页面-空闲
return getIDLEState();
}
case INSTRUCTION_BOOK_RUNNING -> { //说明书运行中
return getRunningState();
}
}
return null;
}
synchronized public void incrementVersion() {
version++;
}
private SensorState getIDLEState() {
SensorState sensorState = new SensorState();
sensorState.setPboxTemperature(24);
sensorState.setIncubateBoxTemperature(25);
sensorState.setWasteBinFullFlag(false);
cnt++;
sensorState.setIncubateBoxTemperatureReady(cnt % 2 == 0); //每次调用切换一次状态
sensorState.setPboxTemperatureReady(cnt % 2 == 0); //每次调用切换一次状态
return sensorState;
}
private SensorState getRunningState() {
SensorState sensorState = new SensorState();
sensorState.setPboxTemperature(25);
sensorState.setIncubateBoxTemperature(25);
sensorState.setWasteBinFullFlag(false);
sensorState.setIncubateBoxTemperatureReady(true); //每次调用切换一次状态
sensorState.setPboxTemperatureReady(true); //每次调用切换一次状态
return sensorState;
}
}

2
src/main/java/a8k/app/type/GState.java

@ -22,7 +22,7 @@ public class GState {
public String mcuVersion = "";
public BoardVersions mcuVersionDetail = new BoardVersions(); //MCU版本详细信息
//设备SN
public String sn = "TEST001";// 巴迪泰 叫做 序列号(FactorySerial)
public String sn = "TEST001";// 巴迪泰 叫做 序列号(FactorySerial)
//
public String assetId = "TEST001";// 巴迪泰 叫做 出厂序列号(DeviceSerial)
//

95
src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java

@ -12,7 +12,12 @@ import a8k.extui.page.extapp.debug_assistant.*;
import a8k.extui.page.extapp.profession_test.ExperimentConsistencyTestingPage;
import a8k.extui.page.extapp.profession_test.P01PipetteGunVerification;
import a8k.extui.page.extsetting.db.*;
import a8k.extui.page.hardwaretest.*;
import a8k.extui.page.factory.DeviceExSettingPage;
import a8k.extui.page.factory.DeviceIdSettingPage;
import a8k.extui.page.factory.hardwaretest.*;
import a8k.extui.page.factory.opt.A8kOptVerification;
import a8k.extui.page.factory.opt.OptModuleParamCalibration;
import a8k.extui.page.factory.verification.*;
import a8k.extui.page.init.DeviceInitPage;
import a8k.extui.page.measurement.*;
@ -22,9 +27,6 @@ import a8k.extui.page.test.codetest.OptFormulaTestPageV2;
import a8k.extui.page.extsetting.pos_calibration.*;
import a8k.extui.page.test.stress_test.PipetteGunStressTest;
import a8k.extui.page.test.verification.*;
import a8k.extui.page.test.verification.P34LiquidOperationTestPage;
import a8k.extui.page.test.verification.P10ProjejIDCardTestPage;
import jakarta.annotation.PostConstruct;
import org.springframework.stereotype.Component;
@ -84,7 +86,6 @@ public class ExtApiPageGroupCfgMgr {
@PostConstruct
void init() {
pushMenu(new Menu(DeviceInitPage.class, "设备初始化"));
pushMenu(new Menu("状态.数据.设置", ZList.of(
new Menu("状态", ZList.of(
new Menu(P11IncubationPlateStateDebugPageAll.class, "孵育盘"),
@ -96,18 +97,6 @@ public class ExtApiPageGroupCfgMgr {
new Menu(ProjInfoMgrPage.class, "项目信息管理"),
new Menu(ReactionRecordMgrDebugPage.class, "反应记录")
)),
new Menu(DeviceExSettingPage.class, "设备扩展配置"),
new Menu(A8kSubModuleRegAndConfigSyncPage.class, "单片机-配置管理"),
new Menu("坐标设置", ZList.of(
new Menu(DeviceActionParameterSettingPage.class, "设备动作参数设置"),
new Menu(P02TubeFeedingModulePosCalibrationPage.class, "试管入料设置"),
new Menu(P03TubePreProcessPosCalibrationPage.class, "试管预处理设置"),
new Menu(P04ReactionPlatesTransmitControlerCalibrationPage.class, "反应板相关位置设置"),
new Menu(P20HbotTipPosCalibrationPage.class, "Tip耗材位置设置"),
new Menu(P21HbotConsumablesPosCalibrationPage.class, "缓冲液&探测物质位置设置"),
new Menu(P24Hbot2DCodeScanPosCalibrationPage.class, "耗材扫描设置"),
new Menu(P25HbotSamplePosCalibrationPage.class, "取样位置设置")
)),
new Menu(P20AppSettingDebugPage.class, "系统设置"),
new Menu(P00AppEventAndMessageBoxDebugPage.class, "事件与消息")
))
@ -121,7 +110,8 @@ public class ExtApiPageGroupCfgMgr {
new Menu(P01ProjInfoDebugPage.class, "ID卡操作")
)));
pushMenu(new Menu("底层驱动", ZList.of(
pushMenu(new Menu("底层驱动&&配置", ZList.of(
new Menu(A8kSubModuleRegAndConfigSyncPage.class, "单片机-配置管理"),
new Menu(HbotCtrlPage.class, "HBOT控制"),
new Menu("移液枪驱动", ZList.of(
new Menu(PipetteGunCfgSync.class, "配置同步"),
@ -135,18 +125,44 @@ public class ExtApiPageGroupCfgMgr {
new Menu(PipetteGunLiquidConfigSettingPage.class, "设置液体参数"),
new Menu(PipetteGunContainerConfigSettingPage.class, "设置液体容器参数")
)),
new Menu(MotorCtrlPage.class, "电机驱动"),
new Menu(MiniServoCtrlPage.class, "舵机驱动"),
new Menu(CodeScannerDriverCtrlPage.class, "条码扫描仪"),
new Menu(PrinterDebugPage.class, "打印机"),
new Menu(OptScannerCtrlPage.class, "光学模组"),
new Menu(WaterCoolingTempCtrlDriverPage.class, "水冷控温驱动")
)));
pushMenu(new Menu("高级应用", ZList.of(
new Menu("APP测试", ZList.of(
new Menu(LisTestPage.class, "LIS测试"),
new Menu(PrinterDebugPage.class, "打印机测试")
)),
new Menu("过检专用", ZList.of(
new Menu(P01PipetteGunVerification.class, "移液枪验证"),
new Menu(ExperimentConsistencyTestingPage.class, "一致性测试")
)),
new Menu("压力测试", ZList.of(
new Menu(PipetteGunStressTest.class, "移液枪压力测试")
)),
new Menu("代码测试", ZList.of(
new Menu(OptFormulaTestPageV2.class, "光学公式测试1"),
new Menu(OptFormulaTestPage.class, "光学公式测试2"),
new Menu(BiLisDoubleTrackChannelTestPage.class, "BiLis双通道测试")
)),
new Menu("前端测试助手", ZList.of(
new Menu(FakeReactionRecordGeneratorPage.class, "虚拟反应记录生成"),
new Menu(VirtualEventGeneratorPage.class, "虚拟事件生成"),
new Menu(IDCardDataGeneratorPage.class, "ID卡数据生成器")
)),
new Menu(VirtualStateGenerateModeSettingPage.class, "虚拟状态生成模式-助手"),
new Menu(UsrOperationSimulationPage.class, "用户行为模拟器"),
new Menu(CodeGeneratorPage.class, "条码字符生成工具")
)));
pushMenu(new Menu("工厂生产", ZList.of(
new Menu("硬件测试", ZList.of(
new Menu(SubBoardProberPage.class, "子板探测"),
new Menu(SubModuleVersionPreviewPage.class, "全部子模块版本预览"),
@ -164,21 +180,21 @@ public class ExtApiPageGroupCfgMgr {
new Menu(LISUartTestPage.class, "LIS串口测试"),
new Menu(PrinterDebugPage.class, "打印机测试")
)),
new Menu("APP测试", ZList.of(
new Menu(LisTestPage.class, "LIS测试"),
new Menu(PrinterDebugPage.class, "打印机测试")
new Menu("动作参数配置", ZList.of(
new Menu(DeviceActionParameterSettingPage.class, "设备动作参数设置"),
new Menu(P02TubeFeedingModulePosCalibrationPage.class, "试管入料设置"),
new Menu(P03TubePreProcessPosCalibrationPage.class, "试管预处理设置"),
new Menu(P04ReactionPlatesTransmitControlerCalibrationPage.class, "反应板相关位置设置"),
new Menu(P20HbotTipPosCalibrationPage.class, "Tip耗材位置设置"),
new Menu(P21HbotConsumablesPosCalibrationPage.class, "缓冲液&探测物质位置设置"),
new Menu(P24Hbot2DCodeScanPosCalibrationPage.class, "耗材扫描设置"),
new Menu(P25HbotSamplePosCalibrationPage.class, "取样位置设置")
)),
new Menu("光学标定与验证", ZList.of(
new Menu(A8kOptVerification.class, "光学模组验证"),
new Menu(OptModuleParamCalibration.class, "光学模块参数校准"),
new Menu(OptAlgoTestPage.class, "光学算法测试")
)),
new Menu("过检专用", ZList.of(
new Menu(P01PipetteGunVerification.class, "移液枪验证"),
new Menu(ExperimentConsistencyTestingPage.class, "一致性测试")
)),
new Menu("坐标测量", ZList.of(
new Menu(HbotPosMeasurePage.class, "HBOT测量(电控)"),
new Menu(HbotFreedomPosMeasurePage.class, "HBO测量(自由模式)"),
@ -199,25 +215,10 @@ public class ExtApiPageGroupCfgMgr {
new Menu(HbotCodeScanPosVerificationPage.class, "单步-HBOT扫码"),
new Menu(P50VerificationScriptPage.class, "脚本-模块验证")
)),
new Menu("压力测试", ZList.of(
new Menu(PipetteGunStressTest.class, "移液枪压力测试")
)),
new Menu("代码测试", ZList.of(
new Menu(OptFormulaTestPageV2.class, "光学公式测试1"),
new Menu(OptFormulaTestPage.class, "光学公式测试2"),
new Menu(BiLisDoubleTrackChannelTestPage.class, "BiLis双通道测试")
)),
new Menu("前端测试助手", ZList.of(
new Menu(FakeReactionRecordGeneratorPage.class, "虚拟反应记录生成"),
new Menu(VirtualEventGeneratorPage.class, "虚拟事件生成"),
new Menu(IDCardDataGeneratorPage.class, "ID卡数据生成器"),
new Menu(VirtualReportModeOperationPage.class, "虚拟报告模式操作"),
new Menu(DeviceVirtualStateMgrSettingPage.class, "虚拟状态上报配置")
)),
new Menu(UsrOperationSimulationPage.class, "用户行为模拟器"),
new Menu(CodeGeneratorPage.class, "条码字符生成工具")
)));
new Menu(DeviceExSettingPage.class, "设备扩展配置"),
new Menu(DeviceIdSettingPage.class, "ID配置")
)));
////////////////////////////////////////////////////////////////////////////////////////////

6
src/main/java/a8k/extui/mgr/ExtApiPageMgr.java

@ -1,7 +1,10 @@
package a8k.extui.mgr;
import a8k.app.service.os.OSDeviceInfoMgrService;
import a8k.extui.type.ExUIFunction;
import a8k.extui.type.ExtUIPageCfg;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
@ -10,8 +13,9 @@ import java.util.ArrayList;
import java.util.List;
@Component
public class ExtApiPageMgr {
List<ExtUIPageCfg> pages = new ArrayList<>();
private final List<ExtUIPageCfg> pages = new ArrayList<>();
public void addPage(ExtUIPageCfg page) {
pages.add(page);

40
src/main/java/a8k/extui/page/extapp/VirtualStateGenerateModeSettingPage.java

@ -0,0 +1,40 @@
package a8k.extui.page.extapp;
import a8k.app.service.virtualstate.DeviceVirtualStateMgrService;
import a8k.app.service.virtualstate.VirtualStateMode;
import a8k.app.type.a8k.state.EmergencyTubePos;
import a8k.app.type.a8k.state.enumtype.TubeState;
import a8k.extui.mgr.ExtApiPageMgr;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@RequiredArgsConstructor
public class VirtualStateGenerateModeSettingPage {
private final ExtApiPageMgr extApiPageMgr;
private final DeviceVirtualStateMgrService deviceVirtualStateMgrService;
public void changeVirtualStateMode(VirtualStateMode mode) {
deviceVirtualStateMgrService.changeVirtualStateMode(mode);
}
public void changeEmergencyTubeState(TubeState tubeState) {
deviceVirtualStateMgrService.changeEmergencyTubeState(tubeState);
}
@PostConstruct
public void init() {
var page = extApiPageMgr.newPage(this);
page.newGroup("调试助手");
page.addFunction("修改虚拟状态模式", this::changeVirtualStateMode)
.setParamVal("mode", deviceVirtualStateMgrService::getMode);
page.addFunction("修改急诊试管状态", this::changeEmergencyTubeState)
.setParamVal("tubeState", deviceVirtualStateMgrService::getEmergencyTubeState);
extApiPageMgr.addPage(page);
}
}

35
src/main/java/a8k/extui/page/extapp/debug_assistant/DeviceVirtualStateMgrSettingPage.java

@ -1,35 +0,0 @@
package a8k.extui.page.extapp.debug_assistant;
import a8k.app.service.background.AppEventBusService;
import a8k.app.service.data.ProjInfoMgrService;
import a8k.app.service.statemgr.AppFlagStateMgr;
import a8k.app.service.virtualstate.DeviceVirtualStateMgrService;
import a8k.app.type.a8k.state.enumtype.TubeState;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ExtUIPageCfg;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
@Slf4j
public class DeviceVirtualStateMgrSettingPage {
private final ExtApiPageMgr extApiPageMgr;
private final DeviceVirtualStateMgrService deviceVirtualStateMgrService;
public void setEmergencyTubeState(TubeState tubeState) {
deviceVirtualStateMgrService.setEmptyTubeState(tubeState);
}
@PostConstruct
void init() {
ExtUIPageCfg page = new ExtUIPageCfg(this);
page.addFunction("设置应急管状态", this::setEmergencyTubeState);
extApiPageMgr.addPage(page);
}
}

38
src/main/java/a8k/extui/page/extapp/debug_assistant/VirtualReportModeOperationPage.java

@ -1,38 +0,0 @@
package a8k.extui.page.extapp.debug_assistant;
import a8k.app.service.background.AppEventBusService;
import a8k.app.service.data.ProjInfoMgrService;
import a8k.app.service.statemgr.AppFlagStateMgr;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ExtUIPageCfg;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class VirtualReportModeOperationPage {
@Resource
AppEventBusService eventBus;
@Resource
ExtApiPageMgr extApiPageMgr;
private final ProjInfoMgrService projInfoMgrService;
private final AppEventBusService appEventBusService;
private final AppFlagStateMgr appFlagStateMgr;
public void resetAppWarningFlagState() {
appFlagStateMgr.resetVirtualState();
}
@PostConstruct
void init() {
ExtUIPageCfg page = new ExtUIPageCfg(this);
page.addFunction("重置状态列表(虚拟模式下)", this::resetAppWarningFlagState);
extApiPageMgr.addPage(page);
}
}

10
src/main/java/a8k/extui/page/extsetting/db/DeviceExSettingPage.java → src/main/java/a8k/extui/page/factory/DeviceExSettingPage.java

@ -1,17 +1,9 @@
package a8k.extui.page.extsetting.db;
package a8k.extui.page.factory;
import a8k.app.controler.filemgr.StorageControler;
import a8k.app.dao.DeviceActionParameterDao;
import a8k.app.dao.DeviceExSettingDao;
import a8k.app.dao.type.db.DeviceExSetting;
import a8k.app.dao.type.db.Parameter;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ExtUIPageCfg;
import a8k.extui.type.ExtUiTable;
import a8k.extui.type.param.ExtUIFile;
import a8k.extui.type.ret.FileToBeDownload;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

40
src/main/java/a8k/extui/page/factory/DeviceIdSettingPage.java

@ -0,0 +1,40 @@
package a8k.extui.page.factory;
import a8k.app.dao.DeviceExSettingDao;
import a8k.app.service.os.OSDeviceInfoMgrService;
import a8k.app.type.exception.AppException;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ExtUIPageCfg;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
@RequiredArgsConstructor
public class DeviceIdSettingPage {
private final ExtApiPageMgr extApiPageMgr;
private final DeviceExSettingDao deviceExSettingDao;
private final OSDeviceInfoMgrService osDeviceInfoMgrService;
public void setSN(String sn) throws AppException {
osDeviceInfoMgrService.setSN(sn);
}
public void setAssetId(String AssetId) throws AppException {
osDeviceInfoMgrService.setAssetId(AssetId);
}
@PostConstruct
void init() throws NoSuchMethodException {
ExtUIPageCfg page = new ExtUIPageCfg(this);
page.addFunction("设置工程序列号", this::setSN)
.setParamVal("sn", osDeviceInfoMgrService::readSN);
page.addFunction("设置出厂序列号", this::setAssetId)
.setParamVal("AssetId", osDeviceInfoMgrService::readAssetId);
extApiPageMgr.addPage(page);
}
}

2
src/main/java/a8k/extui/page/hardwaretest/A8kSubModuleRegAndConfigInitPage.java → src/main/java/a8k/extui/page/factory/hardwaretest/A8kSubModuleRegAndConfigInitPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.hardwaretest;
package a8k.extui.page.factory.hardwaretest;
import a8k.app.service.data.SubModuleConfigService;
import a8k.app.service.data.SubModuleRegInitialValueMgrService;

2
src/main/java/a8k/extui/page/hardwaretest/HBotHardwareTestPage.java → src/main/java/a8k/extui/page/factory/hardwaretest/HBotHardwareTestPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.hardwaretest;
package a8k.extui.page.factory.hardwaretest;
import a8k.app.iflytophald.driver.HbotDriver;
import a8k.app.iflytophald.driver.PipetteCtrlDriverV2;

2
src/main/java/a8k/extui/page/hardwaretest/ICCardReaderTestPage.java → src/main/java/a8k/extui/page/factory/hardwaretest/ICCardReaderTestPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.hardwaretest;
package a8k.extui.page.factory.hardwaretest;
import a8k.app.dao.type.db.ProjExtInfoCard;
import a8k.app.service.background.ProjIDCardCtrlAndMonitorService;

2
src/main/java/a8k/extui/page/hardwaretest/InputIOStateHardwareTestPage.java → src/main/java/a8k/extui/page/factory/hardwaretest/InputIOStateHardwareTestPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.hardwaretest;
package a8k.extui.page.factory.hardwaretest;
import a8k.app.type.exception.AppException;
import a8k.app.iflytophald.driver.InputDetectDriver;

2
src/main/java/a8k/extui/page/hardwaretest/LISUartTestPage.java → src/main/java/a8k/extui/page/factory/hardwaretest/LISUartTestPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.hardwaretest;
package a8k.extui.page.factory.hardwaretest;
import a8k.app.iflytophald.channel.LisUartCommunicationChannel;
import a8k.app.type.lis.LISSerialBaudrateType;

2
src/main/java/a8k/extui/page/hardwaretest/MiniServoHardwareTestPage.java → src/main/java/a8k/extui/page/factory/hardwaretest/MiniServoHardwareTestPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.hardwaretest;
package a8k.extui.page.factory.hardwaretest;
import a8k.app.iflytophald.driver.MiniServoDriver;

2
src/main/java/a8k/extui/page/hardwaretest/MiniServoPosCalibratePage.java → src/main/java/a8k/extui/page/factory/hardwaretest/MiniServoPosCalibratePage.java

@ -1,4 +1,4 @@
package a8k.extui.page.hardwaretest;
package a8k.extui.page.factory.hardwaretest;
import a8k.app.service.lowerctrl.TubeFeedingExCtrlService;

2
src/main/java/a8k/extui/page/hardwaretest/MiscHardwareTestPage.java → src/main/java/a8k/extui/page/factory/hardwaretest/MiscHardwareTestPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.hardwaretest;
package a8k.extui.page.factory.hardwaretest;
import a8k.app.iflytophald.driver.MiniServoDriver;

2
src/main/java/a8k/extui/page/hardwaretest/MotorHardwareTestPage.java → src/main/java/a8k/extui/page/factory/hardwaretest/MotorHardwareTestPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.hardwaretest;
package a8k.extui.page.factory.hardwaretest;
import a8k.app.iflytophald.driver.StepMotorCtrlDriver;
import a8k.app.iflytophald.type.protocol.StepMotorMId;

2
src/main/java/a8k/extui/page/hardwaretest/MotorPPSHardwareTestPage.java → src/main/java/a8k/extui/page/factory/hardwaretest/MotorPPSHardwareTestPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.hardwaretest;
package a8k.extui.page.factory.hardwaretest;
import a8k.app.iflytophald.driver.PipetteCtrlDriverV2;
import a8k.app.iflytophald.driver.StepMotorCtrlDriver;

2
src/main/java/a8k/extui/page/hardwaretest/OutputIOCtrlTestPage.java → src/main/java/a8k/extui/page/factory/hardwaretest/OutputIOCtrlTestPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.hardwaretest;
package a8k.extui.page.factory.hardwaretest;
import a8k.app.iflytophald.driver.OutputIOCtrlDriver;
import a8k.app.iflytophald.type.protocol.OutputIOId;

2
src/main/java/a8k/extui/page/hardwaretest/PipetteGunHardwareTestPage.java → src/main/java/a8k/extui/page/factory/hardwaretest/PipetteGunHardwareTestPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.hardwaretest;
package a8k.extui.page.factory.hardwaretest;
import a8k.app.iflytophald.driver.PipetteCtrlDriverV2;
import a8k.app.type.exception.AppException;

2
src/main/java/a8k/extui/page/hardwaretest/SubBoardProberPage.java → src/main/java/a8k/extui/page/factory/hardwaretest/SubBoardProberPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.hardwaretest;
package a8k.extui.page.factory.hardwaretest;
import a8k.app.iflytophald.driver.A8kCanBusBaseDriver;
import a8k.app.iflytophald.type.protocol.MId;

2
src/main/java/a8k/extui/page/hardwaretest/SubModuleVersionPreviewPage.java → src/main/java/a8k/extui/page/factory/hardwaretest/SubModuleVersionPreviewPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.hardwaretest;
package a8k.extui.page.factory.hardwaretest;
import a8k.app.type.exception.AppException;
import a8k.app.iflytophald.driver.A8kCanBusBaseDriver;

2
src/main/java/a8k/extui/page/hardwaretest/WaterTempControllerTestPage.java → src/main/java/a8k/extui/page/factory/hardwaretest/WaterTempControllerTestPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.hardwaretest;
package a8k.extui.page.factory.hardwaretest;
import a8k.app.iflytophald.driver.WaterTemperatureControllerDriver;
import a8k.app.iflytophald.type.protocol.TemperatureControlerMid;

2
src/main/java/a8k/extui/page/extapp/A8kOptVerification.java → src/main/java/a8k/extui/page/factory/opt/A8kOptVerification.java

@ -1,4 +1,4 @@
package a8k.extui.page.extapp;
package a8k.extui.page.factory.opt;
import a8k.app.dao.type.db.ReactionRecord;
import a8k.app.optalgo.A8kPeakAnalyzer;

2
src/main/java/a8k/extui/page/extapp/OptModuleParamCalibration.java → src/main/java/a8k/extui/page/factory/opt/OptModuleParamCalibration.java

@ -1,4 +1,4 @@
package a8k.extui.page.extapp;
package a8k.extui.page.factory.opt;
import a8k.app.dao.type.combination.ProjBuildInInfo;
import a8k.app.optalgo.type.A8kOptPeakInfo;

2
src/main/java/a8k/extui/page/test/verification/HbotCodeScanPosVerificationPage.java → src/main/java/a8k/extui/page/factory/verification/HbotCodeScanPosVerificationPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.test.verification;
package a8k.extui.page.factory.verification;
import a8k.app.iflytophald.driver.CodeScanerDriver;
import a8k.app.service.lowerctrl.HbotMoveExCtrlService;

2
src/main/java/a8k/extui/page/test/verification/P10ProjejIDCardTestPage.java → src/main/java/a8k/extui/page/factory/verification/P10ProjejIDCardTestPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.test.verification;
package a8k.extui.page.factory.verification;
import a8k.app.type.exception.AppException;
import a8k.app.dao.type.db.ProjExtInfoCard;

2
src/main/java/a8k/extui/page/test/verification/P30InfeedAndPreProcessPosVerificationPage.java → src/main/java/a8k/extui/page/factory/verification/P30InfeedAndPreProcessPosVerificationPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.test.verification;
package a8k.extui.page.factory.verification;
import a8k.app.type.exception.AppException;
import a8k.app.service.lowerctrl.*;

2
src/main/java/a8k/extui/page/test/verification/P31ReactionPlatesTransmitPosVerificationPage.java → src/main/java/a8k/extui/page/factory/verification/P31ReactionPlatesTransmitPosVerificationPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.test.verification;
package a8k.extui.page.factory.verification;
import a8k.app.type.a8k.ConsumableGroup;
import a8k.app.type.a8k.pos.IncubatorPos;

2
src/main/java/a8k/extui/page/test/verification/P32HbotPosVerificationPage.java → src/main/java/a8k/extui/page/factory/verification/P32HbotPosVerificationPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.test.verification;
package a8k.extui.page.factory.verification;
import a8k.app.service.ctrlmodule.TipOperationCtrlModule;
import a8k.app.type.a8k.ConsumableGroup;

2
src/main/java/a8k/extui/page/test/verification/P33HbotSamplePosVerificationPage.java → src/main/java/a8k/extui/page/factory/verification/P33HbotSamplePosVerificationPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.test.verification;
package a8k.extui.page.factory.verification;

2
src/main/java/a8k/extui/page/test/verification/P34LiquidOperationTestPage.java → src/main/java/a8k/extui/page/factory/verification/P34LiquidOperationTestPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.test.verification;
package a8k.extui.page.factory.verification;
import a8k.app.service.lowerctrl.TurntableMoveCtrlService;
import a8k.app.service.ctrlmodule.TipOperationCtrlModule;

2
src/main/java/a8k/extui/page/test/verification/P50VerificationScriptPage.java → src/main/java/a8k/extui/page/factory/verification/P50VerificationScriptPage.java

@ -1,4 +1,4 @@
package a8k.extui.page.test.verification;
package a8k.extui.page.factory.verification;
import a8k.app.iflytophald.driver.PipetteCtrlDriverV2;
import a8k.app.service.ctrlmodule.TipOperationCtrlModule;

20
src/main/resources/application.yml

@ -1,17 +1,17 @@
#WEB虚拟后端
#server.port: 80
#iflytophald.ip: 127.0.0.1
#iflytophald.enable: false
#device.runmode: "VirtualStateGenerateMode"
#lis.enable: false
#PC调试
server.port: 80
device.runmode: "RealMode"
iflytophald.ip: 192.168.8.10
iflytophald.enable: true
iflytophald.ip: 127.0.0.1
iflytophald.enable: false
device.runmode: "VirtualStateGenerateMode"
lis.enable: false
#PC调试
#server.port: 80
#device.runmode: "RealMode"
#iflytophald.ip: 192.168.8.10
#iflytophald.enable: true
#lis.enable: false
#硬件测试
#server.port: 8082
#iflytophald.ip: 192.168.8.10

Loading…
Cancel
Save