wangxichen преди 4 дни
родител
ревизия
679dfb7f15
променени са 2 файла, в които са добавени 96 реда и са изтрити 2 реда
  1. 74 2
      src/com/mes/component/WorkJPanelScan.java
  2. 22 0
      src/com/mes/ui/MesClient.java

+ 74 - 2
src/com/mes/component/WorkJPanelScan.java

@@ -51,6 +51,12 @@ public class WorkJPanelScan extends JPanel {
     public JLabel feedingmeslabel; // 0.1 扫码完成反馈
     public JLabel gunNoLabel;      // DB7010.6 实时枪号
 
+    // 手动输入(参考 auto3,模拟扫码枪),由 设置->扫码手动输入 开关控制显示
+    public JLabel manualLabel;
+    public JTextField manualSnField;
+    public JButton manualSubmitBtn;
+    public volatile String pendingManualSn = ""; // 待使用的手动码,下次请求扫码时代替扫码枪
+
     public ImageIcon imageGreen;
     public ImageIcon imageGray;
 
@@ -154,6 +160,30 @@ public class WorkJPanelScan extends JPanel {
         gunNoLabel.setBounds(workWidth * 2 / 3, 150, workWidth / 3, 30);
         this.add(gunNoLabel);
 
+        // 手动输入行
+        manualLabel = new JLabel("手动");
+        manualLabel.setHorizontalAlignment(SwingConstants.CENTER);
+        manualLabel.setForeground(Color.BLACK);
+        manualLabel.setFont(new Font("微软雅黑", Font.PLAIN, 20));
+        manualLabel.setBounds(0, 185, workWidth / 5, 40);
+        this.add(manualLabel);
+
+        manualSnField = new JTextField("");
+        manualSnField.setHorizontalAlignment(SwingConstants.CENTER);
+        manualSnField.setForeground(Color.BLACK);
+        manualSnField.setFont(new Font("微软雅黑", Font.PLAIN, 16));
+        manualSnField.setBounds(workWidth / 5, 185, workWidth * 3 / 5, 40);
+        manualSnField.addActionListener(e -> submitManualSn()); // 回车提交
+        this.add(manualSnField);
+
+        manualSubmitBtn = new JButton("确认");
+        manualSubmitBtn.setFont(new Font("微软雅黑", Font.PLAIN, 22));
+        manualSubmitBtn.setBounds(workWidth * 4 / 5 + 10, 185, workWidth / 5 - 10, 40);
+        manualSubmitBtn.addActionListener(e -> submitManualSn());
+        this.add(manualSubmitBtn);
+
+        setManualMode(MesClient.manualScanEnabled);
+
         JLabel ipLabel = new JLabel("PLC " + plcIp + " | " + plcDb + " | 枪号 " + gunAddr);
         ipLabel.setFont(new Font("微软雅黑", Font.PLAIN, 12));
         ipLabel.setForeground(Color.DARK_GRAY);
@@ -212,6 +242,34 @@ public class WorkJPanelScan extends JPanel {
         status_menu.setText(msg);
     }
 
+    // 显示/隐藏手动输入行;关闭时丢弃未使用的手动码
+    public void setManualMode(boolean enabled) {
+        manualLabel.setVisible(enabled);
+        manualSnField.setVisible(enabled);
+        manualSubmitBtn.setVisible(enabled);
+        if (enabled) {
+            return;
+        }
+        manualSnField.setText("");
+        if (!pendingManualSn.isEmpty()) {
+            pendingManualSn = "";
+            setMenuStatus("已关闭手动输入,未使用的手动码已丢弃", 0);
+        }
+    }
+
+    // 提交手动码:校验长度后挂起,等下一次请求扫码时当作扫码结果
+    public void submitManualSn() {
+        String sn = manualSnField.getText().trim();
+        if (sn.length() != SN_LENGTH) {
+            setMenuStatus("手动码需为" + SN_LENGTH + "位,当前" + sn.length() + "位", -1);
+            return;
+        }
+        pendingManualSn = sn;
+        manualSnField.setText("");
+        log.info("<{}>手动输入工件码:{},操作人:{}", tag(), sn, MesClient.user_menu.getText());
+        setMenuStatus("手动码已就绪,等待请求扫码:" + sn, 0);
+    }
+
     // scan.ips 里配了这把枪即有效,PLC 发几号就用几号
     private boolean isValidGun(int no) {
         return no >= 1 && no <= MesClient.scanClients.length;
@@ -286,6 +344,15 @@ public class WorkJPanelScan extends JPanel {
     }
 
     private void doScan(Integer plcGunNo) {
+        // 有手动码时优先使用并跳过本次扫码枪,用完即清(同 auto3)
+        String manualSn = pendingManualSn;
+        if (!manualSn.isEmpty()) {
+            pendingManualSn = "";
+            log.info("<{}>手动码执行:{}", tag(), manualSn);
+            gunField.setText("手动输入");
+            saveScan(manualSn, "手动输入(" + plcName + ")");
+            return;
+        }
         // 读不到枪号不扫码
         if (plcGunNo == null) {
             gunField.setText("未读到枪号");
@@ -315,11 +382,16 @@ public class WorkJPanelScan extends JPanel {
             return;
         }
 
-        slot.put(sn, gunNo + "号枪(" + plcName + ")");
+        saveScan(sn, gunNo + "号枪(" + plcName + ")");
+    }
+
+    // 存入正面扫码码并回写扫码完成反馈
+    private void saveScan(String sn, String source) {
+        slot.put(sn, source);
         productSnFeeding.setText(sn);
         writeScanFinish(true);
         scanDone = true;
-        setMenuStatus("扫码成功", 0);
+        setMenuStatus("扫码成功" + (source.startsWith("手动") ? "(手动码)" : ""), 0);
     }
 
     public void resetScan() {

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

@@ -70,6 +70,9 @@ public class MesClient extends JFrame {
     public static WorkJPanelScan workJPanelScan93; // 93 DB7010(PLC 发 3 号枪)
     public static WorkJPanelBackSlot workJPanelBackSlot;
 
+    // 扫码手动输入开关(参考 auto3,模拟扫码枪输入),每次启动默认关闭
+    public static volatile boolean manualScanEnabled = false;
+
     public static void main(String[] args) {
         EventQueue.invokeLater(new Runnable() {
             @Override
@@ -207,6 +210,19 @@ public class MesClient extends JFrame {
         settingMenu.setFont(new Font("微软雅黑", Font.PLAIN, 20));
         menuBar.add(settingMenu);
 
+        // 扫码手动输入开关:开启绿色/关闭红色,开启后 92、93 扫码面板显示手动输入行
+        JMenuItem manualScanMenu = new JMenuItem();
+        manualScanMenu.setFont(new Font("微软雅黑", Font.PLAIN, 20));
+        refreshManualScanMenu(manualScanMenu);
+        manualScanMenu.addActionListener(e -> {
+            manualScanEnabled = !manualScanEnabled;
+            log.info("扫码手动输入" + (manualScanEnabled ? "已开启" : "已关闭") + ",操作人:" + user_menu.getText());
+            refreshManualScanMenu(manualScanMenu);
+            if (workJPanelScan92 != null) workJPanelScan92.setManualMode(manualScanEnabled);
+            if (workJPanelScan93 != null) workJPanelScan93.setManualMode(manualScanEnabled);
+        });
+        settingMenu.add(manualScanMenu);
+
         contentPane = new JPanel();
         contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
         setContentPane(contentPane);
@@ -343,6 +359,12 @@ public class MesClient extends JFrame {
         return new JScrollPane(grid);
     }
 
+    // 按开关状态刷新菜单项文字和颜色
+    private static void refreshManualScanMenu(JMenuItem item){
+        item.setText("扫码手动输入:" + (manualScanEnabled ? "已开启" : "已关闭"));
+        item.setForeground(manualScanEnabled ? new Color(0, 160, 0) : Color.RED);
+    }
+
     public static void setMenuStatus(String msg,int error){
         if(error == 0){
             MesClient.status_menu.setForeground(Color.GREEN);