|
|
@@ -3,6 +3,7 @@ package com.mes.ui;
|
|
|
import com.alibaba.fastjson2.JSONObject;
|
|
|
import com.mes.component.MesRadio;
|
|
|
import com.mes.component.MesWebView;
|
|
|
+import com.mes.component.ProductTypePanel;
|
|
|
import com.mes.util.DateLocalUtils;
|
|
|
import com.mes.util.HttpUtils;
|
|
|
import com.mes.util.JdbcUtils;
|
|
|
@@ -50,6 +51,15 @@ public class MesClient extends JFrame {
|
|
|
public static JScrollPane searchScrollPane; // 已弃用,改为使用 WorkRecordPanel
|
|
|
public static JScrollPane searchScrollPaneDj;
|
|
|
|
|
|
+ //新增字段
|
|
|
+ public static ProductTypePanel productTypePanel;
|
|
|
+ public static JLabel productTypeCurrentLabel;
|
|
|
+ public static final int PRODUCT_SN_LENGTH = 32;
|
|
|
+ public static final String PREFIX_ZJ = "000020021815-01000016"; //智界
|
|
|
+ public static final String PREFIX_SJ = "000020022029-01000016"; //尚界
|
|
|
+ public static final String PRODUCT_TYPE_SWITCH_PASSWORD = "503833";
|
|
|
+ public static final String PRODUCT_TYPE_ZJ = ProductTypePanel.TYPE_ZJ;
|
|
|
+ public static final String PRODUCT_TYPE_SJ = ProductTypePanel.TYPE_SJ;
|
|
|
|
|
|
public static Boolean check_quality_result = false;
|
|
|
public static Integer work_status = 0;
|
|
|
@@ -403,6 +413,7 @@ public class MesClient extends JFrame {
|
|
|
}
|
|
|
|
|
|
public static void initWarehouseData(){
|
|
|
+ loadProductTypeFromDb(); //新增
|
|
|
resetScanA();
|
|
|
}
|
|
|
|
|
|
@@ -612,6 +623,7 @@ public class MesClient extends JFrame {
|
|
|
//弹窗扫工件码
|
|
|
String scanBarcode = JOptionPane.showInputDialog(null, scanBarcodeTitle);
|
|
|
if(scanBarcode!=null&&!scanBarcode.equalsIgnoreCase("")) {
|
|
|
+ scanBarcode = scanBarcode.trim(); //生产类型新增
|
|
|
//获取用户
|
|
|
getUser();
|
|
|
//获取扫码内容36位
|
|
|
@@ -626,6 +638,21 @@ public class MesClient extends JFrame {
|
|
|
//刷新界面
|
|
|
mesClientFrame.repaint();
|
|
|
|
|
|
+ //生产类型新增
|
|
|
+ String validateMsg = validateProductSnMessage(scanBarcode);
|
|
|
+ if (validateMsg != null) {
|
|
|
+ check_quality_result = false;
|
|
|
+ work_status = 0;
|
|
|
+ MesClient.finish_ok_bt.setEnabled(false);
|
|
|
+ MesClient.finish_ng_bt.setEnabled(false);
|
|
|
+ MesClient.f_scan_data_bt_1.setEnabled(true);
|
|
|
+ updateProductTypePanelEnabled(true);
|
|
|
+ MesClient.setMenuStatus(validateMsg, -1);
|
|
|
+
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ updateProductTypePanelEnabled(false);
|
|
|
+
|
|
|
if (!PlcService.ensureConnected()) {
|
|
|
MesClient.setMenuStatus("PLC未连接,请检查网络", -1);
|
|
|
updatePlcStatus(false);
|
|
|
@@ -902,6 +929,13 @@ public class MesClient extends JFrame {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ //生产类型新增
|
|
|
+ String validateMsg = validateProductSnMessage(sn);
|
|
|
+ if (validateMsg != null) {
|
|
|
+ MesClient.setMenuStatus(validateMsg, -1);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
JSONObject retObj = DataUtil.sendQuality(sn,"OK",user20);
|
|
|
if(retObj == null){
|
|
|
MesClient.setMenuStatus("请求失败,请重试",-1);
|
|
|
@@ -943,6 +977,12 @@ public class MesClient extends JFrame {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ String validateMsg = validateProductSnMessage(sn);
|
|
|
+ if (validateMsg != null) {
|
|
|
+ MesClient.setMenuStatus(validateMsg, -1);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
JSONObject retObj = DataUtil.sendQuality(sn,"NG",user20);
|
|
|
if(retObj == null){
|
|
|
MesClient.setMenuStatus("请求失败,请重试",-1);
|
|
|
@@ -978,6 +1018,47 @@ public class MesClient extends JFrame {
|
|
|
|
|
|
indexPanelC = new JPanel(new BorderLayout());
|
|
|
|
|
|
+ //新增的面板
|
|
|
+ JPanel indexPanelProductType = new JPanel();
|
|
|
+ indexPanelProductType.setLayout(null);
|
|
|
+ JScrollPane productTypeScrollPane = new JScrollPane(indexPanelProductType);
|
|
|
+
|
|
|
+ JLabel productTypeTitle = new JLabel("生产类型设置");
|
|
|
+ productTypeTitle.setFont(new Font("微软雅黑", Font.BOLD, 28));
|
|
|
+ productTypeTitle.setForeground(new Color(64, 64, 64));
|
|
|
+ productTypeTitle.setHorizontalAlignment(SwingConstants.CENTER);
|
|
|
+ productTypeTitle.setBounds(81, 80, 810, 50);
|
|
|
+ indexPanelProductType.add(productTypeTitle);
|
|
|
+
|
|
|
+ JLabel productTypeHint = new JLabel("请选择当前生产的工件类型,切换后将保存到本地并用于扫码校验");
|
|
|
+ productTypeHint.setFont(new Font("微软雅黑", Font.PLAIN, 20));
|
|
|
+ productTypeHint.setForeground(new Color(140, 140, 140));
|
|
|
+ productTypeHint.setHorizontalAlignment(SwingConstants.CENTER);
|
|
|
+ productTypeHint.setBounds(81, 140, 810, 40);
|
|
|
+ indexPanelProductType.add(productTypeHint);
|
|
|
+
|
|
|
+ productTypePanel = new ProductTypePanel(PRODUCT_TYPE_SWITCH_PASSWORD);
|
|
|
+ productTypePanel.setBounds(276, 210, 420, 72);
|
|
|
+ productTypePanel.setOnChangeListener(() -> {
|
|
|
+ if (work_status == 0) {
|
|
|
+ saveProductTypeToDb();
|
|
|
+ setMenuStatus("当前生产类型:" + getProductTypeName() + ",请扫工件码", 0);
|
|
|
+ }
|
|
|
+ refreshProductTypeCurrentLabel();
|
|
|
+ });
|
|
|
+ indexPanelProductType.add(productTypePanel);
|
|
|
+
|
|
|
+ productTypeCurrentLabel = new JLabel();
|
|
|
+ productTypeCurrentLabel.setFont(new Font("微软雅黑", Font.PLAIN, 22));
|
|
|
+ productTypeCurrentLabel.setForeground(new Color(64, 64, 64));
|
|
|
+ productTypeCurrentLabel.setHorizontalAlignment(SwingConstants.CENTER);
|
|
|
+ productTypeCurrentLabel.setBounds(81, 310, 810, 40);
|
|
|
+ refreshProductTypeCurrentLabel();
|
|
|
+ indexPanelProductType.add(productTypeCurrentLabel);
|
|
|
+
|
|
|
+ tabbedPane.addTab("生产类型", new ImageIcon(MesClient.class.getResource("/bg/menu_setting.png")), productTypeScrollPane, null);
|
|
|
+
|
|
|
+
|
|
|
tabbedPane.addTab("开班点检", new ImageIcon(MesClient.class.getResource("/bg/menu_data_preprocess.png")), indexPanelC, null);
|
|
|
|
|
|
|
|
|
@@ -1052,6 +1133,81 @@ public class MesClient extends JFrame {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
+ private static String validateProductSnMessage(String sn) {
|
|
|
+ if (sn == null || sn.isEmpty()) {
|
|
|
+ return "工件码为空,请重试";
|
|
|
+ }
|
|
|
+ if (sn.length() != PRODUCT_SN_LENGTH) {
|
|
|
+ return "工件码长度须为32位,当前" + sn.length() + "位";
|
|
|
+ }
|
|
|
+ String prefix = getProductSnPrefix();
|
|
|
+ if (!sn.startsWith(prefix)) {
|
|
|
+ return "工件码前缀与当前类型(" + getProductTypeName() + ")不匹配,当前工件码为" + getProductTypeNameBySn(sn);
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void updateProductTypePanelEnabled(boolean enabled) {
|
|
|
+ if (productTypePanel != null) {
|
|
|
+ productTypePanel.setEnabled(enabled);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ public static void loadProductTypeFromDb() {
|
|
|
+ if (productTypePanel == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ String savedType = JdbcUtils.getClientConfig(
|
|
|
+ JdbcUtils.getProductTypeConfigKey(mes_gw),
|
|
|
+ PRODUCT_TYPE_ZJ
|
|
|
+ );
|
|
|
+ if (PRODUCT_TYPE_SJ.equals(savedType)) {
|
|
|
+ productTypePanel.setResult(PRODUCT_TYPE_SJ);
|
|
|
+ } else {
|
|
|
+ productTypePanel.setResult(PRODUCT_TYPE_ZJ);
|
|
|
+ }
|
|
|
+ refreshProductTypeCurrentLabel();
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void refreshProductTypeCurrentLabel() {
|
|
|
+ if (productTypeCurrentLabel != null) {
|
|
|
+ productTypeCurrentLabel.setText("当前选择:" + getProductTypeName() + "(前缀 " + getProductSnPrefix() + ")");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void saveProductTypeToDb() {
|
|
|
+ if (productTypePanel == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ JdbcUtils.saveClientConfig(
|
|
|
+ JdbcUtils.getProductTypeConfigKey(mes_gw),
|
|
|
+ productTypePanel.getResult()
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String getProductSnPrefix() {
|
|
|
+ if (productTypePanel != null && PRODUCT_TYPE_SJ.equals(productTypePanel.getResult())) {
|
|
|
+ return PREFIX_SJ;
|
|
|
+ }
|
|
|
+ return PREFIX_ZJ;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String getProductTypeName() {
|
|
|
+ if (productTypePanel != null) {
|
|
|
+ return productTypePanel.getTypeName();
|
|
|
+ }
|
|
|
+ return "智界";
|
|
|
+ }
|
|
|
+
|
|
|
+ private static String getProductTypeNameBySn(String sn) {
|
|
|
+ if (sn.startsWith(PREFIX_SJ)) {
|
|
|
+ return "尚界";
|
|
|
+ }
|
|
|
+ if (sn.startsWith(PREFIX_ZJ)) {
|
|
|
+ return "智界";
|
|
|
+ }
|
|
|
+ return "未知";
|
|
|
+ }
|
|
|
+
|
|
|
// 软件设置页面UI构建(含编辑/保存/重载按钮)
|
|
|
private JPanel buildSoftwareSettingPanel() {
|
|
|
JPanel panel = new JPanel();
|