liuwei 1 päivä sitten
vanhempi
commit
f1b788f98a

+ 12 - 18
src/com/mes/component/WorkJPanelOP40.java

@@ -102,6 +102,7 @@ public class WorkJPanelOP40 extends JPanel {
     private Integer lastTjQualityStatus = null;
     private String lastProductSn = null;
     private String lastProductSnFeeding = null;
+    private Boolean lastScanRequest = null;
     public Boolean toDevice = false;
     public Boolean toTransfer = false;
     public Boolean transferToDevice = false;
@@ -430,8 +431,8 @@ public class WorkJPanelOP40 extends JPanel {
         String sn = cacheData.getSn();
         productSn.setText(sn);
 
-        String feedingSn = cacheData.getFeedingSn();
-        productSnFeeding.setText(feedingSn);
+        // 历史的待上料码不能恢复为当前码,避免新请求绕过本轮扫码结果
+        productSnFeeding.setText("");
 
         tjFlag = cacheData.getTjFlag();
         lastSn = cacheData.getLastSn();
@@ -492,6 +493,11 @@ public class WorkJPanelOP40 extends JPanel {
                     if(MesClient.isLogin == 1){
                         Boolean retFeeding = readFeeding();
                         feedinglabel.setIcon(retFeeding?imageGreen:imageGray);
+                        if(retFeeding && !Boolean.TRUE.equals(lastScanRequest) && tjFeedingFlag == 0){
+                            productSnFeeding.setText("");
+                            scanRetryCount = 0;
+                        }
+                        lastScanRequest = retFeeding;
 
                         Boolean retFeedingAllow = readAllowFeeding();
                         feedingmeslabel.setIcon(retFeedingAllow?imageGreen:imageGray);
@@ -702,7 +708,6 @@ public class WorkJPanelOP40 extends JPanel {
         }
         productSnFeeding.setText(sn);
         lastSn = sn;
-        consumeScanSn(sn);
         JSONObject retObj = DataUtil.checkQuality(sn, oprno+pos, MesClient.user_menu.getText());
         if(retObj != null && retObj.get("result") != null
                 && retObj.get("result").toString().equalsIgnoreCase("true")) {
@@ -721,17 +726,6 @@ public class WorkJPanelOP40 extends JPanel {
         }
     }
 
-    private void consumeScanSn(String sn){
-        if(sn == null || sn.isEmpty()){
-            return;
-        }
-        if(isScan == 1 && sn.equals(MesClient.scanSnA)){
-            MesClient.scanSnA = "";
-        }else if(isScan == 2 && sn.equals(MesClient.scanSnB)){
-            MesClient.scanSnB = "";
-        }
-    }
-
     /**
      * 专门给中转车扫码的方法(仅工位F/L使用)
      * 触发摄像头扫码,但码赋值给中转车的productSnFeeding,不影响工位6的状态
@@ -776,11 +770,11 @@ public class WorkJPanelOP40 extends JPanel {
         if(isScan == 1){
             log.info("[{}]触发西侧摄像头扫码(给中转车)", oprno+pos);
 //            sn = MesClient.scanQrcode1();
-            sn = MesClient.scanSnA;
+            sn = MesClient.takeScanCode(1);
         }else{
             log.info("[{}]触发东侧摄像头扫码(给中转车)", oprno+pos);
 //            sn = MesClient.scanQrcode2();
-            sn = MesClient.scanSnB;
+            sn = MesClient.takeScanCode(2);
         }
         log.info("[{}]中转车扫码完成,结果: {}", oprno+pos, sn);
 
@@ -1082,9 +1076,9 @@ public class WorkJPanelOP40 extends JPanel {
                     }
                 }else{
                     if(isScan == 1){
-                        sn = MesClient.scanSnA == null ? "" : MesClient.scanSnA;
+                        sn = MesClient.takeScanCode(1);
                     }else{
-                        sn = MesClient.scanSnB == null ? "" : MesClient.scanSnB;
+                        sn = MesClient.takeScanCode(2);
                     }
                 }
                 log.info("[{}]扫码完成,结果: {}", oprno+pos, sn);

+ 2 - 2
src/com/mes/component/WorkJPanelOP40Transfer.java

@@ -395,10 +395,10 @@ public class WorkJPanelOP40Transfer extends JPanel {
                 if(pos.equals("A")){
                     log.info("[{}]触发西侧摄像头扫码", oprno+pos);
 //                        sn = MesClient.scanQrcode1();
-                    sn = MesClient.scanSnA;
+                    sn = MesClient.takeScanCode(1);
                 }else{
                     log.info("[{}]触发东侧摄像头扫码", oprno+pos);
-                    sn = MesClient.scanSnB;
+                    sn = MesClient.takeScanCode(2);
 //                        sn = MesClient.scanQrcode2();
                 }
             } catch (Exception e) {

+ 57 - 21
src/com/mes/component/WorkJPanelScan.java

@@ -34,8 +34,10 @@ public class WorkJPanelScan extends JPanel {
 
     public String lineSn = "CZ060";
 
-    /** 工件码格式例如 CZ0600016A090001,共 16 位 */
-    public static final int SN_LEN = 16;
+    /** 兼容现场短码、旧码和 24 位 EVE 长码 */
+    public static final int SN_LEN_SHORT = 16;
+    public static final int SN_LEN_LEGACY = 19;
+    public static final int SN_LEN_EVE = 24;
 
     public JLabel feedinglabel;
 
@@ -97,6 +99,9 @@ public class WorkJPanelScan extends JPanel {
 
     public CacheData cacheData = null;
     public String cacheName = "";
+    private Boolean lastScanRequest = null;
+    private boolean scanCompletedForRequest = false;
+    private String manualPendingSn = "";
 
     public WorkJPanelScan(String position){
         this.setLayout(null);
@@ -256,8 +261,8 @@ public class WorkJPanelScan extends JPanel {
 //        String sn = cacheData.getSn();
 //        productSn.setText(sn);
 
-        String feedingSn = cacheData.getFeedingSn();
-        productSnFeeding.setText(feedingSn);
+        // 缓存的码只用于历史追踪,不能恢复为当前扫码结果,否则会被误认为本轮已完成
+        productSnFeeding.setText("");
 
         tjFlag = cacheData.getTjFlag();
         lastSn = cacheData.getLastSn();
@@ -306,15 +311,19 @@ public class WorkJPanelScan extends JPanel {
                         feedingmeslabel.setIcon(retFeedingAllow?imageGreen:imageGray);
 
                         if(retFeeding){
-                            String current = productSnFeeding.getText() == null ? "" : productSnFeeding.getText().trim();
-                            if(isValidSn(current)){
+                            if(!Boolean.TRUE.equals(lastScanRequest)){
+                                startScanRequest();
+                            }
+                            if(scanCompletedForRequest){
                                 writeScanFinish(true);
                             }else{
                                 barCode2();
                             }
                         }else{
+                            scanCompletedForRequest = false;
                             writeScanFinish(false);
                         }
+                        lastScanRequest = retFeeding;
                     }
                 }catch (Exception e) {
                     log.error(e.getMessage());
@@ -323,6 +332,20 @@ public class WorkJPanelScan extends JPanel {
         }, 100,1500);
     }
 
+    private void startScanRequest(){
+        scanCompletedForRequest = false;
+        productSnFeeding.setText("");
+        MesClient.clearScanCode(isScan);
+
+        String pendingSn = manualPendingSn == null ? "" : manualPendingSn.trim();
+        manualPendingSn = "";
+        if(isValidSn(pendingSn)){
+            publishScanResult(pendingSn, "手动录入");
+        }else{
+            setMenuStatus("正在扫码", 0);
+        }
+    }
+
     public void barCode2(){
         String sn = readQrcode();
         if(sn == null){
@@ -333,14 +356,17 @@ public class WorkJPanelScan extends JPanel {
             setMenuStatus("扫码结果为空或格式不符", -1);
             return;
         }
-        if(pos.equals("A")){
-            MesClient.scanSnA = sn;
-        }else{
-            MesClient.scanSnB = sn;
-        }
-        setMenuStatus("扫码成功", 0);
+        publishScanResult(sn, "扫码");
+    }
+
+    private void publishScanResult(String sn, String source){
+        MesClient.publishScanCode(isScan, sn);
         productSnFeeding.setText(sn);
-        writeScanFinish(true);
+        scanCompletedForRequest = true;
+        setMenuStatus(source + "成功", 0);
+        if(readScanFeeding()){
+            writeScanFinish(true);
+        }
     }
 
     /** 手动输入工件码:回车确认,写入全局码并回写 PLC 扫码完成 */
@@ -351,27 +377,34 @@ public class WorkJPanelScan extends JPanel {
             return;
         }
         if(!isValidSn(sn)){
-            setMenuStatus("工件码应为16位(如 CZ0600016A090001),当前" + sn.length() + "位", -1);
+            setMenuStatus("工件码应为16、19或24位,当前" + sn.length() + "位", -1);
             return;
         }
-        if(pos.equals("A")){
-            MesClient.scanSnA = sn;
+        manualPendingSn = sn;
+        productSnFeeding.setText(sn);
+        if(Boolean.TRUE.equals(lastScanRequest)){
+            publishScanResult(sn, "手动录入");
+            manualPendingSn = "";
         }else{
-            MesClient.scanSnB = sn;
+            setMenuStatus("手动录入成功,等待请求扫码", 0);
         }
-        productSnFeeding.setText(sn);
-        writeScanFinish(true);
-        setMenuStatus("手动录入成功", 0);
         log.info("[{}]手动录入工件码: {}", oprno + pos, sn);
     }
 
     public static boolean isValidSn(String sn){
-        return sn != null && sn.length() == SN_LEN;
+        if(sn == null){
+            return false;
+        }
+        int length = sn.trim().length();
+        return length == SN_LEN_SHORT || length == SN_LEN_LEGACY || length == SN_LEN_EVE;
     }
 
     public void resetFeeding() {
         productSnFeeding.setText("");
         tjFeedingFlag = 0;
+        manualPendingSn = "";
+        scanCompletedForRequest = false;
+        MesClient.clearScanCode(isScan);
         setMenuStatus("等待请求扫码",0);
         resetFeedingBtn.setEnabled(true);
 //        writeAllowFeeding(false);
@@ -383,6 +416,9 @@ public class WorkJPanelScan extends JPanel {
         tjStatus = 0;
 //        productSnFeeding.setText("5001040043561100050");
         productSnFeeding.setText("");
+        manualPendingSn = "";
+        scanCompletedForRequest = false;
+        MesClient.clearScanCode(isScan);
 //        setMenuStatus("等待请求扫码",0);
 
         if(isLocal == 0){

+ 48 - 0
src/com/mes/ui/MesClient.java

@@ -40,6 +40,9 @@ public class MesClient extends JFrame {
     public static String mes_line_sn = ""; // 产线编号
     public static String scanSnA = "";
     public static String scanSnB = "";
+    public static boolean scanReadyA = false;
+    public static boolean scanReadyB = false;
+    private static final Object scanCodeLock = new Object();
 
     //session
     public static String sessionid = "";
@@ -97,6 +100,51 @@ public class MesClient extends JFrame {
         return !isEastSide();
     }
 
+    public static void publishScanCode(int side, String sn) {
+        synchronized (scanCodeLock) {
+            if (side == 1) {
+                scanSnA = sn == null ? "" : sn.trim();
+                scanReadyA = !scanSnA.isEmpty();
+            } else {
+                scanSnB = sn == null ? "" : sn.trim();
+                scanReadyB = !scanSnB.isEmpty();
+            }
+        }
+    }
+
+    public static void clearScanCode(int side) {
+        synchronized (scanCodeLock) {
+            if (side == 1) {
+                scanSnA = "";
+                scanReadyA = false;
+            } else {
+                scanSnB = "";
+                scanReadyB = false;
+            }
+        }
+    }
+
+    public static String takeScanCode(int side) {
+        synchronized (scanCodeLock) {
+            if (side == 1) {
+                if (!scanReadyA) {
+                    return "";
+                }
+                String sn = scanSnA == null ? "" : scanSnA;
+                scanSnA = "";
+                scanReadyA = false;
+                return sn;
+            }
+            if (!scanReadyB) {
+                return "";
+            }
+            String sn = scanSnB == null ? "" : scanSnB;
+            scanSnB = "";
+            scanReadyB = false;
+            return sn;
+        }
+    }
+
 
     public static WorkJPanelOP40 workJPanelOP40A;
     public static WorkJPanelOP40 workJPanelOP40B;