Browse Source

update

tags/v0
zhaohe 7 months ago
parent
commit
fce2fdb067
  1. 25
      src/main/java/a8k/app/a8ktype/appevent/A8kEcodeContextListPromptEvent.java
  2. 30
      src/main/java/a8k/app/a8ktype/appevent/A8kErrorsPromptEvent.java
  3. 4
      src/main/java/a8k/app/a8ktype/appevent/AppEvent.java
  4. 16
      src/main/java/a8k/app/a8ktype/appevent/AppPromptEvent.java
  5. 16
      src/main/java/a8k/app/a8ktype/appevent/AppPromptEvents.java
  6. 12
      src/main/java/a8k/app/a8ktype/appevent/MessageBoxUpdateEvent.java
  7. 3
      src/main/java/a8k/app/a8ktype/state/DeviceWorkState.java
  8. 16
      src/main/java/a8k/app/a8ktype/ui/MessageBox.java
  9. 4
      src/main/java/a8k/app/a8ktype/ui/MessageLevel.java
  10. 36
      src/main/java/a8k/app/a8ktype/ui/ZAppPromopt.java
  11. 7
      src/main/java/a8k/app/a8ktype/ui/ZAppPromoptDetailInfoType.java
  12. 34
      src/main/java/a8k/app/a8ktype/ui/ZAppPromoptTable.java
  13. 22
      src/main/java/a8k/app/controler/api/v1/app/basic/AppEventBusControler.java
  14. 18
      src/main/java/a8k/app/controler/api/v1/app/ws/AppWebSocketEndpointMgr.java
  15. 77
      src/main/java/a8k/app/factory/ZAppPromoptFactory.java
  16. 108
      src/main/java/a8k/app/service/bases/FrontEndEventRouter.java
  17. 159
      src/main/java/a8k/app/service/bases/FrontEndMessageBoxAndEventMgr.java
  18. 4
      src/main/java/a8k/app/service/lowerctrl/DeviceInitCtrlService.java
  19. 3
      src/main/java/a8k/app/service/lowerctrl/ProjIDCardCtrlAndMonitorService.java
  20. 25
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java
  21. 1
      src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/P30ScanTubeHolderTask.java
  22. 8
      src/main/java/a8k/app/service/statemgr/DeviceWorkStateMgrService.java
  23. 1
      src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java
  24. 53
      src/main/java/a8k/extui/page/debug/P00AppEventAndMessageBoxDebugPage.java
  25. 69
      src/main/java/a8k/extui/page/frond_end_test/VirtualEventGeneratorPage.java

25
src/main/java/a8k/app/a8ktype/appevent/A8kEcodeContextListPromptEvent.java

@ -1,25 +0,0 @@
package a8k.app.a8ktype.appevent;
import a8k.app.service.mainctrl.mainflowctrl.base.AppActionErrorContext;
import a8k.app.utils.ZList;
import java.util.List;
public class A8kEcodeContextListPromptEvent extends AppEvent {
public List<AppActionErrorContext> ecodeList;
public A8kEcodeContextListPromptEvent(List<AppActionErrorContext> ecodeList) {
super(A8kEcodeContextListPromptEvent.class.getSimpleName());
this.ecodeList = ecodeList;
}
public A8kEcodeContextListPromptEvent(AppActionErrorContext... ecodeList) {
super(A8kEcodeContextListPromptEvent.class.getSimpleName());
this.ecodeList = ZList.of(ecodeList);
}
public String toString() {
return String.format("ecodeList:%s", ecodeList);
}
}

30
src/main/java/a8k/app/a8ktype/appevent/A8kErrorsPromptEvent.java

@ -1,30 +0,0 @@
package a8k.app.a8ktype.appevent;
import a8k.app.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.app.a8ktype.error.AppError;
import a8k.app.utils.ZList;
import java.util.List;
public class A8kErrorsPromptEvent extends AppEvent {
public List<AppError> errors;
public A8kErrorsPromptEvent(A8kEcode errorCode) {
super(A8kErrorsPromptEvent.class.getSimpleName());
errors = ZList.of(new AppError(errorCode));
}
public A8kErrorsPromptEvent(AppError erro) {
super(A8kErrorsPromptEvent.class.getSimpleName());
errors = ZList.of(erro);
}
public A8kErrorsPromptEvent(List<AppError> errors) {
super(A8kErrorsPromptEvent.class.getSimpleName());
this.errors = errors;
}
public String toString() {
return String.format("%s", errors);
}
}

4
src/main/java/a8k/app/a8ktype/appevent/AppEvent.java

@ -1,12 +1,12 @@
package a8k.app.a8ktype.appevent;
import java.util.Date;
import java.util.UUID;
public class AppEvent {
public String typeName;
public Integer timestamp = (int) (new Date().getTime() / 1000);
// public String id = UUID.randomUUID().toString();
public String eventId = UUID.randomUUID().toString();
public AppEvent(String typeName) {
this.typeName = typeName;
}

16
src/main/java/a8k/app/a8ktype/appevent/AppPromptEvent.java

@ -0,0 +1,16 @@
package a8k.app.a8ktype.appevent;
import a8k.app.a8ktype.ui.ZAppPromopt;
import java.util.List;
public class AppPromptEvent extends AppEvent {
public ZAppPromopt prompt;
public AppPromptEvent(ZAppPromopt prompt) {
super(AppPromptEvent.class.getSimpleName());
this.prompt = prompt;
}
}

16
src/main/java/a8k/app/a8ktype/appevent/AppPromptEvents.java

@ -1,16 +0,0 @@
package a8k.app.a8ktype.appevent;
import a8k.app.a8ktype.ui.ZAppPromopt;
import java.util.List;
public class AppPromptEvents extends AppEvent {
public List<ZAppPromopt> prompt;
public AppPromptEvents(List<ZAppPromopt> prompt) {
super(AppPromptEvents.class.getSimpleName());
this.prompt = prompt;
}
}

12
src/main/java/a8k/app/a8ktype/appevent/MessageBoxUpdateEvent.java

@ -1,12 +0,0 @@
package a8k.app.a8ktype.appevent;
public class MessageBoxUpdateEvent extends AppEvent {
public String message;
public Integer overtimes = 0;
public MessageBoxUpdateEvent(String message) {
super(MessageBoxUpdateEvent.class.getSimpleName());
this.message = message;
}
}

3
src/main/java/a8k/app/a8ktype/state/DeviceWorkState.java

@ -21,13 +21,10 @@ public class DeviceWorkState implements Serializable {
public A8kWorkState lastWorkState = A8kWorkState.IDLE; //上一个工作状态
public Boolean manualInterventionFlag = false; //人工干预标志
public Boolean stopActionPending = false; //停止动作等待
public Boolean pauseActionPending = false; //暂停动作等待
public Boolean resumeActionPending = false; //恢复动作等待
public Boolean startActionPending = false; //开始动作等待
public Boolean humanInterventionReq = false; //人工干预请求标志位
@Schema(description = "当前状态是否切换完成")
public Boolean isPending() {

16
src/main/java/a8k/app/a8ktype/ui/MessageBox.java

@ -0,0 +1,16 @@
package a8k.app.a8ktype.ui;
import java.util.Date;
public class MessageBox {
public Date time;
public MessageLevel messageLevel;
public String message;
public MessageBox(MessageLevel messageLevel, String message) {
this.time = new Date();
this.messageLevel = messageLevel;
this.message = message;
}
}

4
src/main/java/a8k/app/a8ktype/ui/ZAppPromoptType.java → src/main/java/a8k/app/a8ktype/ui/MessageLevel.java

@ -1,7 +1,7 @@
package a8k.app.a8ktype.ui;
public enum ZAppPromoptType {
Notify, //通知
public enum MessageLevel {
Info, //通知
Warn, //警告
Error, //错误
Fatal, //致命错误

36
src/main/java/a8k/app/a8ktype/ui/ZAppPromopt.java

@ -6,14 +6,10 @@ import java.io.Serializable;
import java.util.List;
public class ZAppPromopt implements Serializable {
public enum ZAppPromoptDetailInfoType {
Text,//文本
Forms, //表单
Table, //表格
}
@Schema(description = "弹窗类型")
public ZAppPromoptType type;
@Schema(description = "消息等级")
public MessageLevel messageLevel;
@Schema(description = "主信息")
public String info;
@ -27,24 +23,24 @@ public class ZAppPromopt implements Serializable {
public ZAppErrorStackInfo stackInfo;
public ZAppPromopt(ZAppPromoptType type, String info, ZAppErrorStackInfo stackInfo, List<ZAppPromoptFormsItem> detailInfos) {
this.type = type;
public ZAppPromopt(MessageLevel type, String info, ZAppErrorStackInfo stackInfo, List<ZAppPromoptFormsItem> detailInfos) {
this.messageLevel = type;
this.info = info;
this.stackInfo = stackInfo;
this.detailInfo = detailInfos;
this.detailInfoType = ZAppPromoptDetailInfoType.Forms;
}
public ZAppPromopt(ZAppPromoptType type, String info, ZAppErrorStackInfo stackInfo, String detailInfos) {
this.type = type;
public ZAppPromopt(MessageLevel type, String info, ZAppErrorStackInfo stackInfo, String detailInfos) {
this.messageLevel = type;
this.info = info;
this.stackInfo = stackInfo;
this.detailInfo = detailInfos;
this.detailInfoType = ZAppPromoptDetailInfoType.Text;
}
public ZAppPromopt(ZAppPromoptType type, String info, ZAppErrorStackInfo stackInfo, ZAppPromoptTable detailInfos) {
this.type = type;
public ZAppPromopt(MessageLevel type, String info, ZAppErrorStackInfo stackInfo, ZAppPromoptTable detailInfos) {
this.messageLevel = type;
this.info = info;
this.stackInfo = stackInfo;
this.detailInfo = detailInfos;
@ -52,15 +48,15 @@ public class ZAppPromopt implements Serializable {
}
public ZAppPromopt(ZAppPromoptType type, String info, ZAppErrorStackInfo stackInfo) {
this.type = type;
this.info = info;
this.stackInfo = stackInfo;
public ZAppPromopt(MessageLevel type, String info, ZAppErrorStackInfo stackInfo) {
this.messageLevel = type;
this.info = info;
this.stackInfo = stackInfo;
}
public ZAppPromopt(ZAppPromoptType type, String info) {
this.type = type;
this.info = info;
public ZAppPromopt(MessageLevel type, String info) {
this.messageLevel = type;
this.info = info;
}

7
src/main/java/a8k/app/a8ktype/ui/ZAppPromoptDetailInfoType.java

@ -0,0 +1,7 @@
package a8k.app.a8ktype.ui;
public enum ZAppPromoptDetailInfoType {
Text,//文本
Forms, //表单
Table, //表格
}

34
src/main/java/a8k/app/a8ktype/ui/ZAppPromoptTable.java

@ -1,27 +1,39 @@
package a8k.app.a8ktype.ui;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ZAppPromoptTable {
public enum ColorType {
Normal,
Warning,
Error
}
public static class Val {
public ColorType colorType;//Normal,Warning, Error
public String val;
public MessageLevel messageLevel;//Normal,Warning,Error
public String val;
public Val(ColorType colorType, String val) {
this.val = val;
this.colorType = colorType;
public Val(MessageLevel messageLevel, String val) {
this.val = val;
this.messageLevel = messageLevel;
}
public Val(String val) {
this.messageLevel = MessageLevel.Info;
this.val = val;
}
}
public List<String> header = new ArrayList<>();
public List<String> types = new ArrayList<>();
public List<Val[]> vars = new ArrayList<>();
public void addHeader(String... header) {
this.header.addAll(Arrays.asList(header));
}
public void addType(String... type) {
this.types.addAll(Arrays.asList(type));
}
public void addVar(Val... var) {
this.vars.add(var);
}
}

22
src/main/java/a8k/app/controler/api/v1/app/basic/AppEventBusControler.java

@ -1,6 +1,6 @@
package a8k.app.controler.api.v1.app.basic;
import a8k.app.service.bases.FrontEndEventRouter;
import a8k.app.service.bases.FrontEndMessageBoxAndEventMgr;
import a8k.app.a8ktype.appevent.AppEvent;
import a8k.app.a8ktype.ui.ApiRet;
import io.swagger.v3.oas.annotations.Operation;
@ -21,18 +21,18 @@ import java.util.List;
@ResponseBody
public class AppEventBusControler {
@Resource
FrontEndEventRouter frontEndEventRouter;
FrontEndMessageBoxAndEventMgr frontEndMessageBoxAndEventMgr;
@Operation(summary = "获取一个事件")
@PostMapping("/pollAppEvent")
public ApiRet<AppEvent> pollAppEvent() {
return ApiRet.success(frontEndEventRouter.pollAppEvent());
@Operation(summary = "获取历史事件")
@PostMapping("/pollHistoryAppEvents")
public ApiRet<List<AppEvent>> pollHistoryAppEvents() {
return ApiRet.success(frontEndMessageBoxAndEventMgr.getAppHistoryEventList());
}
@Operation(summary = "获取全部事件")
@PostMapping("/pollAllAppEvents")
public ApiRet<List<AppEvent>> pollAllAppEvents() {
return ApiRet.success(frontEndEventRouter.pollAllAppEvents());
@Operation(summary = "Prompt确认")
@PostMapping("/confirmPromoptInfo")
public ApiRet<Void> confirmPromoptInfo(String eventId) {
frontEndMessageBoxAndEventMgr.confirmPromoptInfo(eventId);
return ApiRet.success();
}
}

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

@ -1,7 +1,7 @@
package a8k.app.controler.api.v1.app.ws;
import a8k.app.service.statemgr.*;
import a8k.app.service.bases.FrontEndEventRouter;
import a8k.app.service.bases.FrontEndMessageBoxAndEventMgr;
import a8k.app.utils.ZJsonHelper;
import jakarta.annotation.PostConstruct;
import org.slf4j.Logger;
@ -36,9 +36,9 @@ public class AppWebSocketEndpointMgr {
@Resource
FrontEndEventRouter frontEndEventRouter;
FrontEndMessageBoxAndEventMgr frontEndMessageBoxAndEventMgr;
@Resource
GStateMgrService gstate;
GStateMgrService gstate;
@Resource
DeviceWorkStateMgrService deviceWorkStateMgrService;
@Resource
@ -113,7 +113,7 @@ public class AppWebSocketEndpointMgr {
@Scheduled(fixedDelay = 100)
public void reportEvent() {
frontEndEventRouter.pollAllAppEvents().forEach(event -> {
frontEndMessageBoxAndEventMgr.pollAllAppEvents().forEach(event -> {
reportEvent("AppEvent", event);
});
}
@ -130,13 +130,21 @@ public class AppWebSocketEndpointMgr {
reportState("ConsumablesStateService", consumablesMgrService.getState());
}
private Integer reportConsumableStateStateVersion = 0;
private Integer reportConsumableStateStateVersion = 0;
private Integer reportFrontEndMessageBoxStateVersion = 0;
// private
@Scheduled(fixedDelay = 30)
public void reportConsumableStateState() {
if (!Objects.equals(reportConsumableStateStateVersion, consumablesMgrService.getStateVersion())) {
reportConsumableStateStateVersion = consumablesMgrService.getStateVersion();
reportState("ConsumablesStateService", consumablesMgrService.getState());
}
if (!reportFrontEndMessageBoxStateVersion.equals(frontEndMessageBoxAndEventMgr.getMessageBoxState().stateVersion)) {
reportFrontEndMessageBoxStateVersion = frontEndMessageBoxAndEventMgr.getMessageBoxState().stateVersion;
reportState("MessageBoxState", frontEndMessageBoxAndEventMgr.getMessageBoxState());
}
}
}

77
src/main/java/a8k/app/factory/ZAppPromoptFactory.java

@ -3,10 +3,8 @@ package a8k.app.factory;
import a8k.app.a8ktype.others.ConsumableStatInfo;
import a8k.app.a8ktype.ui.*;
import a8k.app.i18n.Internationalization;
import a8k.app.service.mainctrl.mainflowctrl.base.AppActionErrorContext;
import a8k.app.a8ktype.appevent.A8kEcodeContextListPromptEvent;
import a8k.app.a8ktype.appevent.A8kErrorsPromptEvent;
import a8k.app.a8ktype.appevent.AppPromptEvents;
//import a8k.app.a8ktype.appevent.A8kEcodeContextListPromptEvent;
import a8k.app.a8ktype.appevent.AppPromptEvent;
import a8k.app.a8ktype.error.*;
import a8k.app.a8ktype.exception.AppException;
import jakarta.validation.ValidationException;
@ -28,10 +26,13 @@ public class ZAppPromoptFactory {
return stackInfo;
}
public static AppPromptEvent buildAppPromoptEvent(AppError error) {
return new AppPromptEvent(buildAppPromopt(error));
}
public static ZAppPromopt buildAppPromopt(AppError error) {
if (error instanceof AECodeError ecodeError) {
return new ZAppPromopt(ZAppPromoptType.Error, ecodeError.exmsg, buildErrorStackInfo(ecodeError.stackTraceElements));
return new ZAppPromopt(MessageLevel.Error, ecodeError.exmsg, buildErrorStackInfo(ecodeError.stackTraceElements));
} else if (error instanceof AEHardwareError appError) {
String exmsg = appError.exmsg;
if (exmsg == null || exmsg.isEmpty()) {
@ -43,7 +44,7 @@ public class ZAppPromoptFactory {
if (appError.cmdId != null)
detailInfos.add(new ZAppPromoptFormsItem("相关指令", appError.cmdId.chName));
return new ZAppPromopt(ZAppPromoptType.Fatal, exmsg, null, detailInfos);
return new ZAppPromopt(MessageLevel.Fatal, exmsg, null, detailInfos);
} else if (error instanceof AEConsumeNotEnoughError appError) {
@ -58,17 +59,17 @@ public class ZAppPromoptFactory {
for (ConsumableStatInfo consumableStatInfo : appError.consumableStatInfos) {
ZAppPromoptTable.Val[] vals = new ZAppPromoptTable.Val[3];
vals[0] = new ZAppPromoptTable.Val(ZAppPromoptTable.ColorType.Normal, consumableStatInfo.projShortName);
vals[1] = new ZAppPromoptTable.Val(ZAppPromoptTable.ColorType.Normal, consumableStatInfo.totalCnt.toString());
vals[0] = new ZAppPromoptTable.Val(MessageLevel.Info, consumableStatInfo.projShortName);
vals[1] = new ZAppPromoptTable.Val(MessageLevel.Info, consumableStatInfo.totalCnt.toString());
if (consumableStatInfo.totalCnt < consumableStatInfo.requireCnt) {
vals[2] = new ZAppPromoptTable.Val(ZAppPromoptTable.ColorType.Error, consumableStatInfo.requireCnt.toString());
vals[2] = new ZAppPromoptTable.Val(MessageLevel.Error, consumableStatInfo.requireCnt.toString());
} else {
vals[2] = new ZAppPromoptTable.Val(ZAppPromoptTable.ColorType.Normal, consumableStatInfo.requireCnt.toString());
vals[2] = new ZAppPromoptTable.Val(MessageLevel.Info, consumableStatInfo.requireCnt.toString());
}
}
return new ZAppPromopt(ZAppPromoptType.Error, "耗材不足", null, table);
return new ZAppPromopt(MessageLevel.Error, "耗材不足", null, table);
} else if (error instanceof AETubeError appError) {
return new ZAppPromopt(ZAppPromoptType.Error, String.format("试管%s %s", appError.tubeOff + 1, Internationalization.A8kEcode2String(appError.code)));
return new ZAppPromopt(MessageLevel.Error, String.format("试管%s %s", appError.tubeOff + 1, Internationalization.A8kEcode2String(appError.code)));
} else {
String exmsg = error.exmsg;
if (exmsg == null || exmsg.isEmpty()) {
@ -77,7 +78,7 @@ public class ZAppPromoptFactory {
List<ZAppPromoptFormsItem> detailInfos = new ArrayList<>();
if (error.exmsg != null)
detailInfos.add(new ZAppPromoptFormsItem("额外信息", error.exmsg));
return new ZAppPromopt(ZAppPromoptType.Error, exmsg, null, detailInfos);
return new ZAppPromopt(MessageLevel.Error, exmsg, null, detailInfos);
}
}
@ -87,41 +88,37 @@ public class ZAppPromoptFactory {
if (e instanceof AppException hexcep) {
return buildAppPromopt(hexcep.error);
} else if (e instanceof ValidationException ex) {
return new ZAppPromopt(ZAppPromoptType.Error, ex.getMessage(), buildErrorStackInfo(ex.getStackTrace()));
return new ZAppPromopt(MessageLevel.Error, ex.getMessage(), buildErrorStackInfo(ex.getStackTrace()));
} else if (e instanceof HandlerMethodValidationException validationE) {
return new ZAppPromopt(ZAppPromoptType.Error, validationE.getMessage(), buildErrorStackInfo(validationE.getStackTrace()));
return new ZAppPromopt(MessageLevel.Error, validationE.getMessage(), buildErrorStackInfo(validationE.getStackTrace()));
} else {
return new ZAppPromopt(ZAppPromoptType.Error, e.getMessage(), buildErrorStackInfo(e.getStackTrace()));
return new ZAppPromopt(MessageLevel.Error, e.getMessage(), buildErrorStackInfo(e.getStackTrace()));
}
}
public static ZAppPromopt buildNotifyPromopt(String info) {
// ZAppPromopt promopt = new ZAppPromopt();
// promopt.type = ZAppPromoptType.Notify;
// promopt.info = info;
// return promopt;
return new ZAppPromopt(ZAppPromoptType.Notify, info);
}
public static AppPromptEvents buildAppPromoptEvent(Exception e) {
return new AppPromptEvents(List.of(buildAppPromopt(e)));
}
public static AppPromptEvents buildAppPromptEvents(A8kEcodeContextListPromptEvent e) {
List<ZAppPromopt> prompts = new java.util.ArrayList<>();
for (AppActionErrorContext ecode : e.ecodeList) {
prompts.add(ZAppPromoptFactory.buildAppPromopt(ecode.ecode));
}
return new AppPromptEvents(prompts);
return new ZAppPromopt(MessageLevel.Info, info);
}
public static AppPromptEvents buildAppPromptEvents(A8kErrorsPromptEvent e) {
List<ZAppPromopt> prompts = new java.util.ArrayList<>();
for (AppError error : e.errors) {
prompts.add(ZAppPromoptFactory.buildAppPromopt(error));
}
return new AppPromptEvents(prompts);
public static AppPromptEvent buildAppPromoptEvent(Exception e) {
return new AppPromptEvent(buildAppPromopt(e));
}
//
// public static List<AppPromptEvent> buildAppPromptEvents(A8kEcodeContextListPromptEvent e) {
// List<AppPromptEvent> ret = new ArrayList<>();
// for (AppActionErrorContext ecode : e.ecodeList) {
// ret.add(new AppPromptEvent(ZAppPromoptFactory.buildAppPromopt(ecode.ecode)));
// }
// return ret;
// }
//
// public static List<AppPromptEvent> buildAppPromptEvents(A8kErrorsPromptEvent e) {
// List<AppPromptEvent> prompts = new java.util.ArrayList<>();
// for (AppError error : e.errors) {
// prompts.add(new AppPromptEvent(ZAppPromoptFactory.buildAppPromopt(error)));
// }
// return prompts;
//
// }
}

108
src/main/java/a8k/app/service/bases/FrontEndEventRouter.java

@ -1,108 +0,0 @@
package a8k.app.service.bases;
import a8k.app.factory.ZAppPromoptFactory;
import a8k.app.a8ktype.appevent.*;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Queue;
@Component
@Slf4j
public class FrontEndEventRouter {
static class ORDER {
static final int pollAppEvent = 1;
}
@Resource
AppEventBusService eventBus;
private final Queue<AppEvent> appEventQueue = new java.util.concurrent.ConcurrentLinkedQueue<>();
@PostConstruct
public void init() {
eventBus.regListener(this::onAppEvent);
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Internal APIs
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AppEvent preProcessAppEvent(AppEvent event) {
/*
* 下面事件直接转发给前端,前端需要处理
*/
if (event instanceof AppIDCardMountEvent) {
return event; //前端需要更新IDcard的状态并弹窗有新的IDcard插入询问用户是否保存
} else if (event instanceof AppIDCardUnmountEvent) {
return event; //前端需要更新IDcard的状态
} else if (event instanceof AppTubeholderSettingUpdateEvent) {
return event;//前端需要更新试管架设置
} else if (event instanceof DoA8kStepActionEvent) {
return new MessageBoxUpdateEvent(((DoA8kStepActionEvent) event).actionStepName);
}
/*
* 下面事件均转换成 AppPromptEvents
*/
else if (event instanceof A8kEcodeContextListPromptEvent e) {
return ZAppPromoptFactory.buildAppPromptEvents(e);
} else if (event instanceof A8kErrorsPromptEvent e) {
return ZAppPromoptFactory.buildAppPromptEvents(e);
} else if (event instanceof AppWarningNotifyEvent e) {
return new AppPromptEvents(List.of(ZAppPromoptFactory.buildAppPromopt(e.error)));
} else if (event instanceof AppPromptEvents) {
return event; //前端需要显示提示信息
} else if (event instanceof AppExceptionEvent e) {
return ZAppPromoptFactory.buildAppPromoptEvent(e.exception);
}
/*
* 下面事件不需要前端处理
*/
else if (event instanceof A8kCanBusOnConnectEvent) {
return null; //过滤前端不需要处理
} else if (event instanceof A8kHardwareReport) {
return null;//过滤前端不需要处理
} else {
return null;
}
}
synchronized AppEvent pollAppEventFromQueue() {
return appEventQueue.poll();
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 事件处理
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public void onAppEvent(AppEvent event) {
AppEvent afProcessEvent = preProcessAppEvent(event);
if (afProcessEvent == null) {
return;
}
appEventQueue.add(afProcessEvent);
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Exposed APIs
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public AppEvent pollAppEvent() {
return (pollAppEventFromQueue());
}
public List<AppEvent> pollAllAppEvents() {
List<AppEvent> ret = new java.util.ArrayList<>();
while (!appEventQueue.isEmpty()) {
ret.add(pollAppEventFromQueue());
}
return ret;
}
}

159
src/main/java/a8k/app/service/bases/FrontEndMessageBoxAndEventMgr.java

@ -0,0 +1,159 @@
package a8k.app.service.bases;
import a8k.app.a8ktype.ui.MessageBox;
import a8k.app.a8ktype.ui.MessageLevel;
import a8k.app.factory.ZAppPromoptFactory;
import a8k.app.a8ktype.appevent.*;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
@Component
@Slf4j
public class FrontEndMessageBoxAndEventMgr {
public static class FrontEndMessageBoxState {
public MessageBox topMessage; //顶部消息
public final LinkedList<MessageBox> messageBoxList = new LinkedList<>(); //消息列表
public Integer stateVersion = 0;
}
@Resource
AppEventBusService eventBus;
private final Queue<AppEvent> reportAppEventQueue = new java.util.concurrent.ConcurrentLinkedQueue<>(); //事件上报队列
private final LinkedList<AppEvent> appHistoryEventList = new LinkedList<>();//历史事件
private final FrontEndMessageBoxState frontEndMessageBoxState = new FrontEndMessageBoxState();
@PostConstruct
public void init() {
eventBus.regListener(this::onAppEvent);
pushMessageBox(new MessageBox(MessageLevel.Info, "系统启动"));
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Internal APIs
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
AppEvent preProcessAppEvent(AppEvent event) {
/*
* 下面事件直接转发给前端,前端需要处理
*/
if (event instanceof AppIDCardMountEvent) {
return event; //前端需要更新IDcard的状态并弹窗有新的IDcard插入询问用户是否保存
} else if (event instanceof AppIDCardUnmountEvent) {
return event; //前端需要更新IDcard的状态
} else if (event instanceof AppTubeholderSettingUpdateEvent) {
return event;//前端需要更新试管架设置
} else if (event instanceof DoA8kStepActionEvent) {
// return new MessageBoxUpdateEvent(((DoA8kStepActionEvent) event).actionStepName);
return null;
}
/*
* 下面事件均转换成 AppPromptEvents
*/
else if (event instanceof AppWarningNotifyEvent e) {
return new AppPromptEvent(ZAppPromoptFactory.buildAppPromopt(e.error));
} else if (event instanceof AppPromptEvent) {
return event; //前端需要显示提示信息
} else if (event instanceof AppExceptionEvent e) {
return ZAppPromoptFactory.buildAppPromoptEvent(e.exception);
}
/*
* 下面事件不需要前端处理
*/
else if (event instanceof A8kCanBusOnConnectEvent) {
return null; //过滤前端不需要处理
} else if (event instanceof A8kHardwareReport) {
return null;//过滤前端不需要处理
} else {
return null;
}
}
synchronized AppEvent pollAppEventFromQueue() {
return reportAppEventQueue.poll();
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// 事件处理
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
synchronized void tryFilterAndPushReportEvent(AppEvent event) {
AppEvent afProcessEvent = preProcessAppEvent(event);
if (afProcessEvent == null) {
return;
}
reportAppEventQueue.add(afProcessEvent);
appHistoryEventList.addFirst(afProcessEvent);
if (appHistoryEventList.size() > 50) {
appHistoryEventList.removeLast();
}
}
synchronized void processEventInternal(AppEvent event) {
if (event instanceof DoA8kStepActionEvent e) {
pushMessageBox(new MessageBox(MessageLevel.Info, e.actionStepName));
}
}
synchronized public void onAppEvent(AppEvent event) {
tryFilterAndPushReportEvent(event);
processEventInternal(event);
}
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// Exposed APIs
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
synchronized public List<AppEvent> pollAllAppEvents() {
List<AppEvent> ret = new java.util.ArrayList<>();
while (!reportAppEventQueue.isEmpty()) {
ret.add(pollAppEventFromQueue());
}
return ret;
}
synchronized public List<AppEvent> getAppHistoryEventList() {
return appHistoryEventList;
}
synchronized public MessageBox getTopMessage() {
return frontEndMessageBoxState.topMessage;
}
synchronized public List<MessageBox> getMessageBoxList() {
return frontEndMessageBoxState.messageBoxList;
}
synchronized public void confirmPromoptInfo(String eventId) {
log.info("confirmPromoptInfo:{}", eventId);
}
synchronized public FrontEndMessageBoxState getMessageBoxState() {
return frontEndMessageBoxState;
}
synchronized public void pushMessageBox(MessageBox messageBox) {
frontEndMessageBoxState.messageBoxList.addFirst(messageBox);
if (frontEndMessageBoxState.messageBoxList.size() > 30) {
frontEndMessageBoxState.messageBoxList.removeLast();
}
frontEndMessageBoxState.topMessage = messageBox;
frontEndMessageBoxState.stateVersion++;
}
}

4
src/main/java/a8k/app/service/lowerctrl/DeviceInitCtrlService.java

@ -2,7 +2,7 @@ package a8k.app.service.lowerctrl;
import a8k.app.a8ktype.ui.ZAppPromopt;
import a8k.app.a8ktype.ui.ZAppPromoptFormsItem;
import a8k.app.a8ktype.ui.ZAppPromoptType;
import a8k.app.a8ktype.ui.MessageLevel;
import a8k.app.factory.ZAppPromoptFactory;
import a8k.app.hardware.basedriver.A8kCanBusService;
import a8k.app.hardware.extdriver.MotorEnableExDriver;
@ -277,7 +277,7 @@ public class DeviceInitCtrlService {
detailInfos.add(new ZAppPromoptFormsItem(checkResult.info, "PASS"));
}
}
return new ZAppPromopt(ZAppPromoptType.Error, "设备初始化失败", null, detailInfos);
return new ZAppPromopt(MessageLevel.Error, "设备初始化失败", null, detailInfos);
}
private List<CheckResult> checkBeforeInitDevice() throws AppException {

3
src/main/java/a8k/app/service/lowerctrl/ProjIDCardCtrlAndMonitorService.java

@ -1,6 +1,7 @@
package a8k.app.service.lowerctrl;
import a8k.app.factory.ZAppPromoptFactory;
import a8k.app.service.data.ProjInfoMgrService;
import a8k.app.service.statemgr.GStateMgrService;
import a8k.app.a8ktype.appevent.*;
@ -114,7 +115,7 @@ public class ProjIDCardCtrlAndMonitorService {
} catch (AppException e) {
eventBus.pushEvent(new A8kErrorsPromptEvent(e.error));
eventBus.pushEvent(ZAppPromoptFactory.buildAppPromoptEvent(e.error));
}
}

25
src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java

@ -3,14 +3,16 @@ package a8k.app.service.mainctrl.mainflowctrl;
import a8k.OS;
import a8k.SpringBootBeanUtil;
import a8k.app.a8ktype.DeviceRunMode;
import a8k.app.a8ktype.appevent.A8kEcodeContextListPromptEvent;
import a8k.app.a8ktype.appevent.A8kErrorsPromptEvent;
//import a8k.app.a8ktype.appevent.A8kErrorsPromptEvent;
import a8k.app.a8ktype.appevent.AppPromptEvent;
import a8k.app.a8ktype.error.AECodeError;
import a8k.app.a8ktype.error.AppError;
import a8k.app.a8ktype.exception.AppException;
import a8k.app.a8ktype.state.DeviceWorkState;
import a8k.app.a8ktype.state.enumtype.A8kWorkState;
import a8k.app.factory.ZAppPromoptFactory;
import a8k.app.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.app.i18n.Internationalization;
import a8k.app.service.bases.AppEventBusService;
import a8k.app.service.mainctrl.mainflowctrl.base.*;
import a8k.app.service.statemgr.DeviceWorkStateMgrService;
@ -154,11 +156,9 @@ public class MainFlowCtrlScheduler implements ApplicationListener<ApplicationSta
}
//
var state = deviceWorkStateMgrService.getDeviceWorkState();
if (state.isPending() || !state.ecodeList.isEmpty() || state.manualInterventionFlag)
if (state.isPending() || !state.ecodeList.isEmpty())
break;
if (state.humanInterventionReq)
break;
OS.forceSleep(100);
}
}
@ -194,7 +194,7 @@ public class MainFlowCtrlScheduler implements ApplicationListener<ApplicationSta
} catch (AppException e) {
logger.error("catch error do idle,working,pause {}", e.getMessage(), e);
deviceWorkStateMgrService.setFatalErrorFlag(true);
ebus.pushEvent(new A8kErrorsPromptEvent((e.getError())));
ebus.pushEvent(ZAppPromoptFactory.buildAppPromoptEvent(e.getError()));
}
}
@ -207,14 +207,13 @@ public class MainFlowCtrlScheduler implements ApplicationListener<ApplicationSta
if (!errorList.isEmpty()) {
deviceWorkStateMgrService.setFatalErrorFlag(true);
deviceWorkStateMgrService.clearPending();
deviceWorkStateMgrService.clearHumanInterventionReq();
ebus.pushEvent(new A8kEcodeContextListPromptEvent(errorList));
return;
}
// ebus.pushEvent(new A8kEcodeContextListPromptEvent(errorList));
if (state.humanInterventionReq) {
deviceWorkStateMgrService.clearHumanInterventionReq();
deviceWorkStateMgrService.setPauseActionPending(true); ;
for (var error : errorList) {
ebus.pushEvent(ZAppPromoptFactory.buildAppPromoptEvent(error.ecode));
}
return;
}
//
// 切换状态

1
src/main/java/a8k/app/service/mainctrl/mainflowctrl/action/P30ScanTubeHolderTask.java

@ -215,7 +215,6 @@ public class P30ScanTubeHolderTask extends A8kActionTask {
//添加试管架到系统中
AppError error = tubeStateMgrService.newTubeHolder(tubeholder);
if (error != null) {
deviceWorkStateMgrService.setHumanInterventionReq(true);
ebus.pushEvent(new AppWarningNotifyEvent(error));
doEjectHodler();
return false;

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

@ -35,10 +35,6 @@ public class DeviceWorkStateMgrService {
deviceWorkState.startActionPending = startActionPending;
}
synchronized public void setHumanInterventionReq(Boolean humanInterventionReq) {
log.info("设置人工干预标志:{}", humanInterventionReq);
deviceWorkState.humanInterventionReq = humanInterventionReq;
}
synchronized public void addError(List<AppActionErrorContext> errorList) {
deviceWorkState.ecodeList.addAll(errorList);
@ -56,10 +52,6 @@ public class DeviceWorkStateMgrService {
deviceWorkState.clearPending();
}
synchronized public void clearHumanInterventionReq() {
deviceWorkState.humanInterventionReq = false;
}
synchronized public void updateWorkState(A8kWorkState workState) {
deviceWorkState.lastWorkState = deviceWorkState.workState;

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

@ -169,6 +169,7 @@ public class ExtApiPageGroupCfgMgr {
page.addFunction("调试", this::debugRefreshPage);
cfgList.add(new Config(PageGroupType.debug, P21AppDebugModeConfigPage.class, "设备模式配置"));
cfgList.add(new Config(PageGroupType.debug, P00AppEventAndMessageBoxDebugPage.class, "事件与消息"));
cfgList.add(new Config(PageGroupType.debug, P22UserOperaionInRunOnlyModePage.class, "空转模式用户操作"));
cfgList.add(new Config(PageGroupType.debug, P22UserOperaionInVertualModePage.class, "虚拟模式用户操作"));

53
src/main/java/a8k/extui/page/debug/P00AppEventAndMessageBoxDebugPage.java

@ -0,0 +1,53 @@
package a8k.extui.page.debug;
import a8k.app.a8ktype.appevent.AppEvent;
import a8k.app.a8ktype.ui.MessageBox;
import a8k.app.service.bases.FrontEndMessageBoxAndEventMgr;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ExtApiStatu;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class P00AppEventAndMessageBoxDebugPage {
@Resource
FrontEndMessageBoxAndEventMgr frontEndMessageBoxAndEventMgr;
@Resource
ExtApiPageMgr extApiPageMgr;
@ExtApiStatu(name = "", group = "最新消息", order = 1)
synchronized public MessageBox getTopMessage() {
return frontEndMessageBoxAndEventMgr.getTopMessage();
}
@ExtApiStatu(name = "", group = "历史消息列表", order = 2)
synchronized public List<MessageBox> getMessageBoxList() {
return frontEndMessageBoxAndEventMgr.getMessageBoxList();
}
@ExtApiStatu(name = "", group = "历史事件列表", order = 3)
synchronized public List<AppEvent> getAppHistoryEventList() {
return frontEndMessageBoxAndEventMgr.getAppHistoryEventList();
}
synchronized public void confirmPromoptInfo(String eventId) {
frontEndMessageBoxAndEventMgr.confirmPromoptInfo(eventId);
}
@PostConstruct
public void init() {
var page = extApiPageMgr.newPage(this);
page.addFunction("Promopt确认", this::confirmPromoptInfo);
extApiPageMgr.addPage(page);
}
}

69
src/main/java/a8k/extui/page/frond_end_test/VirtualEventGeneratorPage.java

@ -3,18 +3,16 @@ package a8k.extui.page.frond_end_test;
import a8k.app.a8ktype.appevent.*;
import a8k.app.a8ktype.error.AEConsumeNotEnoughError;
import a8k.app.a8ktype.error.AETubeError;
import a8k.app.a8ktype.error.AppError;
import a8k.app.a8ktype.ui.ZAppPromopt;
import a8k.app.a8ktype.ui.*;
import a8k.app.factory.ZAppPromoptFactory;
import a8k.app.hardware.type.a8kcanprotocol.A8kEcode;
import a8k.app.service.bases.AppEventBusService;
import a8k.app.service.mainctrl.mainflowctrl.action.P40ApplyIncubatorPos;
import a8k.app.service.mainctrl.mainflowctrl.base.AppActionErrorContext;
import a8k.app.service.bases.FrontEndMessageBoxAndEventMgr;
import a8k.app.service.statemgr.ConsumableStateAnalyzer;
import a8k.extui.mgr.ExtApiPageMgr;
import a8k.extui.type.ExtUIPageCfg;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
@ -29,48 +27,53 @@ public class VirtualEventGeneratorPage {
ExtApiPageMgr extApiPageMgr;
public void buildAndSendAppWarningNotifyEvent() {
AppWarningNotifyEvent event = new AppWarningNotifyEvent(A8kEcode.USR_NOT_EXIT);
eventBus.pushEvent(event);
}
public void buildAndSendA8kErrorPromptEvent() {
List<ZAppPromopt> prompt = new ArrayList<>();
prompt.add(ZAppPromoptFactory.buildAppPromopt(new AEConsumeNotEnoughError(ConsumableStateAnalyzer.buildFakeData())));
prompt.add(ZAppPromoptFactory.buildAppPromopt(new AETubeError(A8kEcode.APPE_A8K_PROJ_ID_IS_EMPTY, 1)));
AppPromptEvents event = new AppPromptEvents(prompt);
eventBus.pushEvent(event);
ZAppPromoptTable buildZAppPromoptTable() {
ZAppPromoptTable table = new ZAppPromoptTable();
table.addHeader("耗材名称", "需求量", "使用量");
table.addType("String", "String", "String");
table.addVar(new ZAppPromoptTable.Val("ABC"), new ZAppPromoptTable.Val("11"), new ZAppPromoptTable.Val(MessageLevel.Error, "20"));
table.addVar(new ZAppPromoptTable.Val("DEF"), new ZAppPromoptTable.Val("22"), new ZAppPromoptTable.Val(MessageLevel.Info, "10"));
table.addVar(new ZAppPromoptTable.Val("GHI"), new ZAppPromoptTable.Val("33"), new ZAppPromoptTable.Val(MessageLevel.Warn, "33"));
return table;
}
public void buildAndSendAppTubeholderSettingUpdateEvent() {
eventBus.pushEvent(new AppTubeholderSettingUpdateEvent());
List<ZAppPromoptFormsItem> buildZAppPromoptFormsItem() {
List<ZAppPromoptFormsItem> formsItems = new ArrayList<>();
formsItems.add(new ZAppPromoptFormsItem("姓名", "ABC"));
formsItems.add(new ZAppPromoptFormsItem("年龄", "12"));
return formsItems;
}
public void buildAndSendDoA8kStepActionEvent() {
eventBus.pushEvent(new DoA8kStepActionEvent(new P40ApplyIncubatorPos()));
public void buildInfoPromoptEvent(MessageLevel level, ZAppPromoptDetailInfoType infoType) {
switch (infoType) {
case Text:
eventBus.pushEvent(new AppPromptEvent(new ZAppPromopt(level, "测试消息", null, "一二三四五一二三四五一二三四五一二三四五一二三四五")));
break;
case Forms:
eventBus.pushEvent(new AppPromptEvent(new ZAppPromopt(level, "测试表单", null, buildZAppPromoptFormsItem())));
break;
case Table:
eventBus.pushEvent(new AppPromptEvent(new ZAppPromopt(level, "测试表格", null, buildZAppPromoptTable())));
break;
}
}
public void buildAndSendA8kEcodeContextListPromptEvent() {
List<AppActionErrorContext> errorContexts = new ArrayList<>();
@Resource
FrontEndMessageBoxAndEventMgr frontEndMessageBoxAndEventMgr;
var action = new P40ApplyIncubatorPos();
errorContexts.add(new AppActionErrorContext(action,
new AppError(A8kEcode.APPE_TUBE_HOLDER_TYPE_IS_NOT_SUPPORT)));
errorContexts.add(new AppActionErrorContext(action,
new AppError(A8kEcode.APPE_NO_TUBE_IN_HOLDER)));
eventBus.pushEvent(new A8kEcodeContextListPromptEvent(errorContexts));
public void pushMessageBoxEvent(MessageLevel level, String info) {
frontEndMessageBoxAndEventMgr.pushMessageBox(new MessageBox(level, info));
}
@PostConstruct
void init() {
ExtUIPageCfg page = new ExtUIPageCfg(this);
page.addFunction("发送AppWarningNotifyEvent", this::buildAndSendAppWarningNotifyEvent);
page.addFunction("发送AppPromptEvents", this::buildAndSendA8kErrorPromptEvent);
page.addFunction("发送AppTubeholderSettingUpdateEvent", this::buildAndSendAppTubeholderSettingUpdateEvent);
page.addFunction("发送DoA8kStepActionEvent", this::buildAndSendDoA8kStepActionEvent);
page.addFunction("发送A8kEcodeContextListPromptEvent", this::buildAndSendA8kEcodeContextListPromptEvent);
page.addFunction("构建弹窗事件", this::buildInfoPromoptEvent);
page.addFunction("构造消息", this::pushMessageBoxEvent);
extApiPageMgr.addPage(page);
}

Loading…
Cancel
Save