修改代码结构

This commit is contained in:
孙小云 2025-12-16 16:00:14 +08:00
parent ef057bb526
commit 092043895c
62 changed files with 107 additions and 438 deletions

View File

@ -1,6 +1,6 @@
package com.tuoheng.machine.demo;
import com.tuoheng.machine.manager.AirportSystemManager;
import com.tuoheng.machine.manager.ISystemManager;
import com.tuoheng.machine.manager.factory.AirportSystemManagerFactory;
import com.tuoheng.machine.platform.factory.PlatformStrategyFactory;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
@ -34,7 +34,7 @@ public class MultiPlatformDemo {
System.out.println("1. DJI机巢上线: " + djiAirport);
System.out.println(" 平台类型: " + strategyFactory.getPlatformType(djiAirport).getName());
AirportSystemManager djiManager = managerFactory.getManager(djiAirport);
ISystemManager djiManager = managerFactory.getManager(djiAirport);
djiManager.airportOnline(djiAirport);
System.out.println(" " + djiManager.getFullStatus(djiAirport));
System.out.println();

View File

@ -1,9 +1,10 @@
package com.tuoheng.machine.platform.impl.dji;
package com.tuoheng.machine.impl.dji;
import com.tuoheng.machine.events.AirportEvent;
import com.tuoheng.machine.platform.impl.dji.action.airport.*;
import com.tuoheng.machine.platform.impl.dji.guard.airport.*;
import com.tuoheng.machine.platform.impl.dji.listener.DjiAirportListener;
import com.tuoheng.machine.impl.dji.action.airport.*;
import com.tuoheng.machine.impl.dji.guard.airport.*;
import com.tuoheng.machine.impl.dji.listener.DjiAirportListener;
import com.tuoheng.machine.platform.PlatformType;
import com.tuoheng.machine.platform.strategy.AirportPlatformStrategy;
import com.tuoheng.machine.platform.strategy.PlatformAction;

View File

@ -1,9 +1,9 @@
package com.tuoheng.machine.platform.impl.dji;
package com.tuoheng.machine.impl.dji;
import com.tuoheng.machine.events.AirportEvent;
import com.tuoheng.machine.events.CoverEvent;
import com.tuoheng.machine.manager.AbstractAirportSystemManager;
import com.tuoheng.machine.manager.AbsSystemManager;
import com.tuoheng.machine.platform.PlatformType;
import com.tuoheng.machine.status.AirportState;
import com.tuoheng.machine.status.CoverState;
@ -15,7 +15,7 @@ import org.springframework.stereotype.Component;
*/
@Component
@Slf4j
public class DjiAirportSystemManager extends AbstractAirportSystemManager {
public class DjiAirportSystemManager extends AbsSystemManager {
@Override
public PlatformType getPlatformType() {

View File

@ -1,12 +1,13 @@
package com.tuoheng.machine.platform.impl.dji;
package com.tuoheng.machine.impl.dji;
import com.tuoheng.machine.events.CoverEvent;
import com.tuoheng.machine.platform.impl.dji.action.cover.*;
import com.tuoheng.machine.platform.impl.dji.guard.cover.DjiCanCloseCoverGuard;
import com.tuoheng.machine.platform.impl.dji.guard.cover.DjiCanOpenCoverGuard;
import com.tuoheng.machine.platform.impl.dji.guard.cover.DjiIsCoverClosedGuard;
import com.tuoheng.machine.platform.impl.dji.guard.cover.DjiIsCoverOpenedGuard;
import com.tuoheng.machine.platform.impl.dji.listener.DjiCoverListener;
import com.tuoheng.machine.impl.dji.action.cover.*;
import com.tuoheng.machine.impl.dji.guard.cover.DjiCanCloseCoverGuard;
import com.tuoheng.machine.impl.dji.guard.cover.DjiCanOpenCoverGuard;
import com.tuoheng.machine.impl.dji.guard.cover.DjiIsCoverClosedGuard;
import com.tuoheng.machine.impl.dji.guard.cover.DjiIsCoverOpenedGuard;
import com.tuoheng.machine.impl.dji.listener.DjiCoverListener;
import com.tuoheng.machine.platform.PlatformType;
import com.tuoheng.machine.platform.strategy.CoverPlatformStrategy;
import com.tuoheng.machine.platform.strategy.PlatformAction;

View File

@ -1,14 +1,14 @@
package com.tuoheng.machine.platform.impl.dji;
package com.tuoheng.machine.impl.dji;
import com.tuoheng.machine.events.DrcEvent;
import com.tuoheng.machine.platform.PlatformType;
import com.tuoheng.machine.platform.impl.dji.action.drc.DjiEnterAction;
import com.tuoheng.machine.platform.impl.dji.action.drc.DjiEnteredAction;
import com.tuoheng.machine.platform.impl.dji.action.drc.DjiExitAction;
import com.tuoheng.machine.platform.impl.dji.action.drc.DjiExitedAction;
import com.tuoheng.machine.platform.impl.dji.guard.drc.DjiCanEnterGuard;
import com.tuoheng.machine.platform.impl.dji.guard.drc.DjiCanExitGuard;
import com.tuoheng.machine.platform.impl.dji.listener.DjiDrcListener;
import com.tuoheng.machine.impl.dji.action.drc.DjiEnterAction;
import com.tuoheng.machine.impl.dji.action.drc.DjiEnteredAction;
import com.tuoheng.machine.impl.dji.action.drc.DjiExitAction;
import com.tuoheng.machine.impl.dji.action.drc.DjiExitedAction;
import com.tuoheng.machine.impl.dji.guard.drc.DjiCanEnterGuard;
import com.tuoheng.machine.impl.dji.guard.drc.DjiCanExitGuard;
import com.tuoheng.machine.impl.dji.listener.DjiDrcListener;
import com.tuoheng.machine.platform.strategy.DrcPlatformStrategy;
import com.tuoheng.machine.platform.strategy.PlatformAction;
import com.tuoheng.machine.platform.strategy.PlatformGuard;

View File

@ -1,10 +1,11 @@
package com.tuoheng.machine.platform.impl.dji;
package com.tuoheng.machine.impl.dji;
import com.tuoheng.machine.events.DroneEvent;
import com.tuoheng.machine.impl.dji.action.drone.*;
import com.tuoheng.machine.platform.PlatformType;
import com.tuoheng.machine.platform.impl.dji.action.drone.*;
import com.tuoheng.machine.platform.impl.dji.guard.drone.DjiCanPointGuard;
import com.tuoheng.machine.platform.impl.dji.listener.DjiDroneListener;
import com.tuoheng.machine.impl.dji.guard.drone.DjiCanPointGuard;
import com.tuoheng.machine.impl.dji.listener.DjiDroneListener;
import com.tuoheng.machine.platform.strategy.DronePlatformStrategy;
import com.tuoheng.machine.platform.strategy.PlatformAction;
import com.tuoheng.machine.platform.strategy.PlatformGuard;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.airport;
package com.tuoheng.machine.impl.dji.action.airport;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.airport;
package com.tuoheng.machine.impl.dji.action.airport;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.airport;
package com.tuoheng.machine.impl.dji.action.airport;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.airport;
package com.tuoheng.machine.impl.dji.action.airport;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.airport;
package com.tuoheng.machine.impl.dji.action.airport;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.airport;
package com.tuoheng.machine.impl.dji.action.airport;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.cover;
package com.tuoheng.machine.impl.dji.action.cover;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.cover;
package com.tuoheng.machine.impl.dji.action.cover;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.cover;
package com.tuoheng.machine.impl.dji.action.cover;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.cover;
package com.tuoheng.machine.impl.dji.action.cover;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.cover;
package com.tuoheng.machine.impl.dji.action.cover;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.cover;
package com.tuoheng.machine.impl.dji.action.cover;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drc;
package com.tuoheng.machine.impl.dji.action.drc;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drc;
package com.tuoheng.machine.impl.dji.action.drc;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drc;
package com.tuoheng.machine.impl.dji.action.drc;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drc;
package com.tuoheng.machine.impl.dji.action.drc;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drone;
package com.tuoheng.machine.impl.dji.action.drone;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drone;
package com.tuoheng.machine.impl.dji.action.drone;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drone;
package com.tuoheng.machine.impl.dji.action.drone;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drone;
package com.tuoheng.machine.impl.dji.action.drone;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drone;
package com.tuoheng.machine.impl.dji.action.drone;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drone;
package com.tuoheng.machine.impl.dji.action.drone;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drone;
package com.tuoheng.machine.impl.dji.action.drone;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drone;
package com.tuoheng.machine.impl.dji.action.drone;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drone;
package com.tuoheng.machine.impl.dji.action.drone;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drone;
package com.tuoheng.machine.impl.dji.action.drone;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drone;
package com.tuoheng.machine.impl.dji.action.drone;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drone;
package com.tuoheng.machine.impl.dji.action.drone;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drone;
package com.tuoheng.machine.impl.dji.action.drone;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drone;
package com.tuoheng.machine.impl.dji.action.drone;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drone;
package com.tuoheng.machine.impl.dji.action.drone;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drone;
package com.tuoheng.machine.impl.dji.action.drone;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.action.drone;
package com.tuoheng.machine.impl.dji.action.drone;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.guard.airport;
package com.tuoheng.machine.impl.dji.guard.airport;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.guard.airport;
package com.tuoheng.machine.impl.dji.guard.airport;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.guard.airport;
package com.tuoheng.machine.impl.dji.guard.airport;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.guard.airport;
package com.tuoheng.machine.impl.dji.guard.airport;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.guard.airport;
package com.tuoheng.machine.impl.dji.guard.airport;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.guard.airport;
package com.tuoheng.machine.impl.dji.guard.airport;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.guard.cover;
package com.tuoheng.machine.impl.dji.guard.cover;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.guard.cover;
package com.tuoheng.machine.impl.dji.guard.cover;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.guard.cover;
package com.tuoheng.machine.impl.dji.guard.cover;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.guard.cover;
package com.tuoheng.machine.impl.dji.guard.cover;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.guard.drc;
package com.tuoheng.machine.impl.dji.guard.drc;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.guard.drc;
package com.tuoheng.machine.impl.dji.guard.drc;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.guard.drone;
package com.tuoheng.machine.impl.dji.guard.drone;
import lombok.extern.slf4j.Slf4j;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.listener;
package com.tuoheng.machine.impl.dji.listener;
import com.tuoheng.machine.listener.DefaultAirportListener;
import org.springframework.stereotype.Component;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.listener;
package com.tuoheng.machine.impl.dji.listener;
import com.tuoheng.machine.listener.DefaultCoverListener;
import org.springframework.stereotype.Component;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.listener;
package com.tuoheng.machine.impl.dji.listener;
import com.tuoheng.machine.listener.DefaultDrcListener;
import org.springframework.stereotype.Component;

View File

@ -1,4 +1,4 @@
package com.tuoheng.machine.platform.impl.dji.listener;
package com.tuoheng.machine.impl.dji.listener;
import com.tuoheng.machine.listener.DefaultDroneListener;
import org.springframework.stereotype.Component;

View File

@ -22,7 +22,7 @@ import org.springframework.beans.factory.annotation.Autowired;
* 提供通用的业务编排能力具体实现可按需扩展
*/
@Slf4j
public abstract class AbstractAirportSystemManager implements AirportSystemManager {
public abstract class AbsSystemManager implements ISystemManager {
/**
* 子类需要声明自己支持的平台类型

View File

@ -1,7 +1,5 @@
package com.tuoheng.machine.manager;
import lombok.extern.slf4j.Slf4j;
import com.tuoheng.machine.events.AirportEvent;
import com.tuoheng.machine.events.CoverEvent;
import com.tuoheng.machine.events.DroneEvent;
@ -16,7 +14,7 @@ import com.tuoheng.machine.status.DrcState;
* 机巢系统管理器接口
* 抽象对外能力便于后续扩展不同实现
*/
public interface AirportSystemManager {
public interface ISystemManager {
/**
* 该Manager对应的平台类型

View File

@ -1,8 +1,8 @@
package com.tuoheng.machine.manager.factory;
import com.tuoheng.machine.manager.AirportSystemManager;
import com.tuoheng.machine.manager.ISystemManager;
import com.tuoheng.machine.platform.PlatformType;
import com.tuoheng.machine.repository.AirportPlatformRepository;
import com.tuoheng.machine.repository.MachinePlatTypeRepository;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@ -20,22 +20,22 @@ import java.util.concurrent.ConcurrentHashMap;
public class AirportSystemManagerFactory {
@Autowired
private AirportPlatformRepository airportPlatformRepository;
private MachinePlatTypeRepository machinePlatTypeRepository;
/**
* 存储所有平台的系统管理器实现
* Key: PlatformType
* Value: AirportSystemManager实现
*/
private final Map<PlatformType, AirportSystemManager> managerMap = new ConcurrentHashMap<>();
private final Map<PlatformType, ISystemManager> managerMap = new ConcurrentHashMap<>();
/**
* 注册所有系统管理器
* Spring会自动注入所有实现了AirportSystemManager的Bean
*/
@Autowired
public void registerManagers(List<AirportSystemManager> managers) {
for (AirportSystemManager manager : managers) {
public void registerManagers(List<ISystemManager> managers) {
for (ISystemManager manager : managers) {
managerMap.put(manager.getPlatformType(), manager);
log.info("注册系统管理器: {} -> {}",
manager.getPlatformType().getName(), manager.getClass().getSimpleName());
@ -49,15 +49,15 @@ public class AirportSystemManagerFactory {
* @return 对应平台的AirportSystemManager实现
* @throws IllegalArgumentException 如果机巢未注册或系统管理器不存在
*/
public AirportSystemManager getManager(String airportSn) {
PlatformType platformType = airportPlatformRepository.getPlatformType(airportSn);
public ISystemManager getManager(String airportSn) {
PlatformType platformType = machinePlatTypeRepository.getPlatformType(airportSn);
if (platformType == null) {
throw new IllegalArgumentException(
String.format("机巢未注册或平台类型未配置: %s", airportSn));
}
AirportSystemManager manager = managerMap.get(platformType);
ISystemManager manager = managerMap.get(platformType);
if (manager == null) {
throw new IllegalArgumentException(
@ -73,7 +73,7 @@ public class AirportSystemManagerFactory {
* @param platformType 平台类型
* @return 对应平台的AirportSystemManager实现
*/
public AirportSystemManager getManagerByType(PlatformType platformType) {
public ISystemManager getManagerByType(PlatformType platformType) {
return managerMap.get(platformType);
}
}

View File

@ -1,7 +1,7 @@
package com.tuoheng.machine.platform.factory;
import com.tuoheng.machine.platform.PlatformType;
import com.tuoheng.machine.repository.AirportPlatformRepository;
import com.tuoheng.machine.repository.MachinePlatTypeRepository;
import com.tuoheng.machine.platform.strategy.AirportPlatformStrategy;
import com.tuoheng.machine.platform.strategy.CoverPlatformStrategy;
import com.tuoheng.machine.platform.strategy.DronePlatformStrategy;
@ -23,7 +23,7 @@ import java.util.concurrent.ConcurrentHashMap;
public class PlatformStrategyFactory {
@Autowired
private AirportPlatformRepository airportPlatformRepository;
private MachinePlatTypeRepository machinePlatTypeRepository;
/**
* 存储所有机巢平台策略实现
@ -102,7 +102,7 @@ public class PlatformStrategyFactory {
*/
public AirportPlatformStrategy getAirportStrategy(String airportSn) {
// 从数据库查询平台类型
PlatformType platformType = airportPlatformRepository.getPlatformType(airportSn);
PlatformType platformType = machinePlatTypeRepository.getPlatformType(airportSn);
if (platformType == null) {
throw new IllegalArgumentException(
@ -128,7 +128,7 @@ public class PlatformStrategyFactory {
*/
public CoverPlatformStrategy getCoverStrategy(String airportSn) {
// 从数据库查询平台类型
PlatformType platformType = airportPlatformRepository.getPlatformType(airportSn);
PlatformType platformType = machinePlatTypeRepository.getPlatformType(airportSn);
if (platformType == null) {
throw new IllegalArgumentException(
@ -175,7 +175,7 @@ public class PlatformStrategyFactory {
*/
public DronePlatformStrategy getDroneStrategy(String droneSn) {
// 从数据库查询平台类型
PlatformType platformType = airportPlatformRepository.getPlatformType(droneSn);
PlatformType platformType = machinePlatTypeRepository.getPlatformType(droneSn);
if (platformType == null) {
throw new IllegalArgumentException(
@ -211,7 +211,7 @@ public class PlatformStrategyFactory {
*/
public DrcPlatformStrategy getDrcStrategy(String airportSn) {
// 从数据库查询平台类型
PlatformType platformType = airportPlatformRepository.getPlatformType(airportSn);
PlatformType platformType = machinePlatTypeRepository.getPlatformType(airportSn);
if (platformType == null) {
throw new IllegalArgumentException(
@ -245,6 +245,6 @@ public class PlatformStrategyFactory {
* @return 平台类型
*/
public PlatformType getPlatformType(String airportSn) {
return airportPlatformRepository.getPlatformType(airportSn);
return machinePlatTypeRepository.getPlatformType(airportSn);
}
}

View File

@ -13,7 +13,7 @@ import java.util.concurrent.ConcurrentHashMap;
*/
@Slf4j
@Repository
public class AirportPlatformRepository {
public class MachinePlatTypeRepository {
/**
* 模拟数据库存储
@ -25,7 +25,7 @@ public class AirportPlatformRepository {
/**
* 初始化一些测试数据
*/
public AirportPlatformRepository() {
public MachinePlatTypeRepository() {
// 模拟数据库中的数据
airportPlatformMap.put("airport-001", PlatformType.DJI);
airportPlatformMap.put("airport-002", PlatformType.DJI);

View File

@ -1,11 +1,10 @@
package com.tuoheng.machine;
import com.tuoheng.machine.events.DrcEvent;
import com.tuoheng.machine.platform.PlatformType;
import com.tuoheng.machine.platform.factory.PlatformStrategyFactory;
import com.tuoheng.machine.repository.AirportPlatformRepository;
import com.tuoheng.machine.repository.MachinePlatTypeRepository;
import com.tuoheng.machine.service.DrcMachineService;
import com.tuoheng.machine.status.DrcState;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@ -20,6 +19,7 @@ import static org.mockito.Mockito.when;
* 测试DRC模式的完整状态转换流程
*/
@SpringBootTest
@Slf4j
public class DrcStateMachineTest {
@Autowired
@ -29,7 +29,7 @@ public class DrcStateMachineTest {
private PlatformStrategyFactory platformStrategyFactory;
@MockBean
private AirportPlatformRepository airportPlatformRepository;
private MachinePlatTypeRepository machinePlatTypeRepository;
private static final String TEST_AIRPORT_SN = "test-airport-001";
@ -38,347 +38,15 @@ public class DrcStateMachineTest {
*/
@Test
public void testAutowiredInjection() {
System.out.println("\n========== 测试依赖注入 ==========");
// 验证 PlatformStrategyFactory 是否成功注入
assertNotNull(platformStrategyFactory, "PlatformStrategyFactory 应该被成功注入");
System.out.println("✓ PlatformStrategyFactory 注入成功: " + platformStrategyFactory.getClass().getName());
// 验证 DrcMachineService 是否成功注入
assertNotNull(drcMachineService, "DrcMachineService 应该被成功注入");
System.out.println("✓ DrcMachineService 注入成功: " + drcMachineService.getClass().getName());
// 验证 AirportPlatformRepository Mock 是否成功
assertNotNull(airportPlatformRepository, "AirportPlatformRepository Mock 应该被成功创建");
System.out.println("✓ AirportPlatformRepository Mock 创建成功");
assertNotNull(machinePlatTypeRepository, "AirportPlatformRepository Mock 应该被成功创建");
// 配置 Mock 行为
when(airportPlatformRepository.getPlatformType(anyString())).thenReturn(PlatformType.DJI);
// 测试 Mock 是否工作
PlatformType platformType = airportPlatformRepository.getPlatformType(TEST_AIRPORT_SN);
assertEquals(PlatformType.DJI, platformType, "Mock 应该返回 DJI 平台类型");
System.out.println("✓ Mock 行为配置成功,返回平台类型: " + platformType.getName());
System.out.println("\n========== 依赖注入测试通过 ✓ ==========\n");
}
// private DrcMachineService drcMachineService;
// private PlatformStrategyFactory platformStrategyFactory;
// private AnnotationConfigApplicationContext context;
//
// private static final String TEST_AIRPORT_SN = "test-airport-001";
//
// /**
// * 测试配置类
// */
// @Configuration
// static class TestConfig {
// @Bean
// public RedisStateStore redisStateStore() {
// return new RedisStateStore();
// }
//
// @Bean
// public DjiCanEnterGuard djiCanEnterGuard() {
// return new DjiCanEnterGuard();
// }
//
// @Bean
// public DjiCanExitGuard djiCanExitGuard() {
// return new DjiCanExitGuard();
// }
//
// @Bean
// public DjiEnterAction djiEnterAction() {
// return new DjiEnterAction();
// }
//
// @Bean
// public DjiEnteredAction djiEnteredAction() {
// return new DjiEnteredAction();
// }
//
// @Bean
// public DjiExitAction djiExitAction() {
// return new DjiExitAction();
// }
//
// @Bean
// public DjiExitedAction djiExitedAction() {
// return new DjiExitedAction();
// }
//
// @Bean
// public DjiDrcListener djiDrcListener() {
// return new DjiDrcListener();
// }
//
// @Bean
// public DjiDrcPlatformStrategy djiDrcPlatformStrategy() {
// return new DjiDrcPlatformStrategy();
// }
//
// @Bean
// public AirportPlatformRepository airportPlatformRepository() {
// // Mock实现返回DJI平台类型
// return new AirportPlatformRepository() {
// @Override
// public PlatformType getPlatformType(String sn) {
// return PlatformType.DJI;
// }
//
// @Override
// public void registerAirport(String sn, PlatformType platformType) {
// }
// };
// }
//
// @Bean
// public PlatformStrategyFactory platformStrategyFactory() {
// return new PlatformStrategyFactory();
// }
//
// @Bean
// public DrcMachineConfig drcMachineConfig() {
// return new DrcMachineConfig();
// }
//
// @Bean
// public DrcMachineService drcMachineService() {
// return new DrcMachineService();
// }
// }
//
// @Override
// protected void setUp() throws Exception {
// super.setUp();
// System.out.println("========== 开始DRC状态机测试 ==========");
//
// // 初始化Spring上下文
// context = new AnnotationConfigApplicationContext(TestConfig.class);
// drcMachineService = context.getBean(DrcMachineService.class);
// platformStrategyFactory = context.getBean(PlatformStrategyFactory.class);
// }
//
// @Override
// protected void tearDown() throws Exception {
// if (context != null) {
// context.close();
// }
// super.tearDown();
// }
//
// /**
// * 测试DRC状态机的完整流程
// * UNKNOWN -> EXITED -> ENTERING -> ENTERED -> EXITING -> EXITED
// */
// @Test
// public void testDrcCompleteFlow() {
// System.out.println("\n========== 测试DRC完整流程 ==========");
//
// // 1. 初始状态应该是 UNKNOWN
// DrcState initialState = drcMachineService.getCurrentState(TEST_AIRPORT_SN);
// assertNotNull("状态机应该已创建", initialState);
// assertEquals("初始状态应该是UNKNOWN", DrcState.UNKNOWN, initialState);
// System.out.println("✓ 步骤1: 初始状态验证通过 - UNKNOWN");
//
// // 2. UNKNOWN 同步到 EXITED退出状态
// boolean syncResult = drcMachineService.sendEvent(TEST_AIRPORT_SN, DrcEvent.EXITED);
// assertTrue("同步到EXITED应该成功", syncResult);
// assertEquals("当前状态应该是EXITED", DrcState.EXITED,
// drcMachineService.getCurrentState(TEST_AIRPORT_SN));
// System.out.println("✓ 步骤2: UNKNOWN -> EXITED 转换成功");
//
// // 3. 进入DRC模式EXITED -> ENTERING
// boolean enterResult = drcMachineService.sendEvent(TEST_AIRPORT_SN, DrcEvent.ENTER);
// assertTrue("进入DRC模式应该成功", enterResult);
// assertEquals("当前状态应该是ENTERING", DrcState.ENTERING,
// drcMachineService.getCurrentState(TEST_AIRPORT_SN));
// System.out.println("✓ 步骤3: EXITED -> ENTERING 转换成功");
//
// // 4. 进入完成ENTERING -> ENTERED
// boolean enteredResult = drcMachineService.sendEvent(TEST_AIRPORT_SN, DrcEvent.ENTERED);
// assertTrue("进入完成应该成功", enteredResult);
// assertEquals("当前状态应该是ENTERED", DrcState.ENTERED,
// drcMachineService.getCurrentState(TEST_AIRPORT_SN));
// System.out.println("✓ 步骤4: ENTERING -> ENTERED 转换成功");
//
// // 5. 退出DRC模式ENTERED -> EXITING
// boolean exitResult = drcMachineService.sendEvent(TEST_AIRPORT_SN, DrcEvent.EXIT);
// assertTrue("退出DRC模式应该成功", exitResult);
// assertEquals("当前状态应该是EXITING", DrcState.EXITING,
// drcMachineService.getCurrentState(TEST_AIRPORT_SN));
// System.out.println("✓ 步骤5: ENTERED -> EXITING 转换成功");
//
// // 6. 退出完成EXITING -> EXITED
// boolean exitedResult = drcMachineService.sendEvent(TEST_AIRPORT_SN, DrcEvent.EXITED);
// assertTrue("退出完成应该成功", exitedResult);
// assertEquals("当前状态应该是EXITED", DrcState.EXITED,
// drcMachineService.getCurrentState(TEST_AIRPORT_SN));
// System.out.println("✓ 步骤6: EXITING -> EXITED 转换成功");
//
// System.out.println("\n========== DRC完整流程测试通过 ✓ ==========\n");
// }
//
// /**
// * 测试DRC状态机的循环流程
// * 可以多次进入和退出DRC模式
// */
// @Test
// public void testDrcCycleFlow() {
// System.out.println("\n========== 测试DRC循环流程 ==========");
//
// // 初始化到EXITED状态
// drcMachineService.sendEvent(TEST_AIRPORT_SN, DrcEvent.EXITED);
// assertEquals("初始状态应该是EXITED", DrcState.EXITED,
// drcMachineService.getCurrentState(TEST_AIRPORT_SN));
//
// // 第一次循环进入 -> 退出
// System.out.println("\n--- 第一次循环 ---");
// drcMachineService.sendEvent(TEST_AIRPORT_SN, DrcEvent.ENTER);
// assertEquals("应该进入ENTERING状态", DrcState.ENTERING,
// drcMachineService.getCurrentState(TEST_AIRPORT_SN));
//
// drcMachineService.sendEvent(TEST_AIRPORT_SN, DrcEvent.ENTERED);
// assertEquals("应该进入ENTERED状态", DrcState.ENTERED,
// drcMachineService.getCurrentState(TEST_AIRPORT_SN));
//
// drcMachineService.sendEvent(TEST_AIRPORT_SN, DrcEvent.EXIT);
// assertEquals("应该进入EXITING状态", DrcState.EXITING,
// drcMachineService.getCurrentState(TEST_AIRPORT_SN));
//
// drcMachineService.sendEvent(TEST_AIRPORT_SN, DrcEvent.EXITED);
// assertEquals("应该回到EXITED状态", DrcState.EXITED,
// drcMachineService.getCurrentState(TEST_AIRPORT_SN));
// System.out.println("✓ 第一次循环完成");
//
// // 第二次循环再次进入 -> 退出
// System.out.println("\n--- 第二次循环 ---");
// drcMachineService.sendEvent(TEST_AIRPORT_SN, DrcEvent.ENTER);
// assertEquals("应该再次进入ENTERING状态", DrcState.ENTERING,
// drcMachineService.getCurrentState(TEST_AIRPORT_SN));
//
// drcMachineService.sendEvent(TEST_AIRPORT_SN, DrcEvent.ENTERED);
// assertEquals("应该再次进入ENTERED状态", DrcState.ENTERED,
// drcMachineService.getCurrentState(TEST_AIRPORT_SN));
//
// drcMachineService.sendEvent(TEST_AIRPORT_SN, DrcEvent.EXIT);
// assertEquals("应该再次进入EXITING状态", DrcState.EXITING,
// drcMachineService.getCurrentState(TEST_AIRPORT_SN));
//
// drcMachineService.sendEvent(TEST_AIRPORT_SN, DrcEvent.EXITED);
// assertEquals("应该再次回到EXITED状态", DrcState.EXITED,
// drcMachineService.getCurrentState(TEST_AIRPORT_SN));
// System.out.println("✓ 第二次循环完成");
//
// System.out.println("\n========== DRC循环流程测试通过 ✓ ==========\n");
// }
//
// /**
// * 测试非法状态转换
// * 验证状态机会拒绝不合法的状态转换
// */
// @Test
// public void testInvalidStateTransitions() {
// System.out.println("\n========== 测试非法状态转换 ==========");
//
// // 初始化到EXITED状态
// drcMachineService.sendEvent(TEST_AIRPORT_SN, DrcEvent.EXITED);
// assertEquals("初始状态应该是EXITED", DrcState.EXITED,
// drcMachineService.getCurrentState(TEST_AIRPORT_SN));
//
// // 尝试从EXITED直接到ENTERED应该失败
// boolean invalidResult = drcMachineService.sendEvent(TEST_AIRPORT_SN, DrcEvent.ENTERED);
// assertFalse("从EXITED直接到ENTERED应该失败", invalidResult);
// assertEquals("状态应该保持EXITED", DrcState.EXITED,
// drcMachineService.getCurrentState(TEST_AIRPORT_SN));
// System.out.println("✓ 非法转换被正确拒绝: EXITED -X-> ENTERED");
//
// // 进入ENTERING状态
// drcMachineService.sendEvent(TEST_AIRPORT_SN, DrcEvent.ENTER);
// assertEquals("应该进入ENTERING状态", DrcState.ENTERING,
// drcMachineService.getCurrentState(TEST_AIRPORT_SN));
//
// // 尝试从ENTERING直接到EXITING应该失败
// invalidResult = drcMachineService.sendEvent(TEST_AIRPORT_SN, DrcEvent.EXIT);
// assertFalse("从ENTERING直接到EXITING应该失败", invalidResult);
// assertEquals("状态应该保持ENTERING", DrcState.ENTERING,
// drcMachineService.getCurrentState(TEST_AIRPORT_SN));
// System.out.println("✓ 非法转换被正确拒绝: ENTERING -X-> EXITING");
//
// System.out.println("\n========== 非法状态转换测试通过 ✓ ==========\n");
// }
//
// /**
// * 测试状态机的状态查询功能
// */
// @Test
// public void testStateQuery() {
// System.out.println("\n========== 测试状态查询功能 ==========");
//
// // 初始化到EXITED状态
// drcMachineService.sendEvent(TEST_AIRPORT_SN, DrcEvent.EXITED);
//
// // 测试getCurrentState
// DrcState currentState = drcMachineService.getCurrentState(TEST_AIRPORT_SN);
// assertNotNull("当前状态不应该为null", currentState);
// assertEquals("当前状态应该是EXITED", DrcState.EXITED, currentState);
// System.out.println("✓ getCurrentState() 工作正常");
//
// // 测试getCurrentStates获取状态字符串
// String statesString = drcMachineService.getCurrentStates(TEST_AIRPORT_SN);
// assertNotNull("状态字符串不应该为null", statesString);
// assertTrue("状态字符串应该包含EXITED", statesString.contains("EXITED"));
// System.out.println("✓ getCurrentStates() 工作正常: " + statesString);
//
// // 测试isInState
// boolean isInExited = drcMachineService.isInState(TEST_AIRPORT_SN, DrcState.EXITED);
// assertTrue("应该处于EXITED状态", isInExited);
// System.out.println("✓ isInState() 工作正常");
//
// boolean isInEntered = drcMachineService.isInState(TEST_AIRPORT_SN, DrcState.ENTERED);
// assertFalse("不应该处于ENTERED状态", isInEntered);
// System.out.println("✓ isInState() 负面测试通过");
//
// System.out.println("\n========== 状态查询功能测试通过 ✓ ==========\n");
// }
//
// /**
// * 测试状态机管理功能
// */
// @Test
// public void testStateMachineManagement() {
// System.out.println("\n========== 测试状态机管理功能 ==========");
//
// String testAirport = "test-airport-mgmt";
//
// // 测试状态机创建
// assertFalse("状态机应该不存在", drcMachineService.hasStateMachine(testAirport));
// drcMachineService.getOrCreateStateMachine(testAirport);
// assertTrue("状态机应该已创建", drcMachineService.hasStateMachine(testAirport));
// System.out.println("✓ 状态机创建成功");
//
// // 测试状态机计数
// int count = drcMachineService.getStateMachineCount();
// assertTrue("状态机数量应该大于0", count > 0);
// System.out.println("✓ 状态机计数: " + count);
//
// // 测试状态机重启
// drcMachineService.sendEvent(testAirport, DrcEvent.EXITED);
// assertEquals("状态应该是EXITED", DrcState.EXITED,
// drcMachineService.getCurrentState(testAirport));
//
// drcMachineService.restartStateMachine(testAirport);
// assertEquals("重启后状态应该回到UNKNOWN", DrcState.UNKNOWN,
// drcMachineService.getCurrentState(testAirport));
// System.out.println("✓ 状态机重启成功");
//
// // 测试状态机移除
// drcMachineService.removeStateMachine(testAirport);
// assertFalse("状态机应该已移除", drcMachineService.hasStateMachine(testAirport));
// System.out.println("✓ 状态机移除成功");
//
// System.out.println("\n========== 状态机管理功能测试通过 ✓ ==========\n");
// }
}