# 设备逻辑处理器架构说明 ## 架构概述 采用**策略模式 + 工厂模式**实现设备逻辑处理,支持不同设备类型的差异化逻辑处理。 ## 目录结构 ``` com.mes.interaction/ ├── DeviceLogicHandler.java # 处理器接口 ├── BaseDeviceLogicHandler.java # 基础抽象类 ├── DeviceLogicHandlerFactory.java # 工厂类 └── impl/ ├── LoadVehicleLogicHandler.java # 上大车逻辑处理器 ├── LargeGlassLogicHandler.java # 大理片逻辑处理器 └── GlassStorageLogicHandler.java # 玻璃存储逻辑处理器 ``` ## 核心概念 ### 1. 参数配置(extraParams.deviceLogic) 设备逻辑参数存储在 `DeviceConfig.extraParams` 的 `deviceLogic` 节点中: ```json { "connectionConfig": { ... }, "plcConfig": { ... }, "deviceLogic": { "vehicleCapacity": 6000, "glassIntervalMs": 1000, "autoFeed": true, "positionMapping": { "POS1": 1, "POS2": 2 } } } ``` ### 2. 执行流程 ``` 用户调用接口 ↓ Service 层获取设备配置(包含 extraParams) ↓ Factory 根据 deviceType 选择对应的 Handler ↓ Handler 从 extraParams.deviceLogic 读取配置参数 ↓ Handler 根据配置参数和运行时参数执行逻辑 ↓ 调用 DevicePlcOperationService.writeFields() 写入PLC ``` ## 使用方式 ### 方式1:通过 DeviceInteractionService(推荐) ```java @Autowired private DeviceInteractionService deviceInteractionService; // 执行操作 Map params = new HashMap<>(); params.put("glassIds", Arrays.asList("GLS001", "GLS002")); params.put("positionCode", "POS1"); OperationResult result = deviceInteractionService.executeOperation( deviceId, "feedGlass", params ); ``` ### 方式2:直接使用 Handler ```java @Autowired private DeviceLogicHandlerFactory handlerFactory; @Autowired private DeviceConfigService deviceConfigService; // 获取设备和处理器 DeviceConfig device = deviceConfigService.getDeviceById(deviceId); DeviceLogicHandler handler = handlerFactory.getHandler(device.getDeviceType()); // 执行操作 Map params = new HashMap<>(); params.put("glassIds", Arrays.asList("GLS001")); OperationResult result = handler.execute(device, "feedGlass", params); ``` ## 支持的操作类型 ### 上大车(LoadVehicleLogicHandler) - `feedGlass` - 玻璃上料 - `triggerRequest` - 触发请求 - `triggerReport` - 触发汇报 - `reset` - 重置 ### 大理片(LargeGlassLogicHandler) - `processGlass` - 玻璃加工 - `triggerRequest` - 触发请求 - `triggerReport` - 触发汇报 - `reset` - 重置 ### 玻璃存储(GlassStorageLogicHandler) - `storeGlass` - 存储玻璃 - `retrieveGlass` - 取货 - `triggerRequest` - 触发请求 - `triggerReport` - 触发汇报 - `reset` - 重置 ## 扩展新设备类型 ### 步骤1:创建处理器类 ```java @Component public class NewDeviceLogicHandler extends BaseDeviceLogicHandler { public NewDeviceLogicHandler(DevicePlcOperationService devicePlcOperationService) { super(devicePlcOperationService); } @Override public String getDeviceType() { return "新设备类型"; } @Override protected OperationResult doExecute(...) { // 实现具体逻辑 } } ``` ### 步骤2:在 DeviceConfig.DeviceType 中添加常量 ```java public static final String NEW_DEVICE = "新设备类型"; ``` ### 步骤3:配置默认参数 实现 `getDefaultLogicParams()` 方法,返回默认的JSON配置。 ## 参数说明 ### 配置参数(从 extraParams.deviceLogic 读取) - 静态配置,在设备配置时设置 - 存储在数据库中 - 示例:vehicleCapacity, glassIntervalMs ### 运行时参数(从方法参数传入) - 动态参数,每次调用时传入 - 示例:glassIds, positionCode ## 注意事项 1. **参数验证**:每个 Handler 实现 `validateLogicParams()` 方法进行参数验证 2. **默认值处理**:使用 `getLogicParam()` 方法获取参数,支持默认值 3. **错误处理**:所有异常都会被捕获并返回 `OperationResult` 4. **向后兼容**:保留了原有的 `feedGlass()` 方法,优先使用新架构,失败时降级到旧逻辑