编辑 | blame | 历史 | 原始文档

设备逻辑处理器架构说明

架构概述

采用**策略模式 + 工厂模式**实现设备逻辑处理,支持不同设备类型的差异化逻辑处理。

目录结构

com.mes.interaction/
├── DeviceLogicHandler.java              # 处理器接口
├── BaseDeviceLogicHandler.java          # 基础抽象类
├── DeviceLogicHandlerFactory.java       # 工厂类
└── impl/
    ├── LoadVehicleLogicHandler.java     # 上大车逻辑处理器
    ├── LargeGlassLogicHandler.java     # 大理片逻辑处理器
    └── GlassStorageLogicHandler.java   # 玻璃存储逻辑处理器

核心概念

1. 参数配置(extraParams.deviceLogic)

设备逻辑参数存储在 DeviceConfig.extraParamsdeviceLogic 节点中:

{
  "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(推荐)

@Autowired
private DeviceInteractionService deviceInteractionService;

// 执行操作
Map<String, Object> params = new HashMap<>();
params.put("glassIds", Arrays.asList("GLS001", "GLS002"));
params.put("positionCode", "POS1");

OperationResult result = deviceInteractionService.executeOperation(
    deviceId, 
    "feedGlass", 
    params
);

方式2:直接使用 Handler

@Autowired
private DeviceLogicHandlerFactory handlerFactory;
@Autowired
private DeviceConfigService deviceConfigService;

// 获取设备和处理器
DeviceConfig device = deviceConfigService.getDeviceById(deviceId);
DeviceLogicHandler handler = handlerFactory.getHandler(device.getDeviceType());

// 执行操作
Map<String, Object> 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:创建处理器类

@Component
public class NewDeviceLogicHandler extends BaseDeviceLogicHandler {
    
    public NewDeviceLogicHandler(DevicePlcOperationService devicePlcOperationService) {
        super(devicePlcOperationService);
    }
    
    @Override
    public String getDeviceType() {
        return "新设备类型";
    }
    
    @Override
    protected OperationResult doExecute(...) {
        // 实现具体逻辑
    }
}

步骤2:在 DeviceConfig.DeviceType 中添加常量

public static final String NEW_DEVICE = "新设备类型";

步骤3:配置默认参数

实现 getDefaultLogicParams() 方法,返回默认的JSON配置。

参数说明

配置参数(从 extraParams.deviceLogic 读取)

  • 静态配置,在设备配置时设置
  • 存储在数据库中
  • 示例:vehicleCapacity, glassIntervalMs

运行时参数(从方法参数传入)

  • 动态参数,每次调用时传入
  • 示例:glassIds, positionCode

注意事项

  1. 参数验证:每个 Handler 实现 validateLogicParams() 方法进行参数验证
  2. 默认值处理:使用 getLogicParam() 方法获取参数,支持默认值
  3. 错误处理:所有异常都会被捕获并返回 OperationResult
  4. 向后兼容:保留了原有的 feedGlass() 方法,优先使用新架构,失败时降级到旧逻辑