ScanProductStep.java 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package com.mes.step;
  2. import com.mes.core.StationContext;
  3. /**
  4. * 扫描工件码步骤
  5. * 等待用户扫描工件码,然后自动进入下一步
  6. */
  7. public class ScanProductStep extends AbstractStep {
  8. public ScanProductStep() {
  9. super("scan_product", "扫描工件码");
  10. this.async = false; // 扫码完成后同步进入下一步
  11. this.requiresUserInteraction = true; // 需要用户扫码
  12. }
  13. @Override
  14. public boolean execute(StationContext context) {
  15. String productSn = context.getProductSn();
  16. if (productSn == null || productSn.trim().isEmpty()) {
  17. log.warn("[{}] 工件码为空,等待用户扫码", context.getStationCode());
  18. context.setStatusMessage("请扫描工件码", 1);
  19. return false;
  20. }
  21. // 处理36位码(取前20位)
  22. String processedSn = productSn.trim();
  23. if (processedSn.length() == 36) {
  24. processedSn = processedSn.substring(0, 20);
  25. log.info("[{}] 36位码处理: {} -> {}", context.getStationCode(), productSn, processedSn);
  26. }
  27. // 保存处理后的工件码
  28. context.setProductSn(processedSn);
  29. context.setState(StationContext.WorkflowState.SCANNING);
  30. context.setStatusMessage("工件码: " + processedSn, 0);
  31. log.info("[{}] 扫描工件码完成: {}", context.getStationCode(), processedSn);
  32. return true;
  33. }
  34. @Override
  35. public void onSuccess(StationContext context) {
  36. super.onSuccess(context);
  37. // 扫码成功,自动进入质量检查
  38. }
  39. @Override
  40. public void onFailure(StationContext context, String error) {
  41. super.onFailure(context, error);
  42. context.setProductSn(null);
  43. }
  44. @Override
  45. public boolean canExecute(StationContext context) {
  46. // 只有在空闲状态才能扫码
  47. return context.getState() == StationContext.WorkflowState.IDLE ||
  48. context.getState() == StationContext.WorkflowState.ERROR;
  49. }
  50. // ========== 流程监控扩展 ==========
  51. @Override
  52. public java.util.List<StepCondition> getConditions(StationContext context) {
  53. java.util.List<StepCondition> conditions = new java.util.ArrayList<>();
  54. boolean stateOk = context.getState() == StationContext.WorkflowState.IDLE ||
  55. context.getState() == StationContext.WorkflowState.ERROR;
  56. conditions.add(condition("state",
  57. "工位状态: " + context.getState() + " (需要 IDLE 或 ERROR)",
  58. stateOk));
  59. boolean hasSn = context.getProductSn() != null && !context.getProductSn().isEmpty();
  60. conditions.add(condition("productSn",
  61. "工件码: " + (hasSn ? context.getProductSn() : "(未扫描)"),
  62. hasSn));
  63. return conditions;
  64. }
  65. @Override
  66. public void simulateSuccess(StationContext context) {
  67. log.info("[{}] 模拟扫码成功", context.getStationCode());
  68. // 如果没有工件码,设置一个模拟的
  69. if (context.getProductSn() == null || context.getProductSn().isEmpty()) {
  70. String mockSn = "MOCK_" + System.currentTimeMillis();
  71. context.setProductSn(mockSn);
  72. log.info("[{}] 设置模拟工件码: {}", context.getStationCode(), mockSn);
  73. }
  74. context.setState(StationContext.WorkflowState.SCANNING);
  75. onSuccess(context);
  76. }
  77. }