From a0eccffb458abc0a1a0b9166fe2a409433427fa9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=99=E5=B0=8F=E4=BA=91?= Date: Tue, 16 Dec 2025 15:01:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BE=AA=E7=8E=AF=E6=B3=A8?= =?UTF-8?q?=E5=85=A5=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../machine/config/AirportMachineConfig.java | 7 +- .../machine/config/CoverMachineConfig.java | 7 +- .../machine/config/DrcMachineConfig.java | 7 +- .../machine/config/DroneMachineConfig.java | 7 +- .../machine/demo/MultiPlatformDemo.java | 4 +- .../factory/AirportSystemManagerFactory.java | 77 +++++++++++++++++++ .../factory/PlatformStrategyFactory.java | 41 +--------- 7 files changed, 89 insertions(+), 61 deletions(-) create mode 100644 src/main/java/com/tuoheng/machine/manager/factory/AirportSystemManagerFactory.java diff --git a/src/main/java/com/tuoheng/machine/config/AirportMachineConfig.java b/src/main/java/com/tuoheng/machine/config/AirportMachineConfig.java index e156671..b4ca074 100644 --- a/src/main/java/com/tuoheng/machine/config/AirportMachineConfig.java +++ b/src/main/java/com/tuoheng/machine/config/AirportMachineConfig.java @@ -4,7 +4,6 @@ import com.tuoheng.machine.events.AirportEvent; import com.tuoheng.machine.platform.factory.PlatformStrategyFactory; import com.tuoheng.machine.platform.strategy.AirportPlatformStrategy; import com.tuoheng.machine.status.AirportState; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.statemachine.StateMachine; @@ -21,11 +20,9 @@ import java.util.UUID; @Configuration public class AirportMachineConfig { - @Autowired - private PlatformStrategyFactory platformStrategyFactory; - @Bean(name = "airportStateMachineFactory") - public StateMachineFactory stateMachineFactory() throws Exception { + public StateMachineFactory stateMachineFactory( + PlatformStrategyFactory platformStrategyFactory) throws Exception { return new StateMachineFactory() { @Override public StateMachine getStateMachine() { diff --git a/src/main/java/com/tuoheng/machine/config/CoverMachineConfig.java b/src/main/java/com/tuoheng/machine/config/CoverMachineConfig.java index 0c8af02..6ca4d77 100644 --- a/src/main/java/com/tuoheng/machine/config/CoverMachineConfig.java +++ b/src/main/java/com/tuoheng/machine/config/CoverMachineConfig.java @@ -4,7 +4,6 @@ import com.tuoheng.machine.events.CoverEvent; import com.tuoheng.machine.platform.factory.PlatformStrategyFactory; import com.tuoheng.machine.platform.strategy.CoverPlatformStrategy; import com.tuoheng.machine.status.CoverState; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.statemachine.StateMachine; @@ -21,11 +20,9 @@ import java.util.UUID; @Configuration public class CoverMachineConfig { - @Autowired - private PlatformStrategyFactory platformStrategyFactory; - @Bean - public StateMachineFactory coverStateMachineFactory() throws Exception { + public StateMachineFactory coverStateMachineFactory( + PlatformStrategyFactory platformStrategyFactory) throws Exception { return new StateMachineFactory() { @Override public StateMachine getStateMachine() { diff --git a/src/main/java/com/tuoheng/machine/config/DrcMachineConfig.java b/src/main/java/com/tuoheng/machine/config/DrcMachineConfig.java index 553b88c..1b36841 100644 --- a/src/main/java/com/tuoheng/machine/config/DrcMachineConfig.java +++ b/src/main/java/com/tuoheng/machine/config/DrcMachineConfig.java @@ -4,7 +4,6 @@ import com.tuoheng.machine.events.DrcEvent; import com.tuoheng.machine.platform.factory.PlatformStrategyFactory; import com.tuoheng.machine.platform.strategy.DrcPlatformStrategy; import com.tuoheng.machine.status.DrcState; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.statemachine.StateMachine; @@ -21,11 +20,9 @@ import java.util.UUID; @Configuration public class DrcMachineConfig { - @Autowired - private PlatformStrategyFactory platformStrategyFactory; - @Bean(name = "drcStateMachineFactory") - public StateMachineFactory drcStateMachineFactory() throws Exception { + public StateMachineFactory drcStateMachineFactory( + PlatformStrategyFactory platformStrategyFactory) throws Exception { return new StateMachineFactory() { @Override public StateMachine getStateMachine() { diff --git a/src/main/java/com/tuoheng/machine/config/DroneMachineConfig.java b/src/main/java/com/tuoheng/machine/config/DroneMachineConfig.java index 7ead417..2ea5eeb 100644 --- a/src/main/java/com/tuoheng/machine/config/DroneMachineConfig.java +++ b/src/main/java/com/tuoheng/machine/config/DroneMachineConfig.java @@ -4,7 +4,6 @@ import com.tuoheng.machine.events.DroneEvent; import com.tuoheng.machine.platform.factory.PlatformStrategyFactory; import com.tuoheng.machine.platform.strategy.DronePlatformStrategy; import com.tuoheng.machine.status.DroneState; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.statemachine.StateMachine; @@ -21,11 +20,9 @@ import java.util.UUID; @Configuration public class DroneMachineConfig { - @Autowired - private PlatformStrategyFactory platformStrategyFactory; - @Bean(name = "droneStateMachineFactory") - public StateMachineFactory droneStateMachineFactory() throws Exception { + public StateMachineFactory droneStateMachineFactory( + PlatformStrategyFactory platformStrategyFactory) throws Exception { return new StateMachineFactory() { @Override public StateMachine getStateMachine() { diff --git a/src/main/java/com/tuoheng/machine/demo/MultiPlatformDemo.java b/src/main/java/com/tuoheng/machine/demo/MultiPlatformDemo.java index cd63b57..f2f8306 100644 --- a/src/main/java/com/tuoheng/machine/demo/MultiPlatformDemo.java +++ b/src/main/java/com/tuoheng/machine/demo/MultiPlatformDemo.java @@ -1,6 +1,7 @@ package com.tuoheng.machine.demo; import com.tuoheng.machine.manager.AirportSystemManager; +import com.tuoheng.machine.manager.factory.AirportSystemManagerFactory; import com.tuoheng.machine.platform.factory.PlatformStrategyFactory; import org.springframework.context.annotation.AnnotationConfigApplicationContext; @@ -20,6 +21,7 @@ public class MultiPlatformDemo { // 获取必要的Bean PlatformStrategyFactory strategyFactory = context.getBean(PlatformStrategyFactory.class); + AirportSystemManagerFactory managerFactory = context.getBean(AirportSystemManagerFactory.class); System.out.println("\n========== DJI 机巢系统演示开始 ==========\n"); @@ -32,7 +34,7 @@ public class MultiPlatformDemo { System.out.println("1. DJI机巢上线: " + djiAirport); System.out.println(" 平台类型: " + strategyFactory.getPlatformType(djiAirport).getName()); - AirportSystemManager djiManager = strategyFactory.getSystemManager(djiAirport); + AirportSystemManager djiManager = managerFactory.getManager(djiAirport); djiManager.airportOnline(djiAirport); System.out.println(" " + djiManager.getFullStatus(djiAirport)); System.out.println(); diff --git a/src/main/java/com/tuoheng/machine/manager/factory/AirportSystemManagerFactory.java b/src/main/java/com/tuoheng/machine/manager/factory/AirportSystemManagerFactory.java new file mode 100644 index 0000000..2849438 --- /dev/null +++ b/src/main/java/com/tuoheng/machine/manager/factory/AirportSystemManagerFactory.java @@ -0,0 +1,77 @@ +package com.tuoheng.machine.manager.factory; + +import com.tuoheng.machine.manager.AirportSystemManager; +import com.tuoheng.machine.platform.PlatformType; +import com.tuoheng.machine.repository.AirportPlatformRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 机巢系统管理器工厂 + * 根据机巢SN从数据库查询平台类型,返回对应的系统管理器 + */ +@Component +public class AirportSystemManagerFactory { + + @Autowired + private AirportPlatformRepository airportPlatformRepository; + + /** + * 存储所有平台的系统管理器实现 + * Key: PlatformType + * Value: AirportSystemManager实现 + */ + private final Map managerMap = new ConcurrentHashMap<>(); + + /** + * 注册所有系统管理器 + * Spring会自动注入所有实现了AirportSystemManager的Bean + */ + @Autowired + public void registerManagers(List managers) { + for (AirportSystemManager manager : managers) { + managerMap.put(manager.getPlatformType(), manager); + System.out.println(String.format("注册系统管理器: %s -> %s", + manager.getPlatformType().getName(), manager.getClass().getSimpleName())); + } + } + + /** + * 根据机巢SN获取对应的系统管理器 + * + * @param airportSn 机巢序列号 + * @return 对应平台的AirportSystemManager实现 + * @throws IllegalArgumentException 如果机巢未注册或系统管理器不存在 + */ + public AirportSystemManager getManager(String airportSn) { + PlatformType platformType = airportPlatformRepository.getPlatformType(airportSn); + + if (platformType == null) { + throw new IllegalArgumentException( + String.format("机巢未注册或平台类型未配置: %s", airportSn)); + } + + AirportSystemManager manager = managerMap.get(platformType); + + if (manager == null) { + throw new IllegalArgumentException( + String.format("未找到平台系统管理器: %s (机巢: %s)", platformType.getName(), airportSn)); + } + + return manager; + } + + /** + * 根据平台类型获取系统管理器 + * + * @param platformType 平台类型 + * @return 对应平台的AirportSystemManager实现 + */ + public AirportSystemManager getManagerByType(PlatformType platformType) { + return managerMap.get(platformType); + } +} diff --git a/src/main/java/com/tuoheng/machine/platform/factory/PlatformStrategyFactory.java b/src/main/java/com/tuoheng/machine/platform/factory/PlatformStrategyFactory.java index 9a3f327..0c23d16 100644 --- a/src/main/java/com/tuoheng/machine/platform/factory/PlatformStrategyFactory.java +++ b/src/main/java/com/tuoheng/machine/platform/factory/PlatformStrategyFactory.java @@ -1,6 +1,5 @@ package com.tuoheng.machine.platform.factory; -import com.tuoheng.machine.manager.AirportSystemManager; import com.tuoheng.machine.platform.PlatformType; import com.tuoheng.machine.repository.AirportPlatformRepository; import com.tuoheng.machine.platform.strategy.AirportPlatformStrategy; @@ -52,13 +51,6 @@ public class PlatformStrategyFactory { */ private final Map drcStrategyMap = new ConcurrentHashMap<>(); - /** - * 存储各平台对应的系统管理器实现 - * Key: PlatformType - * Value: AirportSystemManager实现 - */ - private final Map managerMap = new ConcurrentHashMap<>(); - /** * 注册所有平台策略 * Spring会自动注入所有实现了AirportPlatformStrategy、CoverPlatformStrategy、DronePlatformStrategy和DrcPlatformStrategy的Bean @@ -68,8 +60,7 @@ public class PlatformStrategyFactory { List airportStrategies, List coverStrategies, List droneStrategies, - List drcStrategies, - List systemManagers) { + List drcStrategies) { // 注册机巢策略 for (AirportPlatformStrategy strategy : airportStrategies) { @@ -98,13 +89,6 @@ public class PlatformStrategyFactory { System.out.println(String.format("注册DRC平台策略: %s -> %s", strategy.getPlatformType().getName(), strategy.getClass().getSimpleName())); } - - // 注册系统管理器 - for (AirportSystemManager manager : systemManagers) { - managerMap.put(manager.getPlatformType(), manager); - System.out.println(String.format("注册系统管理器: %s -> %s", - manager.getPlatformType().getName(), manager.getClass().getSimpleName())); - } } /** @@ -159,29 +143,6 @@ public class PlatformStrategyFactory { return strategy; } - /** - * 根据机巢SN获取对应的平台系统管理器 - * - * @param airportSn 机巢序列号 - * @return 对应平台的AirportSystemManager实现 - */ - public AirportSystemManager getSystemManager(String airportSn) { - PlatformType platformType = airportPlatformRepository.getPlatformType(airportSn); - - if (platformType == null) { - throw new IllegalArgumentException( - String.format("机巢未注册或平台类型未配置: %s", airportSn)); - } - - AirportSystemManager manager = managerMap.get(platformType); - - if (manager == null) { - throw new IllegalArgumentException( - String.format("未找到平台系统管理器: %s (机巢: %s)", platformType.getName(), airportSn)); - } - - return manager; - } /** * 根据平台类型获取机巢平台策略