76 changed files with 4303 additions and 3818 deletions
-
6src/main/java/a8k/app/service/data/SubModuleRegInitialValueMgrService.java
-
63src/main/java/a8k/app/service/engineer/qatest/ExperimentConsistencyTestingService.java
-
36src/main/java/a8k/app/service/os/OSDeviceInfoMgrService.java
-
37src/main/java/a8k/app/service/statemgr/AppFlagStateMgr.java
-
296src/main/java/a8k/app/service/virtualstate/DeviceVirtualStateMgrService.java
-
7src/main/java/a8k/app/service/virtualstate/VirtualStateMode.java
-
22src/main/java/a8k/app/service/virtualstate/VirtualStateModeMgr.java
-
51src/main/java/a8k/app/service/virtualstate/generator/ConsumableStateGenerator.java
-
118src/main/java/a8k/app/service/virtualstate/generator/DeviceFlagStateVirtualStateGenerator.java
-
100src/main/java/a8k/app/service/virtualstate/generator/TubeVirtualStateGenerator.java
-
59src/main/java/a8k/app/service/virtualstate/generator/VirtualDeviceWorkStateGenerator.java
-
139src/main/java/a8k/app/service/virtualstate/generator/VirtualIncubationPlateStateGenerator.java
-
64src/main/java/a8k/app/service/virtualstate/generator/VirtualOptScannerStateGenerator.java
-
101src/main/java/a8k/app/service/virtualstate/generator/VirtualPreReactionGridGroupStateGenerator.java
-
60src/main/java/a8k/app/service/virtualstate/generator/VirtualSensorStateGenerator.java
-
2src/main/java/a8k/app/type/GState.java
-
95src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java
-
6src/main/java/a8k/extui/mgr/ExtApiPageMgr.java
-
40src/main/java/a8k/extui/page/extapp/VirtualStateGenerateModeSettingPage.java
-
35src/main/java/a8k/extui/page/extapp/debug_assistant/DeviceVirtualStateMgrSettingPage.java
-
38src/main/java/a8k/extui/page/extapp/debug_assistant/VirtualReportModeOperationPage.java
-
10src/main/java/a8k/extui/page/factory/DeviceExSettingPage.java
-
40src/main/java/a8k/extui/page/factory/DeviceIdSettingPage.java
-
2src/main/java/a8k/extui/page/factory/hardwaretest/A8kSubModuleRegAndConfigInitPage.java
-
2src/main/java/a8k/extui/page/factory/hardwaretest/HBotHardwareTestPage.java
-
2src/main/java/a8k/extui/page/factory/hardwaretest/ICCardReaderTestPage.java
-
2src/main/java/a8k/extui/page/factory/hardwaretest/InputIOStateHardwareTestPage.java
-
2src/main/java/a8k/extui/page/factory/hardwaretest/LISUartTestPage.java
-
2src/main/java/a8k/extui/page/factory/hardwaretest/MiniServoHardwareTestPage.java
-
2src/main/java/a8k/extui/page/factory/hardwaretest/MiniServoPosCalibratePage.java
-
2src/main/java/a8k/extui/page/factory/hardwaretest/MiscHardwareTestPage.java
-
2src/main/java/a8k/extui/page/factory/hardwaretest/MotorHardwareTestPage.java
-
2src/main/java/a8k/extui/page/factory/hardwaretest/MotorPPSHardwareTestPage.java
-
2src/main/java/a8k/extui/page/factory/hardwaretest/OutputIOCtrlTestPage.java
-
2src/main/java/a8k/extui/page/factory/hardwaretest/PipetteGunHardwareTestPage.java
-
2src/main/java/a8k/extui/page/factory/hardwaretest/SubBoardProberPage.java
-
2src/main/java/a8k/extui/page/factory/hardwaretest/SubModuleVersionPreviewPage.java
-
2src/main/java/a8k/extui/page/factory/hardwaretest/WaterTempControllerTestPage.java
-
2src/main/java/a8k/extui/page/factory/opt/A8kOptVerification.java
-
2src/main/java/a8k/extui/page/factory/opt/OptModuleParamCalibration.java
-
2src/main/java/a8k/extui/page/factory/verification/HbotCodeScanPosVerificationPage.java
-
2src/main/java/a8k/extui/page/factory/verification/P10ProjejIDCardTestPage.java
-
2src/main/java/a8k/extui/page/factory/verification/P30InfeedAndPreProcessPosVerificationPage.java
-
2src/main/java/a8k/extui/page/factory/verification/P31ReactionPlatesTransmitPosVerificationPage.java
-
2src/main/java/a8k/extui/page/factory/verification/P32HbotPosVerificationPage.java
-
2src/main/java/a8k/extui/page/factory/verification/P33HbotSamplePosVerificationPage.java
-
2src/main/java/a8k/extui/page/factory/verification/P34LiquidOperationTestPage.java
-
2src/main/java/a8k/extui/page/factory/verification/P50VerificationScriptPage.java
-
20src/main/resources/application.yml
@ -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; |
|||
} |
|||
} |
@ -0,0 +1,7 @@ |
|||
package a8k.app.service.virtualstate; |
|||
|
|||
public enum VirtualStateMode { |
|||
UI_TEST_MODE,//状态尽可能能全面的测试前端显示 |
|||
INSTRUCTION_BOOK_IDLE,//设备空闲 |
|||
INSTRUCTION_BOOK_RUNNING,//设备运行中 |
|||
} |
@ -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; |
|||
|
|||
} |
|||
} |
@ -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++; |
|||
} |
|||
} |
@ -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(); |
|||
} |
|||
} |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
|
|||
} |
@ -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; |
|||
} |
|||
|
|||
|
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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; |
|||
} |
|||
} |
@ -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); |
|||
} |
|||
} |
@ -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); |
|||
} |
|||
} |
@ -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); |
|||
} |
|||
} |
@ -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; |
@ -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); |
|||
} |
|||
} |
@ -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; |
@ -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; |
@ -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; |
@ -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; |
@ -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; |
@ -1,4 +1,4 @@ |
|||
package a8k.extui.page.hardwaretest; |
|||
package a8k.extui.page.factory.hardwaretest; |
|||
|
|||
|
|||
import a8k.app.iflytophald.driver.MiniServoDriver; |
@ -1,4 +1,4 @@ |
|||
package a8k.extui.page.hardwaretest; |
|||
package a8k.extui.page.factory.hardwaretest; |
|||
|
|||
|
|||
import a8k.app.service.lowerctrl.TubeFeedingExCtrlService; |
@ -1,4 +1,4 @@ |
|||
package a8k.extui.page.hardwaretest; |
|||
package a8k.extui.page.factory.hardwaretest; |
|||
|
|||
|
|||
import a8k.app.iflytophald.driver.MiniServoDriver; |
@ -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; |
@ -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; |
@ -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; |
@ -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; |
@ -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; |
@ -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; |
@ -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; |
@ -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; |
@ -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; |
@ -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; |
@ -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; |
@ -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.*; |
@ -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; |
@ -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; |
@ -1,4 +1,4 @@ |
|||
package a8k.extui.page.test.verification; |
|||
package a8k.extui.page.factory.verification; |
|||
|
|||
|
|||
|
@ -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; |
@ -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; |
Write
Preview
Loading…
Cancel
Save
Reference in new issue