ValidateMaterialStep.java 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. package com.mes.step;
  2. import com.mes.core.StationContext;
  3. import com.mes.tcp.MessageSender;
  4. import com.mes.ui.component.WorkstationPanel;
  5. /**
  6. * 物料校验步骤
  7. * 发送VLDW消息校验物料(底护板、冷板等)是否可用
  8. * 校验失败后自动重新弹出扫码框
  9. */
  10. public class ValidateMaterialStep extends AbstractStep {
  11. private MessageSender messageSender;
  12. private WorkstationPanel panel; // 工位面板引用
  13. public ValidateMaterialStep() {
  14. super("validate_material", "物料校验");
  15. this.messageType = "VLDW";
  16. this.async = true; // 需要等待服务端响应
  17. this.requiresUserInteraction = false;
  18. this.craft = "400004"; // 默认工艺号
  19. }
  20. public void setMessageSender(MessageSender messageSender) {
  21. this.messageSender = messageSender;
  22. }
  23. /**
  24. * 设置工位面板引用(用于弹出扫码框)
  25. */
  26. public void setPanel(WorkstationPanel panel) {
  27. this.panel = panel;
  28. }
  29. @Override
  30. public boolean execute(StationContext context) {
  31. String productSn = context.getProcessedProductSn();
  32. String materialSn = context.getMaterialSn();
  33. if (productSn == null || productSn.isEmpty()) {
  34. log.error("[{}] 物料校验失败: 工件码为空", context.getStationCode());
  35. return false;
  36. }
  37. if (materialSn == null || materialSn.isEmpty()) {
  38. log.error("[{}] 物料校验失败: 物料码为空", context.getStationCode());
  39. return false;
  40. }
  41. context.setStatusMessage("正在校验物料...", 0);
  42. log.info("[{}] 发送物料校验: product={}, material={}, craft={}",
  43. context.getStationCode(), productSn, materialSn, craft);
  44. // 发送校验消息
  45. if (messageSender != null) {
  46. return messageSender.sendValidateMaterial(
  47. productSn,
  48. materialSn,
  49. context.getUser(),
  50. craft,
  51. context.getStationCode()
  52. );
  53. } else {
  54. log.error("[{}] MessageSender未设置", context.getStationCode());
  55. return false;
  56. }
  57. }
  58. @Override
  59. public void onServerResponse(StationContext context, String result, String message) {
  60. if ("OK".equalsIgnoreCase(result)) {
  61. context.setMaterialValidated(true);
  62. context.setStatusMessage("物料校验通过", 0);
  63. log.info("[{}] 物料校验通过", context.getStationCode());
  64. onSuccess(context);
  65. } else {
  66. context.setMaterialValidated(false);
  67. context.setMaterialSn(null); // 清空物料码
  68. String errorMsg = getErrorMessage(result, message);
  69. context.setStatusMessage(errorMsg, -1);
  70. log.warn("[{}] 物料校验失败: {}", context.getStationCode(), errorMsg);
  71. // 校验失败后自动重新弹出扫码框
  72. if (panel != null) {
  73. log.info("[{}] 物料校验失败,自动重新弹出扫码框", context.getStationCode());
  74. javax.swing.SwingUtilities.invokeLater(() -> panel.requestMaterialScan());
  75. }
  76. onFailure(context, errorMsg);
  77. }
  78. }
  79. @Override
  80. protected String getErrorMessage(String resultCode, String message) {
  81. switch (resultCode.toUpperCase()) {
  82. case "NE":
  83. return "物料不存在";
  84. case "US":
  85. return "物料已被使用";
  86. case "EX":
  87. return "物料已过期";
  88. case "NM":
  89. return "物料不匹配";
  90. default:
  91. return "物料校验失败: " + resultCode;
  92. }
  93. }
  94. @Override
  95. public boolean canExecute(StationContext context) {
  96. return context.isQualityPassed() &&
  97. context.getMaterialSn() != null &&
  98. !context.getMaterialSn().isEmpty();
  99. }
  100. }