From 852cb7a28fe12ed135f9af042da2e7d93bd4b692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Sat, 26 Apr 2025 20:22:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=89=8D=E7=AB=AF=E6=8C=87=E4=BB=A4?= =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gd/app/common/annotation/CommandMapping.java | 12 ------- .../app/common/constant/WebSocketMessageType.java | 25 ------------- .../iflytop/gd/app/controller/CmdController.java | 4 +-- .../com/iflytop/gd/app/core/CraftsContext.java | 2 +- .../iflytop/gd/app/core/cmd/CommandHandler.java | 9 ----- .../gd/app/core/cmd/CommandHandlerRegistry.java | 42 ---------------------- .../iflytop/gd/app/service/cmd/DemoCommand.java | 27 ++++++++++++++ .../system/common/annotation/CheckedRunnable.java | 6 ++++ .../system/common/annotation/CommandMapping.java | 12 +++++++ .../common/constant/WebSocketMessageType.java | 25 +++++++++++++ .../iflytop/gd/system/common/utils/LambdaUtil.java | 15 ++++++++ .../gd/system/core/cmd/BaseCommandHandler.java | 18 ++++++++++ .../iflytop/gd/system/core/cmd/CommandHandler.java | 9 +++++ .../gd/system/core/cmd/CommandHandlerRegistry.java | 42 ++++++++++++++++++++++ 14 files changed, 157 insertions(+), 91 deletions(-) delete mode 100644 src/main/java/com/iflytop/gd/app/common/annotation/CommandMapping.java delete mode 100644 src/main/java/com/iflytop/gd/app/common/constant/WebSocketMessageType.java delete mode 100644 src/main/java/com/iflytop/gd/app/core/cmd/CommandHandler.java delete mode 100644 src/main/java/com/iflytop/gd/app/core/cmd/CommandHandlerRegistry.java create mode 100644 src/main/java/com/iflytop/gd/app/service/cmd/DemoCommand.java create mode 100644 src/main/java/com/iflytop/gd/system/common/annotation/CheckedRunnable.java create mode 100644 src/main/java/com/iflytop/gd/system/common/annotation/CommandMapping.java create mode 100644 src/main/java/com/iflytop/gd/system/common/constant/WebSocketMessageType.java create mode 100644 src/main/java/com/iflytop/gd/system/common/utils/LambdaUtil.java create mode 100644 src/main/java/com/iflytop/gd/system/core/cmd/BaseCommandHandler.java create mode 100644 src/main/java/com/iflytop/gd/system/core/cmd/CommandHandler.java create mode 100644 src/main/java/com/iflytop/gd/system/core/cmd/CommandHandlerRegistry.java diff --git a/src/main/java/com/iflytop/gd/app/common/annotation/CommandMapping.java b/src/main/java/com/iflytop/gd/app/common/annotation/CommandMapping.java deleted file mode 100644 index 5432a10..0000000 --- a/src/main/java/com/iflytop/gd/app/common/annotation/CommandMapping.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.iflytop.gd.app.common.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface CommandMapping { - String value(); -} \ No newline at end of file diff --git a/src/main/java/com/iflytop/gd/app/common/constant/WebSocketMessageType.java b/src/main/java/com/iflytop/gd/app/common/constant/WebSocketMessageType.java deleted file mode 100644 index b5300fe..0000000 --- a/src/main/java/com/iflytop/gd/app/common/constant/WebSocketMessageType.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.iflytop.gd.app.common.constant; - -public class WebSocketMessageType { - /** - * 设备状态 - */ - public static final String STATUS = "status"; - /** - * 设备报警 - */ - public static final String ALARM = "alarm"; - /** - * 设备指令反馈 - */ - public static final String CMD = "cmd"; - /** - * 工艺执行反馈 - */ - public static final String CRAFTS = "crafts"; - /** - * 容器剩余状态 - */ - public static final String CONTAINER = "container"; - -} diff --git a/src/main/java/com/iflytop/gd/app/controller/CmdController.java b/src/main/java/com/iflytop/gd/app/controller/CmdController.java index 5a3184b..8729c72 100644 --- a/src/main/java/com/iflytop/gd/app/controller/CmdController.java +++ b/src/main/java/com/iflytop/gd/app/controller/CmdController.java @@ -1,7 +1,7 @@ package com.iflytop.gd.app.controller; -import com.iflytop.gd.app.core.cmd.CommandHandler; -import com.iflytop.gd.app.core.cmd.CommandHandlerRegistry; +import com.iflytop.gd.system.core.cmd.CommandHandler; +import com.iflytop.gd.system.core.cmd.CommandHandlerRegistry; import com.iflytop.gd.app.model.dto.CmdDTO; import com.iflytop.gd.system.common.result.Result; import io.swagger.v3.oas.annotations.Operation; diff --git a/src/main/java/com/iflytop/gd/app/core/CraftsContext.java b/src/main/java/com/iflytop/gd/app/core/CraftsContext.java index 97194fc..57a5a1e 100644 --- a/src/main/java/com/iflytop/gd/app/core/CraftsContext.java +++ b/src/main/java/com/iflytop/gd/app/core/CraftsContext.java @@ -1,7 +1,7 @@ package com.iflytop.gd.app.core; import cn.hutool.json.JSONUtil; -import com.iflytop.gd.app.common.constant.WebSocketMessageType; +import com.iflytop.gd.system.common.constant.WebSocketMessageType; import com.iflytop.gd.app.common.enums.CraftEvents; import com.iflytop.gd.app.common.enums.CraftStates; import com.iflytop.gd.app.model.bo.CraftsStep; diff --git a/src/main/java/com/iflytop/gd/app/core/cmd/CommandHandler.java b/src/main/java/com/iflytop/gd/app/core/cmd/CommandHandler.java deleted file mode 100644 index cadee50..0000000 --- a/src/main/java/com/iflytop/gd/app/core/cmd/CommandHandler.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.iflytop.gd.app.core.cmd; - -import com.iflytop.gd.app.model.dto.CmdDTO; - -import java.util.concurrent.CompletableFuture; - -public interface CommandHandler { - CompletableFuture handle(CmdDTO cmdDTO); -} \ No newline at end of file diff --git a/src/main/java/com/iflytop/gd/app/core/cmd/CommandHandlerRegistry.java b/src/main/java/com/iflytop/gd/app/core/cmd/CommandHandlerRegistry.java deleted file mode 100644 index 767e2e6..0000000 --- a/src/main/java/com/iflytop/gd/app/core/cmd/CommandHandlerRegistry.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.iflytop.gd.app.core.cmd; - -import com.iflytop.gd.app.common.annotation.CommandMapping; -import io.micrometer.common.lang.NonNull; -import jakarta.annotation.PostConstruct; -import org.springframework.aop.support.AopUtils; -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component -public class CommandHandlerRegistry implements ApplicationContextAware { - - private final Map handlerMap = new HashMap<>(); - private ApplicationContext applicationContext; - - @Override - public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException { - this.applicationContext = applicationContext; - } - - @PostConstruct - public void init() { - Map beans = applicationContext.getBeansWithAnnotation(CommandMapping.class); - for (Object bean : beans.values()) { - // 获取实际目标类,而不是代理类 - Class targetClass = AopUtils.getTargetClass(bean); - CommandMapping mapping = targetClass.getAnnotation(CommandMapping.class); - if (mapping != null && bean instanceof CommandHandler) { - handlerMap.put(mapping.value(), (CommandHandler) bean); - } - } - } - - public CommandHandler getHandler(String command) { - return handlerMap.get(command); - } -} \ No newline at end of file diff --git a/src/main/java/com/iflytop/gd/app/service/cmd/DemoCommand.java b/src/main/java/com/iflytop/gd/app/service/cmd/DemoCommand.java new file mode 100644 index 0000000..6e9d24e --- /dev/null +++ b/src/main/java/com/iflytop/gd/app/service/cmd/DemoCommand.java @@ -0,0 +1,27 @@ +package com.iflytop.gd.app.service.cmd; + +import com.iflytop.gd.app.model.dto.CmdDTO; +import com.iflytop.gd.system.common.annotation.CommandMapping; +import com.iflytop.gd.system.core.cmd.BaseCommandHandler; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.concurrent.CompletableFuture; + + +@Slf4j +@Component +@RequiredArgsConstructor +@CommandMapping("test_test")//业务指令注解 +public class DemoCommand extends BaseCommandHandler { + + @Override + public CompletableFuture handle(CmdDTO cmdDTO) { + //同步代码 + return runAsync(() -> { + //异步代码 + }); + + } +} diff --git a/src/main/java/com/iflytop/gd/system/common/annotation/CheckedRunnable.java b/src/main/java/com/iflytop/gd/system/common/annotation/CheckedRunnable.java new file mode 100644 index 0000000..42d4f16 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/common/annotation/CheckedRunnable.java @@ -0,0 +1,6 @@ +package com.iflytop.gd.system.common.annotation; + +@FunctionalInterface +public interface CheckedRunnable { + void run() throws Exception; +} diff --git a/src/main/java/com/iflytop/gd/system/common/annotation/CommandMapping.java b/src/main/java/com/iflytop/gd/system/common/annotation/CommandMapping.java new file mode 100644 index 0000000..e82ef59 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/common/annotation/CommandMapping.java @@ -0,0 +1,12 @@ +package com.iflytop.gd.system.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface CommandMapping { + String value(); +} \ No newline at end of file diff --git a/src/main/java/com/iflytop/gd/system/common/constant/WebSocketMessageType.java b/src/main/java/com/iflytop/gd/system/common/constant/WebSocketMessageType.java new file mode 100644 index 0000000..cdff747 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/common/constant/WebSocketMessageType.java @@ -0,0 +1,25 @@ +package com.iflytop.gd.system.common.constant; + +public class WebSocketMessageType { + /** + * 设备状态 + */ + public static final String STATUS = "status"; + /** + * 设备报警 + */ + public static final String ALARM = "alarm"; + /** + * 设备指令反馈 + */ + public static final String CMD = "cmd"; + /** + * 工艺执行反馈 + */ + public static final String CRAFTS = "crafts"; + /** + * 容器剩余状态 + */ + public static final String CONTAINER = "container"; + +} diff --git a/src/main/java/com/iflytop/gd/system/common/utils/LambdaUtil.java b/src/main/java/com/iflytop/gd/system/common/utils/LambdaUtil.java new file mode 100644 index 0000000..f2f69f7 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/common/utils/LambdaUtil.java @@ -0,0 +1,15 @@ +package com.iflytop.gd.system.common.utils; + +import com.iflytop.gd.system.common.annotation.CheckedRunnable; + +public class LambdaUtil { + public static Runnable unchecked(CheckedRunnable runnable) { + return () -> { + try { + runnable.run(); + } catch (Exception e) { + throw new RuntimeException(e); + } + }; + } +} \ No newline at end of file diff --git a/src/main/java/com/iflytop/gd/system/core/cmd/BaseCommandHandler.java b/src/main/java/com/iflytop/gd/system/core/cmd/BaseCommandHandler.java new file mode 100644 index 0000000..052e314 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/core/cmd/BaseCommandHandler.java @@ -0,0 +1,18 @@ +package com.iflytop.gd.system.core.cmd; + + + +import com.iflytop.gd.system.common.annotation.CheckedRunnable; +import com.iflytop.gd.system.common.utils.LambdaUtil; + +import java.util.concurrent.CompletableFuture; + +public abstract class BaseCommandHandler implements CommandHandler { + + protected CompletableFuture runAsync(CheckedRunnable task) { + return CompletableFuture.runAsync(LambdaUtil.unchecked(task)); + } + + + +} \ No newline at end of file diff --git a/src/main/java/com/iflytop/gd/system/core/cmd/CommandHandler.java b/src/main/java/com/iflytop/gd/system/core/cmd/CommandHandler.java new file mode 100644 index 0000000..cae8795 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/core/cmd/CommandHandler.java @@ -0,0 +1,9 @@ +package com.iflytop.gd.system.core.cmd; + +import com.iflytop.gd.app.model.dto.CmdDTO; + +import java.util.concurrent.CompletableFuture; + +public interface CommandHandler { + CompletableFuture handle(CmdDTO cmdDTO); +} \ No newline at end of file diff --git a/src/main/java/com/iflytop/gd/system/core/cmd/CommandHandlerRegistry.java b/src/main/java/com/iflytop/gd/system/core/cmd/CommandHandlerRegistry.java new file mode 100644 index 0000000..d3d91e7 --- /dev/null +++ b/src/main/java/com/iflytop/gd/system/core/cmd/CommandHandlerRegistry.java @@ -0,0 +1,42 @@ +package com.iflytop.gd.system.core.cmd; + +import com.iflytop.gd.system.common.annotation.CommandMapping; +import io.micrometer.common.lang.NonNull; +import jakarta.annotation.PostConstruct; +import org.springframework.aop.support.AopUtils; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +public class CommandHandlerRegistry implements ApplicationContextAware { + + private final Map handlerMap = new HashMap<>(); + private ApplicationContext applicationContext; + + @Override + public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext; + } + + @PostConstruct + public void init() { + Map beans = applicationContext.getBeansWithAnnotation(CommandMapping.class); + for (Object bean : beans.values()) { + // 获取实际目标类,而不是代理类 + Class targetClass = AopUtils.getTargetClass(bean); + CommandMapping mapping = targetClass.getAnnotation(CommandMapping.class); + if (mapping != null && bean instanceof CommandHandler) { + handlerMap.put(mapping.value(), (CommandHandler) bean); + } + } + } + + public CommandHandler getHandler(String command) { + return handlerMap.get(command); + } +} \ No newline at end of file