Browse Source

总成检具NG点位追溯

dzc 1 day ago
parent
commit
1927cddff7

+ 11 - 0
.project

@@ -14,4 +14,15 @@
 	<natures>
 		<nature>org.eclipse.jdt.core.javanature</nature>
 	</natures>
+	<filteredResources>
+		<filter>
+			<id>1788489814086</id>
+			<name></name>
+			<type>30</type>
+			<matcher>
+				<id>org.eclipse.core.resources.regexFilterMatcher</id>
+				<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
+			</matcher>
+		</filter>
+	</filteredResources>
 </projectDescription>

+ 109 - 0
src/com/mes/component/GaugeNgPointDialog.java

@@ -0,0 +1,109 @@
+package com.mes.component;
+
+import javax.swing.*;
+import javax.swing.border.EmptyBorder;
+import java.awt.*;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 总成检具 NG 点位多选(J1~J56)
+ */
+public class GaugeNgPointDialog extends JDialog {
+
+    private static final int POINT_COUNT = 56;
+    private final JCheckBox[] boxes = new JCheckBox[POINT_COUNT];
+    private String selectedPoints;
+    private boolean confirmed;
+
+    public GaugeNgPointDialog(Frame owner) {
+        super(owner, "选择NG点位", true);
+        init();
+    }
+
+    private void init() {
+        setDefaultCloseOperation(DISPOSE_ON_CLOSE);
+        setSize(780, 560);
+        setLocationRelativeTo(getOwner());
+        setResizable(false);
+
+        JPanel root = new JPanel(new BorderLayout(0, 10));
+        root.setBorder(new EmptyBorder(12, 16, 12, 16));
+        root.setBackground(Color.WHITE);
+
+        JLabel tip = new JLabel("请勾选不合格点位(可多选),未勾选的点位视为OK,不会上传");
+        tip.setFont(new Font("微软雅黑", Font.PLAIN, 18));
+        tip.setForeground(new Color(80, 80, 80));
+        root.add(tip, BorderLayout.NORTH);
+
+        JPanel grid = new JPanel(new GridLayout(8, 7, 8, 8));
+        grid.setOpaque(false);
+        for (int i = 0; i < POINT_COUNT; i++) {
+            String code = "J" + (i + 1);
+            JCheckBox cb = new JCheckBox(code);
+            cb.setFont(new Font("微软雅黑", Font.BOLD, 16));
+            cb.setFocusPainted(false);
+            boxes[i] = cb;
+            grid.add(cb);
+        }
+        JScrollPane scroll = new JScrollPane(grid);
+        scroll.setBorder(BorderFactory.createLineBorder(new Color(220, 220, 220)));
+        root.add(scroll, BorderLayout.CENTER);
+
+        JPanel south = new JPanel(new FlowLayout(FlowLayout.RIGHT, 12, 0));
+        south.setOpaque(false);
+        JButton clearBtn = new JButton("清空");
+        clearBtn.setFont(new Font("微软雅黑", Font.PLAIN, 16));
+        clearBtn.addActionListener(e -> {
+            for (JCheckBox box : boxes) {
+                box.setSelected(false);
+            }
+        });
+        JButton cancelBtn = new JButton("取消");
+        cancelBtn.setFont(new Font("微软雅黑", Font.PLAIN, 16));
+        cancelBtn.addActionListener(e -> {
+            confirmed = false;
+            selectedPoints = null;
+            dispose();
+        });
+        JButton okBtn = new JButton("确定上传");
+        okBtn.setFont(new Font("微软雅黑", Font.PLAIN, 16));
+        okBtn.addActionListener(e -> {
+            List<String> selected = new ArrayList<>();
+            for (JCheckBox box : boxes) {
+                if (box.isSelected()) {
+                    selected.add(box.getText());
+                }
+            }
+            if (selected.isEmpty()) {
+                JOptionPane.showMessageDialog(this, "请至少选择一个NG点位", "提示", JOptionPane.WARNING_MESSAGE);
+                return;
+            }
+            StringBuilder sb = new StringBuilder();
+            for (int i = 0; i < selected.size(); i++) {
+                if (i > 0) {
+                    sb.append(",");
+                }
+                sb.append(selected.get(i));
+            }
+            selectedPoints = sb.toString();
+            confirmed = true;
+            dispose();
+        });
+        south.add(clearBtn);
+        south.add(cancelBtn);
+        south.add(okBtn);
+        root.add(south, BorderLayout.SOUTH);
+
+        setContentPane(root);
+    }
+
+    /**
+     * @return 逗号分隔点位如 J1,J5,J12;取消返回 null
+     */
+    public static String showDialog(Frame owner) {
+        GaugeNgPointDialog dialog = new GaugeNgPointDialog(owner);
+        dialog.setVisible(true);
+        return dialog.confirmed ? dialog.selectedPoints : null;
+    }
+}

+ 43 - 7
src/com/mes/ui/DataUtil.java

@@ -16,14 +16,19 @@ import java.util.List;
 public class DataUtil {
     public static final Logger log = LoggerFactory.getLogger(DataUtil.class);
 
+    private static String sidParam() {
+        String sid = MesClient.sessionid;
+        return (sid == null || sid.trim().isEmpty()) ? "" : ("&__sid=" + sid.trim());
+    }
+
     public static JSONObject checkQuality(String sn, String user){
         try{
             String mes_server_ip = MesClient.mes_server_ip;
             String oprno = MesClient.mes_gw == null ? "" : MesClient.mes_gw.trim();
             String lineSn = MesClient.mes_line_sn == null ? "" : MesClient.mes_line_sn.trim();
             String url = "http://"+mes_server_ip+":8980/js/a/mes/mesProductRecord/pccheck";
-            String params = "__ajax=json&oprno="+oprno+"&lineSn="+lineSn+"&sn="+sn+"&ucode="+user;
-            log.info("params="+params);
+            String params = "__ajax=json&oprno="+oprno+"&lineSn="+lineSn+"&sn="+sn+"&ucode="+user + sidParam();
+            log.info("url="+url+" params="+params);
             String result = doPost(url,params);
             log.info("result="+result);
             if(result == null || result.trim().isEmpty() || result.equalsIgnoreCase("false")) {
@@ -45,7 +50,7 @@ public class DataUtil {
             String oprno = MesClient.mes_gw == null ? "" : MesClient.mes_gw.trim();
             String lineSn = MesClient.mes_line_sn == null ? "" : MesClient.mes_line_sn.trim();
             String url = "http://"+mes_server_ip+":8980/js/a/mes/mesProductRecord/pcbindRecord";
-            String params = "__ajax=json&oprno="+oprno+"&lineSn="+lineSn+"&sn="+sn+"&result="+ret+"&ucode="+user + "&craft="+craft+"&materielSn="+materielSn;
+            String params = "__ajax=json&oprno="+oprno+"&lineSn="+lineSn+"&sn="+sn+"&result="+ret+"&ucode="+user + "&craft="+craft+"&materielSn="+materielSn + sidParam();
             log.info("params="+params);
             String result = doPost(url,params);
             log.info("result="+result);
@@ -68,8 +73,8 @@ public class DataUtil {
             String oprno = MesClient.mes_gw == null ? "" : MesClient.mes_gw.trim();
             String lineSn = MesClient.mes_line_sn == null ? "" : MesClient.mes_line_sn.trim();
             String url = "http://"+mes_server_ip+":8980/js/a/mes/mesProductRecord/pcresult";
-            String params = "__ajax=json&oprno="+oprno+"&lineSn="+lineSn+"&sn="+sn+"&result="+ret+"&ucode="+user;
-            log.info("params="+params);
+            String params = "__ajax=json&oprno="+oprno+"&lineSn="+lineSn+"&sn="+sn+"&result="+ret+"&ucode="+user + sidParam();
+            log.info("url="+url+" params="+params);
             String result = doPost(url,params);
             log.info("result="+result);
 
@@ -85,6 +90,34 @@ public class DataUtil {
         }
     }
 
+    /**
+     * 上传总成检具 NG 点位(只传勾选的 NG 点,逗号分隔)
+     */
+    public static JSONObject sendGaugeNgPoints(String sn, String ngPoints, String user) {
+        try {
+            String mes_server_ip = MesClient.mes_server_ip;
+            String oprno = MesClient.mes_gw == null ? "" : MesClient.mes_gw.trim();
+            String lineSn = MesClient.mes_line_sn == null ? "" : MesClient.mes_line_sn.trim();
+            String url = "http://" + mes_server_ip + ":8980/js/a/mes/mesProductGaugeNg/pcsave";
+            String params = "__ajax=json&oprno=" + oprno
+                    + "&lineSn=" + lineSn
+                    + "&sn=" + sn
+                    + "&ucode=" + (user == null ? "" : user)
+                    + "&ngPoints=" + (ngPoints == null ? "" : ngPoints)
+                    + sidParam();
+            log.info("gaugeNg url=" + url + " params=" + params);
+            String result = doPost(url, params);
+            log.info("gaugeNg result=" + result);
+            if (result == null || result.trim().isEmpty() || result.equalsIgnoreCase("false")) {
+                return null;
+            }
+            return JSONObject.parseObject(result);
+        } catch (Exception e) {
+            log.info("sendGaugeNgPoints e=" + e.getMessage());
+            return null;
+        }
+    }
+
     public static String rightPad(final String str, final int size) {
         if (str == null) {
             return null;
@@ -105,7 +138,7 @@ public class DataUtil {
             String url = "http://"+mes_server_ip+":8980/js/a/mes/mesLineProcessMaterial/materials";
             String params = "__ajax=json&oprno="+oprno+"&lineSn="+lineSn;
             System.out.println("params="+params);
-            String result = doPost(url,params);
+            String result = doPost(url,params + sidParam());
             System.out.println("result="+result);
 
             if(result.equalsIgnoreCase("false")) {
@@ -124,7 +157,7 @@ public class DataUtil {
             String oprno = MesClient.mes_gw == null ? "" : MesClient.mes_gw.trim();
             String lineSn = MesClient.mes_line_sn == null ? "" : MesClient.mes_line_sn.trim();
             String url = "http://"+mes_server_ip+":8980/js/a/mes/mesMaterialPrebind/bind";
-            String params = "__ajax=json&oprno="+oprno+"&lineSn="+lineSn+"&batchSn="+batchSn+"&craft="+craft+"&materialId="+materialId+"&type="+type;
+            String params = "__ajax=json&oprno="+oprno+"&lineSn="+lineSn+"&batchSn="+batchSn+"&craft="+craft+"&materialId="+materialId+"&type="+type + sidParam();
             System.out.println("params="+params);
             String result = doPost(url,params);
             System.out.println("result="+result);
@@ -229,6 +262,9 @@ public class DataUtil {
             params.append("&lineSn=").append(lineSn);
             params.append("&pageNo=").append(pageNo);
             params.append("&pageSize=").append(pageSize);
+            if (MesClient.sessionid != null && !MesClient.sessionid.trim().isEmpty()) {
+                params.append("&__sid=").append(MesClient.sessionid.trim());
+            }
             System.out.println("oprno="+oprno);
             //todo
             if (oprno != null && !oprno.isEmpty()) {

+ 2 - 2
src/com/mes/ui/LoginFarme.java

@@ -186,7 +186,7 @@ public class LoginFarme extends JFrame {
 
 					// 工作记录
 					if (MesClient.jfxPanel == null) {
-						String url = "http://" + MesClient.mes_server_ip + ":8980/js/a/mes/mesProductRecord/work?oprno=" + MesClient.mes_gw + "&lineSn=" + MesClient.mes_line_sn;
+						String url = "http://" + MesClient.mes_server_ip + ":8980/js/a/mes/mesProductRecord/work?oprno=" + MesClient.mes_gw + "&lineSn=" + MesClient.mes_line_sn + "&__sid=" + MesClient.sessionid;
 						MesClient.jfxPanel = new MesWebView(url);
 						MesClient.jfxPanel.setSize(990, 550);
 						MesClient.jfxPanel.setBounds(0, 0, 990, 550);
@@ -195,7 +195,7 @@ public class LoginFarme extends JFrame {
 
 					// 开班点检
 					if (MesClient.jfxPanel2 == null) {
-						String url = "http://" + MesClient.mes_server_ip + ":8980/js/a/mes/mesProcessCheckRecord/ulist?ucode=" + user_id + "&oprno=" + MesClient.mes_gw + "&lineSn=" + MesClient.mes_line_sn;
+						String url = "http://" + MesClient.mes_server_ip + ":8980/js/a/mes/mesProcessCheckRecord/ulist?ucode=" + user_id + "&oprno=" + MesClient.mes_gw + "&lineSn=" + MesClient.mes_line_sn + "&__sid=" + MesClient.sessionid;
 						MesClient.jfxPanel2 = new MesWebView(url);
 						MesClient.indexPanelC.add(MesClient.jfxPanel2, BorderLayout.CENTER);
 					}

+ 36 - 1
src/com/mes/ui/MesClient.java

@@ -1,6 +1,7 @@
 package com.mes.ui;
 
 import com.alibaba.fastjson2.JSONObject;
+import com.mes.component.GaugeNgPointDialog;
 import com.mes.component.MesRadio;
 import com.mes.component.ProductTypePanel;
 import com.mes.component.MesWebView;
@@ -163,9 +164,15 @@ public class MesClient extends JFrame {
             mes_plc_ip = plcIp.trim();
         }
 
+        // SQLite 优先;没有本地配置时再读 config.properties
         String ipFromDb = JdbcUtils.getServerIpByOp(mes_gw);
         if (ipFromDb != null && !ipFromDb.trim().isEmpty()) {
             mes_server_ip = ipFromDb.trim();
+        } else {
+            String serverIp = pro.getProperty("mes.server_ip");
+            if (serverIp != null && !serverIp.trim().isEmpty()) {
+                mes_server_ip = serverIp.trim();
+            }
         }
 
         String nameFromDb = JdbcUtils.getOpNameByOp(mes_gw);
@@ -667,6 +674,13 @@ public class MesClient extends JFrame {
     }
 
     private static void submitQualityAndNotifyPlc(String quality) {
+        submitQualityAndNotifyPlc(quality, null);
+    }
+
+    /**
+     * @param ngPoints NG 时勾选的点位(逗号分隔),OK 时传 null
+     */
+    private static void submitQualityAndNotifyPlc(String quality, String ngPoints) {
         if (work_status != 1 || !check_quality_result) {
             return;
         }
@@ -686,6 +700,23 @@ public class MesClient extends JFrame {
         MesClient.finish_ng_bt.setEnabled(false);
         PlcService.stopWatchProcessDone();
 
+        if ("NG".equalsIgnoreCase(quality) && ngPoints != null && !ngPoints.trim().isEmpty()) {
+            JSONObject ngObj = DataUtil.sendGaugeNgPoints(sn, ngPoints.trim(), user20);
+            if (ngObj == null) {
+                MesClient.setMenuStatus("NG点位上传失败,请重试", -1);
+                MesClient.finish_ok_bt.setEnabled(true);
+                MesClient.finish_ng_bt.setEnabled(true);
+                return;
+            }
+            if (ngObj.get("result") == null || !ngObj.get("result").toString().equalsIgnoreCase("true")) {
+                String msg = ngObj.getString("message");
+                MesClient.setMenuStatus(msg == null || msg.isEmpty() ? "NG点位上传失败" : msg, -1);
+                MesClient.finish_ok_bt.setEnabled(true);
+                MesClient.finish_ng_bt.setEnabled(true);
+                return;
+            }
+        }
+
         JSONObject retObj = DataUtil.sendQuality(sn, quality, user20);
         if (retObj == null) {
             MesClient.setMenuStatus("请求失败,请重试", -1);
@@ -945,7 +976,11 @@ public class MesClient extends JFrame {
         finish_ng_bt.setEnabled(false);
         finish_ng_bt.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) {
-                submitQualityAndNotifyPlc("NG");
+                String ngPoints = GaugeNgPointDialog.showDialog(MesClient.mesClientFrame);
+                if (ngPoints == null || ngPoints.trim().isEmpty()) {
+                    return;
+                }
+                submitQualityAndNotifyPlc("NG", ngPoints.trim());
             }
         });
         finish_ng_bt.setIcon(new ImageIcon(MesClient.class.getResource("/bg/ng_bg.png")));

+ 3 - 3
src/resources/config/config.properties

@@ -1,6 +1,6 @@
-#mes.gw=OP355A
+#mes.gw=OP320A
+mes.server_ip=192.168.16.99
 #mes.server_ip=127.0.0.1
 #mes.server_ip=localhost
-#mes.server_ip=192.168.20.99
 mes.line_sn=XT
-mes.plc_ip=192.168.2.1
+mes.plc_ip=192.168.2.1