package com.mes.step; import com.mes.core.StationContext; import com.mes.tcp.MessageSender; import com.mes.ui.component.WorkstationPanel; /** * 物料校验步骤 * 发送VLDW消息校验物料(底护板、冷板等)是否可用 * 校验失败后自动重新弹出扫码框 */ public class ValidateMaterialStep extends AbstractStep { private MessageSender messageSender; private WorkstationPanel panel; // 工位面板引用 public ValidateMaterialStep() { super("validate_material", "物料校验"); this.messageType = "VLDW"; this.async = true; // 需要等待服务端响应 this.requiresUserInteraction = false; this.craft = "400004"; // 默认工艺号 } public void setMessageSender(MessageSender messageSender) { this.messageSender = messageSender; } /** * 设置工位面板引用(用于弹出扫码框) */ public void setPanel(WorkstationPanel panel) { this.panel = panel; } @Override public boolean execute(StationContext context) { String productSn = context.getProcessedProductSn(); String materialSn = context.getMaterialSn(); if (productSn == null || productSn.isEmpty()) { log.error("[{}] 物料校验失败: 工件码为空", context.getStationCode()); return false; } if (materialSn == null || materialSn.isEmpty()) { log.error("[{}] 物料校验失败: 物料码为空", context.getStationCode()); return false; } context.setStatusMessage("正在校验物料...", 0); log.info("[{}] 发送物料校验: product={}, material={}, craft={}", context.getStationCode(), productSn, materialSn, craft); // 发送校验消息 if (messageSender != null) { return messageSender.sendValidateMaterial( productSn, materialSn, context.getUser(), craft, context.getStationCode() ); } else { log.error("[{}] MessageSender未设置", context.getStationCode()); return false; } } @Override public void onServerResponse(StationContext context, String result, String message) { if ("OK".equalsIgnoreCase(result)) { context.setMaterialValidated(true); context.setStatusMessage("物料校验通过", 0); log.info("[{}] 物料校验通过", context.getStationCode()); onSuccess(context); } else { context.setMaterialValidated(false); context.setMaterialSn(null); // 清空物料码 String errorMsg = getErrorMessage(result, message); context.setStatusMessage(errorMsg, -1); log.warn("[{}] 物料校验失败: {}", context.getStationCode(), errorMsg); // 校验失败后自动重新弹出扫码框 if (panel != null) { log.info("[{}] 物料校验失败,自动重新弹出扫码框", context.getStationCode()); javax.swing.SwingUtilities.invokeLater(() -> panel.requestMaterialScan()); } onFailure(context, errorMsg); } } @Override protected String getErrorMessage(String resultCode, String message) { switch (resultCode.toUpperCase()) { case "NE": return "物料不存在"; case "US": return "物料已被使用"; case "EX": return "物料已过期"; case "NM": return "物料不匹配"; default: return "物料校验失败: " + resultCode; } } @Override public boolean canExecute(StationContext context) { return context.isQualityPassed() && context.getMaterialSn() != null && !context.getMaterialSn().isEmpty(); } }