Browse Source

Adds virtual state debug settings

Introduces a new UI page for configuring virtual device states, specifically focusing on the emergency tube state.

This addition enables developers and testers to easily simulate various device scenarios and error conditions for more comprehensive testing and debugging.

Also, refactors device virtual state services to virtualstate package.
master
zhaohe 3 weeks ago
parent
commit
9524f209db
  1. 15
      src/main/java/a8k/app/controler/api/v1/app/ws/AppEventWebsocketEndpoint.java
  2. 9
      src/main/java/a8k/app/controler/api/v1/app/ws/AppStateWebsocketEndpoint.java
  3. 9
      src/main/java/a8k/app/controler/api/v1/app/ws/AppWebSocketEndpointMgr.java
  4. 15
      src/main/java/a8k/app/service/statemgr/AppFlagStateMgr.java
  5. 3
      src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java
  6. 5
      src/main/java/a8k/app/service/statemgr/DeviceWorkStateMgrService.java
  7. 2
      src/main/java/a8k/app/service/statemgr/GStateMgrService.java
  8. 6
      src/main/java/a8k/app/service/statemgr/IncubationPlateStateMgr.java
  9. 5
      src/main/java/a8k/app/service/statemgr/OptScanModuleStateMgr.java
  10. 6
      src/main/java/a8k/app/service/statemgr/PreReactionStateMgr.java
  11. 2
      src/main/java/a8k/app/service/statemgr/TubeStateMgr.java
  12. 100
      src/main/java/a8k/app/service/virtualstate/DeviceVirtualStateMgrService.java
  13. 106
      src/main/java/a8k/app/service/virtualstate/TubeVirtualStateGenerator.java
  14. 31
      src/main/java/a8k/app/type/DeviceWarningFlagStateGroup.java
  15. 8
      src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java
  16. 35
      src/main/java/a8k/extui/page/extapp/debug_assistant/DeviceVirtualStateMgrSettingPage.java

15
src/main/java/a8k/app/controler/api/v1/app/ws/AppEventWebsocketEndpoint.java

@ -1,9 +1,14 @@
package a8k.app.controler.api.v1.app.ws;
import a8k.SpringBootBeanUtil;
import jakarta.annotation.PostConstruct;
import jakarta.websocket.*;
import jakarta.websocket.server.ServerEndpoint;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import java.io.IOException;
@ -11,9 +16,13 @@ import java.io.IOException;
@ServerEndpoint(value = "/api/v1/app/ws/event")
@Slf4j
@Component
public class AppEventWebsocketEndpoint {
public class AppEventWebsocketEndpoint {
private Session session;
private Session session;
// @Override public void onApplicationEvent(ContextRefreshedEvent event) {
// log.info("listening websocket event endpoint at ws://127.0.0.1:{}/api/v1/app/ws/event", env.getProperty("server.port"));
// }
// 收到消息
@OnMessage
@ -44,4 +53,6 @@ public class AppEventWebsocketEndpoint {
// 关闭连接状态码为 UNEXPECTED_CONDITION意料之外的异常
this.session.close(new CloseReason(CloseReason.CloseCodes.UNEXPECTED_CONDITION, throwable.getMessage()));
}
}

9
src/main/java/a8k/app/controler/api/v1/app/ws/AppStateWebsocketEndpoint.java

@ -1,9 +1,14 @@
package a8k.app.controler.api.v1.app.ws;
import a8k.SpringBootBeanUtil;
import jakarta.annotation.PostConstruct;
import jakarta.websocket.*;
import jakarta.websocket.server.ServerEndpoint;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import java.io.IOException;
@ -12,11 +17,9 @@ import java.io.IOException;
@Slf4j
@Component
public class AppStateWebsocketEndpoint {
//参考 https://springdoc.cn/spring-boot-websocket/
private Session session;
// 收到消息
@OnMessage
public void onMessage(String message) throws IOException {

9
src/main/java/a8k/app/controler/api/v1/app/ws/AppWebSocketEndpointMgr.java

@ -1,5 +1,6 @@
package a8k.app.controler.api.v1.app.ws;
import a8k.SpringBootBeanUtil;
import a8k.app.service.engineer.state.EngineerModeStateMgrService;
import a8k.app.type.AppGetStateFn;
import a8k.app.type.DeviceRunMode;
@ -17,6 +18,7 @@ import a8k.app.utils.ZJsonHelper;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.env.Environment;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@ -140,6 +142,7 @@ public class AppWebSocketEndpointMgr {
broadcastEvent(message);
}
private final Environment env;
@PostConstruct
void init() {
@ -148,6 +151,10 @@ public class AppWebSocketEndpointMgr {
forceUpdateCnt.incrementAndGet();
}
});
log.info("Listen ws://127.0.0.1:{}/api/v1/app/ws/state", env.getProperty("server.port"));
log.info("Listen ws://127.0.0.1:{}/api/v1/app/ws/event", env.getProperty("server.port"));
}
//
@ -217,8 +224,6 @@ public class AppWebSocketEndpointMgr {
}
Boolean isForceUpdateNow() {
if (forceUpdateCnt.get() != 0) {
forceUpdateCnt.getAndDecrement();

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

@ -3,22 +3,19 @@ package a8k.app.service.statemgr;
import a8k.app.factory.ZAppPromptFactory;
import a8k.app.i18n.Internationalization;
import a8k.app.service.DeviceVirtualStateMgrService;
import a8k.app.service.virtualstate.DeviceVirtualStateMgrService;
import a8k.app.type.AppFlagKey;
import a8k.app.type.AppFlagType;
import a8k.app.type.DeviceRunMode;
import a8k.app.type.DeviceWarningFlagStateGroup;
import a8k.app.type.error.AppError;
import a8k.app.type.ui.ZAppPromopt;
import a8k.app.utils.ZJsonHelper;
import cn.hutool.core.util.ObjectUtil;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.Objects;
@Component
@Slf4j
@RequiredArgsConstructor
@ -51,7 +48,6 @@ public class AppFlagStateMgr {
DeviceWarningFlagStateGroup deviceWarningFlagState = new DeviceWarningFlagStateGroup();
DeviceWarningFlagStateGroup lastCpyDeviceWarningFlagState = new DeviceWarningFlagStateGroup(); //上次复制的状态
DeviceWarningFlagStateGroup virtualWarningState = new DeviceWarningFlagStateGroup(); //虚拟状态,用于前端状态测试
@ -62,22 +58,15 @@ public class AppFlagStateMgr {
continue;
deviceWarningFlagState.states.add(new AppFlagState(flagKey, flagKey.flagType));
}
lastCpyDeviceWarningFlagState = ObjectUtil.clone(deviceWarningFlagState); //初始化时复制一份状态
virtualWarningState = deviceVirtualStateMgrService.getDeviceFlagStateVirtualStateInitVal(deviceWarningFlagState);
}
synchronized public DeviceWarningFlagStateGroup getFlagState() {
if (gstate.isInMode(DeviceRunMode.VirtualStateGenerateMode)) {
// log.info("virtualWarningState: {}", ZJsonHelper.objectToJson(virtualWarningState));
return virtualWarningState;
}
//
// 正常状态下返回值
//
if (!Objects.equals(lastCpyDeviceWarningFlagState.version, deviceWarningFlagState.version)) {
lastCpyDeviceWarningFlagState = ObjectUtil.clone(deviceWarningFlagState);
}
return lastCpyDeviceWarningFlagState;
return ObjectUtil.clone(deviceWarningFlagState);
}
synchronized public Integer getStateVersion() {

3
src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java

@ -3,8 +3,7 @@ package a8k.app.service.statemgr;
import a8k.app.dao.AppStatePersistenceDao;
import a8k.app.dao.type.combination.ProjBuildInInfo;
import a8k.app.dao.type.db.ProjExtInfoCard;
import a8k.app.factory.FakeA8kConsumableContainerFactory;
import a8k.app.service.DeviceVirtualStateMgrService;
import a8k.app.service.virtualstate.DeviceVirtualStateMgrService;
import a8k.app.service.data.ProjInfoMgrService;
import a8k.app.service.statemgr.consumables_mgr.LarBottleContainerStateMgr;
import a8k.app.service.statemgr.consumables_mgr.LittBottleContainerStateMgr;

5
src/main/java/a8k/app/service/statemgr/DeviceWorkStateMgrService.java

@ -1,18 +1,15 @@
package a8k.app.service.statemgr;
import a8k.app.service.DeviceVirtualStateMgrService;
import a8k.app.service.virtualstate.DeviceVirtualStateMgrService;
import a8k.app.type.DeviceRunMode;
import a8k.app.type.a8k.state.DeviceWorkState;
import a8k.app.type.a8k.state.enumtype.A8kWorkState;
import a8k.app.type.a8k.state.enumtype.A8kWorkTaskType;
import a8k.app.type.error.AppError;
import cn.hutool.core.util.ObjectUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@Slf4j
@RequiredArgsConstructor

2
src/main/java/a8k/app/service/statemgr/GStateMgrService.java

@ -1,7 +1,7 @@
package a8k.app.service.statemgr;
import a8k.app.i18n.Internationalization;
import a8k.app.service.DeviceVirtualStateMgrService;
import a8k.app.service.virtualstate.DeviceVirtualStateMgrService;
import a8k.app.type.BoardVersions;
import a8k.app.type.DeviceRunMode;
import a8k.app.type.GState;

6
src/main/java/a8k/app/service/statemgr/IncubationPlateStateMgr.java

@ -1,24 +1,20 @@
package a8k.app.service.statemgr;
import a8k.app.factory.ZAppPromptFactory;
import a8k.app.channel.iflytophald.type.protocol.A8kEcode;
import a8k.app.service.DeviceVirtualStateMgrService;
import a8k.app.service.virtualstate.DeviceVirtualStateMgrService;
import a8k.app.type.DeviceRunMode;
import a8k.app.type.a8k.BloodType;
import a8k.app.type.a8k.pos.ConsumableInfo;
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.a8k.pos.IncubatorPos;
import a8k.app.type.a8k.proj.ProjBriefInfo;
import a8k.app.type.error.AppError;
import a8k.app.dao.type.db.ProjExtInfoCard;
import a8k.app.dao.type.combination.ProjBuildInInfo;
import a8k.app.service.utils.ProjInfoUtils;
import a8k.app.utils.ZTimeUtils;
import cn.hutool.core.util.ObjectUtil;
import jakarta.annotation.Resource;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;

5
src/main/java/a8k/app/service/statemgr/OptScanModuleStateMgr.java

@ -1,16 +1,13 @@
package a8k.app.service.statemgr;
import a8k.app.service.DeviceVirtualStateMgrService;
import a8k.app.service.virtualstate.DeviceVirtualStateMgrService;
import a8k.app.service.utils.ProjInfoUtils;
import a8k.app.type.DeviceRunMode;
import a8k.app.type.a8k.BloodType;
import a8k.app.type.a8k.state.IncubationRecordInfo;
import a8k.app.type.a8k.state.OptScanModuleState;
import a8k.app.type.a8k.state.SampleInfo;
import a8k.app.type.a8k.state.enumtype.OptScanModuleStateEnum;
import a8k.app.type.a8k.proj.ProjBriefInfo;
import a8k.app.dao.type.db.ProjExtInfoCard;
import a8k.app.service.data.UtilsProjectColorAllocer;
import a8k.app.dao.type.combination.ProjBuildInInfo;
import cn.hutool.core.util.ObjectUtil;
import jakarta.annotation.Resource;

6
src/main/java/a8k/app/service/statemgr/PreReactionStateMgr.java

@ -1,22 +1,18 @@
package a8k.app.service.statemgr;
import a8k.app.constant.AppConstant;
import a8k.app.factory.FakeA8kConsumableContainerFactory;
import a8k.app.service.DeviceVirtualStateMgrService;
import a8k.app.service.virtualstate.DeviceVirtualStateMgrService;
import a8k.app.service.data.ProjInfoMgrService;
import a8k.app.service.utils.ProjInfoUtils;
import a8k.app.type.DeviceRunMode;
import a8k.app.type.PreReactionGrid;
import a8k.app.type.PreReactionGridGroup;
import a8k.app.type.PreReactionPosState;
import a8k.app.type.a8k.ConsumableGroup;
import a8k.app.type.a8k.LittleBottleConsumableType;
import a8k.app.type.a8k.container.LittBottleConsumablesInfo;
import a8k.app.type.a8k.pos.PreReactionPos;
import a8k.app.type.a8k.state.ProjectPreProcessContext;
import a8k.app.type.a8k.state.SampleInfo;
import a8k.app.type.a8k.state.Tube;
import a8k.app.type.exception.AppException;
import cn.hutool.core.util.ObjectUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

2
src/main/java/a8k/app/service/statemgr/TubeStateMgr.java

@ -2,7 +2,7 @@ package a8k.app.service.statemgr;
import a8k.app.dao.type.db.DeviceStatistic;
import a8k.app.factory.ZAppPromptFactory;
import a8k.app.service.DeviceVirtualStateMgrService;
import a8k.app.service.virtualstate.DeviceVirtualStateMgrService;
import a8k.app.service.analyzer.ConsumableStateAnalyzerService;
import a8k.app.type.DeviceRunMode;
import a8k.app.type.a8k.pos.ConsumableInfo;

100
src/main/java/a8k/app/service/DeviceVirtualStateMgrService.java → src/main/java/a8k/app/service/virtualstate/DeviceVirtualStateMgrService.java

@ -1,4 +1,4 @@
package a8k.app.service;
package a8k.app.service.virtualstate;
import a8k.app.channel.iflytophald.type.protocol.A8kEcode;
@ -20,7 +20,6 @@ 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 a8k.app.utils.ZList;
import cn.hutool.core.util.ObjectUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -33,6 +32,24 @@ import java.util.Date;
@Slf4j
public class DeviceVirtualStateMgrService {
private final TubeVirtualStateGenerator tubeVirtualStateGenerator;
public TubeHolder getVirtualTubeHolderState() {
return tubeVirtualStateGenerator.getVirtualTubeHolderState();
}
public EmergencyTubePos getVirtualEmergencyTube() {
return tubeVirtualStateGenerator.getVirtualEmergencyTube();
}
public Integer getVirtualTubeStateVersion() {
return tubeVirtualStateGenerator.getVirtualTubeStateVersion();
}
public void setEmptyTubeState(TubeState emptyTubeState) {
tubeVirtualStateGenerator.setEmptyTubeState(emptyTubeState);
}
synchronized public A8kConsumableContainer getVirtualConsumableContainerState() {
//虚拟状态生成模式
@ -102,85 +119,6 @@ public class DeviceVirtualStateMgrService {
}
static void addProjInfoToTube(Tube tube, Integer projId) {
ProjBriefInfo projBriefInfo = FakeA8kConsumableContainerFactory.buildFakeProjBriefInfo(projId);
tube.getProjInfo().add(projBriefInfo);
tube.getProjIds().add(projBriefInfo.projId);
}
static Tube createFakeTube(Integer pos) {
Tube tube = new Tube(pos);
tube.setSampleId("250109_001E0" + pos);
tube.setBloodType(BloodType.WHOLE_BLOOD);
tube.setSampleBarcode("112334455667");
tube.setUserid(String.format("250109_%dE", pos));
switch (pos) {
case 1 -> tube.setState(TubeState.EMPTY);
case 2 -> {
tube.setState(TubeState.ERROR);
tube.setError(FakeAppErrorFactory.buildAEConsumeNotEnoughError());
tube.setErrorInfo(ZAppPromptFactory.buildAppPrompt(tube.getError()));
addProjInfoToTube(tube, 1);
addProjInfoToTube(tube, 2);
}
case 3, 4, 5, 6 -> {
tube.setState(TubeState.PROCESS_COMPLETE);
addProjInfoToTube(tube, 1);
addProjInfoToTube(tube, 2);
addProjInfoToTube(tube, 3);
}
case 7 -> {
tube.setState(TubeState.PROCESSING);
addProjInfoToTube(tube, 1);
addProjInfoToTube(tube, 2);
addProjInfoToTube(tube, 3);
}
case 8, 9, 10 -> {
tube.setState(TubeState.TO_BE_PROCESSED);
addProjInfoToTube(tube, 1);
addProjInfoToTube(tube, 2);
}
}
tube.setIsHighTube(pos % 2 == 0); //假设偶数位置为高位管
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);
return tubePosState;
}
public Integer getVirtualTubeStateVersion() {
//虚拟状态生成模式
return Integer.MAX_VALUE;
}
public PreReactionGridGroup getFakePreReactionGridGroup(ConsumableGroup group) {
PreReactionGridGroup gridGroup = new PreReactionGridGroup(group);
gridGroup.group = group;

106
src/main/java/a8k/app/service/virtualstate/TubeVirtualStateGenerator.java

@ -0,0 +1,106 @@
package a8k.app.service.virtualstate;
import a8k.app.factory.FakeA8kConsumableContainerFactory;
import a8k.app.factory.FakeAppErrorFactory;
import a8k.app.factory.ZAppPromptFactory;
import a8k.app.type.a8k.BloodType;
import a8k.app.type.a8k.proj.ProjBriefInfo;
import a8k.app.type.a8k.state.EmergencyTubePos;
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.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class TubeVirtualStateGenerator {
TubeState emptyTubeState = TubeState.EMPTY;
Integer stateVersion = Integer.MAX_VALUE / 2;
void addProjInfoToTube(Tube tube, Integer projId) {
ProjBriefInfo projBriefInfo = FakeA8kConsumableContainerFactory.buildFakeProjBriefInfo(projId);
tube.getProjInfo().add(projBriefInfo);
tube.getProjIds().add(projBriefInfo.projId);
}
Tube createFakeTube(Integer pos) {
Tube tube = new Tube(pos);
tube.setSampleId("250109_001E0" + pos);
tube.setBloodType(BloodType.WHOLE_BLOOD);
tube.setSampleBarcode("112334455667");
tube.setUserid(String.format("250109_%dE", pos));
switch (pos) {
case 1 -> tube.setState(TubeState.EMPTY);
case 2 -> {
tube.setState(TubeState.ERROR);
tube.setError(FakeAppErrorFactory.buildAEConsumeNotEnoughError());
tube.setErrorInfo(ZAppPromptFactory.buildAppPrompt(tube.getError()));
addProjInfoToTube(tube, 1);
addProjInfoToTube(tube, 2);
}
case 3, 4, 5, 6 -> {
tube.setState(TubeState.PROCESS_COMPLETE);
addProjInfoToTube(tube, 1);
addProjInfoToTube(tube, 2);
addProjInfoToTube(tube, 3);
}
case 7 -> {
tube.setState(TubeState.PROCESSING);
addProjInfoToTube(tube, 1);
addProjInfoToTube(tube, 2);
addProjInfoToTube(tube, 3);
}
case 8, 9, 10 -> {
tube.setState(TubeState.TO_BE_PROCESSED);
addProjInfoToTube(tube, 1);
addProjInfoToTube(tube, 2);
}
}
tube.setIsHighTube(pos % 2 == 0); //假设偶数位置为高位管
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;
}
public void setEmptyTubeState(TubeState emptyTubeState) {
this.emptyTubeState = emptyTubeState;
stateVersion++;
}
}

31
src/main/java/a8k/app/type/DeviceWarningFlagStateGroup.java

@ -6,6 +6,13 @@ import java.util.ArrayList;
import java.util.List;
public class DeviceWarningFlagStateGroup implements java.io.Serializable {
public enum NotificationState {
Normal, //通知
Warn, //警告
Error, //错误
}
public List<AppFlagStateMgr.AppFlagState> states = new ArrayList<>();
public Integer version = 0; //状态版本号
@ -19,6 +26,7 @@ public class DeviceWarningFlagStateGroup implements java.io.Serializable {
return false; //如果没有任意一个状态为true,则返回false
}
// 别删,被前端使用
public Boolean isHasErrorTriggerFlag() {
for (AppFlagStateMgr.AppFlagState state : states) {
if (state.flagType.equals(AppFlagType.ErrorFlag) && state.state) {
@ -28,13 +36,34 @@ public class DeviceWarningFlagStateGroup implements java.io.Serializable {
return false; //如果没有任意一个状态为true,则返回false
}
// 别删,被前端使用
public Integer getWarningAndErrorFlagTriggerNum() {
int count = 0;
for (AppFlagStateMgr.AppFlagState state : states) {
if ((state.flagType.equals(AppFlagType.WarningFlag) || state.flagType.equals(AppFlagType.ErrorFlag)) && state.state) {
count++; //如果有任意一个状态为true,则计数
}
}
return count; //返回计数
}
// 别删,被前端使用
public NotificationState getNotificationState() {
if (isHasErrorTriggerFlag()) {
return NotificationState.Error; //如果有错误标识位,则返回错误状态
} else if (isHasWarningTriggerFlag()) {
return NotificationState.Warn; //如果有警告标识位,则返回警告状态
} else {
return NotificationState.Normal; //否则返回正常状态
}
}
public AppFlagStateMgr.AppFlagState find(AppFlagKey appFlagKey) {
for (AppFlagStateMgr.AppFlagState state : states) {
if (state.keyName.equals(appFlagKey)) {
return state;
}
}
// AppFlagStateMgr.log.error("find: Unknown DeviceWarningFlagState: {}", appFlagKey.name());
return null; //如果没有找到,返回null
}
}

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

@ -9,8 +9,7 @@ import a8k.extui.page.driver.*;
import a8k.extui.page.driver.pipette_module.*;
import a8k.extui.page.extapp.*;
import a8k.extui.page.extapp.P02A8kTemperaturaVerfication;
import a8k.extui.page.extapp.debug_assistant.IDCardDataGeneratorPage;
import a8k.extui.page.extapp.debug_assistant.VirtualReportModeOperationPage;
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.*;
@ -21,9 +20,7 @@ import a8k.extui.page.measurement.*;
import a8k.extui.page.optalgotest.OptAlgoTestPage;
import a8k.extui.page.test.codetest.OptFormulaTestPage;
import a8k.extui.page.test.codetest.OptFormulaTestPageV2;
import a8k.extui.page.extapp.debug_assistant.FakeReactionRecordGeneratorPage;
import a8k.extui.page.extapp.debug_assistant.VirtualEventGeneratorPage;
import a8k.extui.page.extsetting.pos_calibration.*;
import a8k.extui.page.test.stress_test.PipetteGunStressTest;
import a8k.extui.page.test.verification.*;
@ -215,7 +212,8 @@ public class ExtApiPageGroupCfgMgr {
new Menu(FakeReactionRecordGeneratorPage.class, "虚拟反应记录生成"),
new Menu(VirtualEventGeneratorPage.class, "虚拟事件生成"),
new Menu(IDCardDataGeneratorPage.class, "ID卡数据生成器"),
new Menu(VirtualReportModeOperationPage.class, "虚拟报告模式操作")
new Menu(VirtualReportModeOperationPage.class, "虚拟报告模式操作"),
new Menu(DeviceVirtualStateMgrSettingPage.class,"虚拟状态上报配置")
)),
new Menu(UsrOperationSimulationPage.class, "用户行为模拟器"),
new Menu(CodeGeneratorPage.class, "条码字符生成工具")

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

@ -0,0 +1,35 @@
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);
}
}
Loading…
Cancel
Save