diff --git a/src/main/java/a8k/app/a8ktype/appevent/A8kEcodeContextListPromptEvent.java b/src/main/java/a8k/app/a8ktype/appevent/A8kEcodeContextListPromptEvent.java deleted file mode 100644 index 0ba1a65..0000000 --- a/src/main/java/a8k/app/a8ktype/appevent/A8kEcodeContextListPromptEvent.java +++ /dev/null @@ -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 ecodeList; - - public A8kEcodeContextListPromptEvent(List 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); - } -} diff --git a/src/main/java/a8k/app/a8ktype/appevent/A8kErrorsPromptEvent.java b/src/main/java/a8k/app/a8ktype/appevent/A8kErrorsPromptEvent.java deleted file mode 100644 index c951de8..0000000 --- a/src/main/java/a8k/app/a8ktype/appevent/A8kErrorsPromptEvent.java +++ /dev/null @@ -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 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 errors) { - super(A8kErrorsPromptEvent.class.getSimpleName()); - this.errors = errors; - } - - public String toString() { - return String.format("%s", errors); - } -} diff --git a/src/main/java/a8k/app/a8ktype/appevent/AppEvent.java b/src/main/java/a8k/app/a8ktype/appevent/AppEvent.java index 251c63b..3c07bfa 100644 --- a/src/main/java/a8k/app/a8ktype/appevent/AppEvent.java +++ b/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; } diff --git a/src/main/java/a8k/app/a8ktype/appevent/AppPromptEvent.java b/src/main/java/a8k/app/a8ktype/appevent/AppPromptEvent.java new file mode 100644 index 0000000..6ad6a9f --- /dev/null +++ b/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; + } + +} diff --git a/src/main/java/a8k/app/a8ktype/appevent/AppPromptEvents.java b/src/main/java/a8k/app/a8ktype/appevent/AppPromptEvents.java deleted file mode 100644 index a45a3bb..0000000 --- a/src/main/java/a8k/app/a8ktype/appevent/AppPromptEvents.java +++ /dev/null @@ -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 prompt; - - public AppPromptEvents(List prompt) { - super(AppPromptEvents.class.getSimpleName()); - this.prompt = prompt; - } - -} diff --git a/src/main/java/a8k/app/a8ktype/appevent/MessageBoxUpdateEvent.java b/src/main/java/a8k/app/a8ktype/appevent/MessageBoxUpdateEvent.java deleted file mode 100644 index 91b11c9..0000000 --- a/src/main/java/a8k/app/a8ktype/appevent/MessageBoxUpdateEvent.java +++ /dev/null @@ -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; - } -} diff --git a/src/main/java/a8k/app/a8ktype/state/DeviceWorkState.java b/src/main/java/a8k/app/a8ktype/state/DeviceWorkState.java index 8dc0957..fef77a4 100644 --- a/src/main/java/a8k/app/a8ktype/state/DeviceWorkState.java +++ b/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() { diff --git a/src/main/java/a8k/app/a8ktype/ui/MessageBox.java b/src/main/java/a8k/app/a8ktype/ui/MessageBox.java new file mode 100644 index 0000000..3aad3c2 --- /dev/null +++ b/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; + } + +} diff --git a/src/main/java/a8k/app/a8ktype/ui/ZAppPromoptType.java b/src/main/java/a8k/app/a8ktype/ui/MessageLevel.java similarity index 65% rename from src/main/java/a8k/app/a8ktype/ui/ZAppPromoptType.java rename to src/main/java/a8k/app/a8ktype/ui/MessageLevel.java index 242be5c..ffabd64 100644 --- a/src/main/java/a8k/app/a8ktype/ui/ZAppPromoptType.java +++ b/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, //致命错误 diff --git a/src/main/java/a8k/app/a8ktype/ui/ZAppPromopt.java b/src/main/java/a8k/app/a8ktype/ui/ZAppPromopt.java index 31ac523..6f7f29c 100644 --- a/src/main/java/a8k/app/a8ktype/ui/ZAppPromopt.java +++ b/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 detailInfos) { - this.type = type; + public ZAppPromopt(MessageLevel type, String info, ZAppErrorStackInfo stackInfo, List 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; } diff --git a/src/main/java/a8k/app/a8ktype/ui/ZAppPromoptDetailInfoType.java b/src/main/java/a8k/app/a8ktype/ui/ZAppPromoptDetailInfoType.java new file mode 100644 index 0000000..759bc67 --- /dev/null +++ b/src/main/java/a8k/app/a8ktype/ui/ZAppPromoptDetailInfoType.java @@ -0,0 +1,7 @@ +package a8k.app.a8ktype.ui; + +public enum ZAppPromoptDetailInfoType { + Text,//文本 + Forms, //表单 + Table, //表格 +} diff --git a/src/main/java/a8k/app/a8ktype/ui/ZAppPromoptTable.java b/src/main/java/a8k/app/a8ktype/ui/ZAppPromoptTable.java index 6e38b33..f98eb46 100644 --- a/src/main/java/a8k/app/a8ktype/ui/ZAppPromoptTable.java +++ b/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 header = new ArrayList<>(); public List types = new ArrayList<>(); public List 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); + } } diff --git a/src/main/java/a8k/app/controler/api/v1/app/basic/AppEventBusControler.java b/src/main/java/a8k/app/controler/api/v1/app/basic/AppEventBusControler.java index 60a1150..b2ec794 100644 --- a/src/main/java/a8k/app/controler/api/v1/app/basic/AppEventBusControler.java +++ b/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 pollAppEvent() { - return ApiRet.success(frontEndEventRouter.pollAppEvent()); + @Operation(summary = "获取历史事件") + @PostMapping("/pollHistoryAppEvents") + public ApiRet> pollHistoryAppEvents() { + return ApiRet.success(frontEndMessageBoxAndEventMgr.getAppHistoryEventList()); } - @Operation(summary = "获取全部事件") - @PostMapping("/pollAllAppEvents") - public ApiRet> pollAllAppEvents() { - return ApiRet.success(frontEndEventRouter.pollAllAppEvents()); + @Operation(summary = "Prompt确认") + @PostMapping("/confirmPromoptInfo") + public ApiRet confirmPromoptInfo(String eventId) { + frontEndMessageBoxAndEventMgr.confirmPromoptInfo(eventId); + return ApiRet.success(); } } diff --git a/src/main/java/a8k/app/controler/api/v1/app/ws/AppWebSocketEndpointMgr.java b/src/main/java/a8k/app/controler/api/v1/app/ws/AppWebSocketEndpointMgr.java index f61903a..20e96ea 100644 --- a/src/main/java/a8k/app/controler/api/v1/app/ws/AppWebSocketEndpointMgr.java +++ b/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()); + } } } diff --git a/src/main/java/a8k/app/factory/ZAppPromoptFactory.java b/src/main/java/a8k/app/factory/ZAppPromoptFactory.java index d7c09f5..4a0ab40 100644 --- a/src/main/java/a8k/app/factory/ZAppPromoptFactory.java +++ b/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 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 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 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 buildAppPromptEvents(A8kEcodeContextListPromptEvent e) { + // List ret = new ArrayList<>(); + // for (AppActionErrorContext ecode : e.ecodeList) { + // ret.add(new AppPromptEvent(ZAppPromoptFactory.buildAppPromopt(ecode.ecode))); + // } + // return ret; + // } + // + // public static List buildAppPromptEvents(A8kErrorsPromptEvent e) { + // List prompts = new java.util.ArrayList<>(); + // for (AppError error : e.errors) { + // prompts.add(new AppPromptEvent(ZAppPromoptFactory.buildAppPromopt(error))); + // } + // return prompts; + // + // } } \ No newline at end of file diff --git a/src/main/java/a8k/app/service/bases/FrontEndEventRouter.java b/src/main/java/a8k/app/service/bases/FrontEndEventRouter.java deleted file mode 100644 index b9bebcd..0000000 --- a/src/main/java/a8k/app/service/bases/FrontEndEventRouter.java +++ /dev/null @@ -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 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 pollAllAppEvents() { - List ret = new java.util.ArrayList<>(); - while (!appEventQueue.isEmpty()) { - ret.add(pollAppEventFromQueue()); - } - return ret; - } -} diff --git a/src/main/java/a8k/app/service/bases/FrontEndMessageBoxAndEventMgr.java b/src/main/java/a8k/app/service/bases/FrontEndMessageBoxAndEventMgr.java new file mode 100644 index 0000000..e79302c --- /dev/null +++ b/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 messageBoxList = new LinkedList<>(); //消息列表 + public Integer stateVersion = 0; + } + + @Resource + AppEventBusService eventBus; + + + private final Queue reportAppEventQueue = new java.util.concurrent.ConcurrentLinkedQueue<>(); //事件上报队列 + private final LinkedList 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 pollAllAppEvents() { + List ret = new java.util.ArrayList<>(); + while (!reportAppEventQueue.isEmpty()) { + ret.add(pollAppEventFromQueue()); + } + return ret; + } + + synchronized public List getAppHistoryEventList() { + return appHistoryEventList; + } + + synchronized public MessageBox getTopMessage() { + return frontEndMessageBoxState.topMessage; + } + + synchronized public List 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++; + + } + + +} diff --git a/src/main/java/a8k/app/service/lowerctrl/DeviceInitCtrlService.java b/src/main/java/a8k/app/service/lowerctrl/DeviceInitCtrlService.java index f287271..97c4c5f 100644 --- a/src/main/java/a8k/app/service/lowerctrl/DeviceInitCtrlService.java +++ b/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 checkBeforeInitDevice() throws AppException { diff --git a/src/main/java/a8k/app/service/lowerctrl/ProjIDCardCtrlAndMonitorService.java b/src/main/java/a8k/app/service/lowerctrl/ProjIDCardCtrlAndMonitorService.java index c6d4799..905225b 100644 --- a/src/main/java/a8k/app/service/lowerctrl/ProjIDCardCtrlAndMonitorService.java +++ b/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)); } } diff --git a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java b/src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java index c979c06..88a809d 100644 --- a/src/main/java/a8k/app/service/mainctrl/mainflowctrl/MainFlowCtrlScheduler.java +++ b/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 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; diff --git a/src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java b/src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java index 4038988..dc1fb41 100644 --- a/src/main/java/a8k/extui/mgr/ExtApiPageGroupCfgMgr.java +++ b/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, "虚拟模式用户操作")); diff --git a/src/main/java/a8k/extui/page/debug/P00AppEventAndMessageBoxDebugPage.java b/src/main/java/a8k/extui/page/debug/P00AppEventAndMessageBoxDebugPage.java new file mode 100644 index 0000000..0abc53e --- /dev/null +++ b/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 getMessageBoxList() { + return frontEndMessageBoxAndEventMgr.getMessageBoxList(); + } + + + @ExtApiStatu(name = "", group = "历史事件列表", order = 3) + synchronized public List 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); + } + + +} diff --git a/src/main/java/a8k/extui/page/frond_end_test/VirtualEventGeneratorPage.java b/src/main/java/a8k/extui/page/frond_end_test/VirtualEventGeneratorPage.java index 6ba735f..a01569e 100644 --- a/src/main/java/a8k/extui/page/frond_end_test/VirtualEventGeneratorPage.java +++ b/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 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 buildZAppPromoptFormsItem() { + List 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 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); }