wangxichen 4 днів тому
батько
коміт
1ee5fd380d

+ 17 - 0
src/main/java/com/jeesite/modules/mes/web/MesProductRecordController.java

@@ -3104,6 +3104,14 @@ public class MesProductRecordController extends BaseController {
 		return renderResult(Global.TRUE, text("操作成功!"));
 	}
 
+	// 绑定一对一规则(仅 pcbind 使用):底板码前8位 -> 膨胀梁码前13位
+	private static final Map<String, String> HMB_PAIR = new HashMap<>();
+	static {
+		HMB_PAIR.put("CZ060195", "F956210325195");
+		HMB_PAIR.put("CZ060196", "F956210325196");
+		HMB_PAIR.put("CZ060198", "F956210325198");
+	}
+
 	// 客户端绑定物料接口
 	@PostMapping(value = "pcbind")
 	@ResponseBody
@@ -3142,6 +3150,15 @@ public class MesProductRecordController extends BaseController {
 					}
 				}
 
+				// 一对一规则:底板码前8位必须对应膨胀梁码前13位
+				String pairWsn = sn.length() >= 8 ? HMB_PAIR.get(sn.substring(0, 8)) : null;
+				if(pairWsn == null){
+					return renderResult(Global.FALSE, text("底板码型号未配置对应关系!"));
+				}
+				if(!wsn.startsWith(pairWsn)){
+					return renderResult(Global.FALSE, text("底板码与膨胀梁码型号不匹配!"));
+				}
+
 				// 检查前工件码是否已绑定后面板码
 				MesProductHmb mesProductHmb2 = new MesProductHmb();
 				mesProductHmb2.setQsn(sn);

+ 2 - 2
src/main/resources/config/application.yml

@@ -56,9 +56,9 @@ jdbc:
   driver: com.mysql.cj.jdbc.Driver
 
 #  url: jdbc:mysql://39.106.12.131:3306/mes_cloud_xz?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
-#  url: jdbc:mysql://127.0.0.1:3306/mes_cloud_xz?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
+  url: jdbc:mysql://127.0.0.1:3306/mes_cloud_xz?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
 #  url: jdbc:mysql://192.168.17.170:3306/mes_cloud_xz?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
-  url: jdbc:mysql://192.168.100.128:3307/mes_cloud_xz?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
+#  url: jdbc:mysql://192.168.100.128:3307/mes_cloud_xz?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
 
 #  username: mes_cloud_xz
 #  password: 2hNY3YMe2BGbCXLS

+ 82 - 0
src/test/java/com/jeesite/test/HmbBindTest.java

@@ -0,0 +1,82 @@
+package com.jeesite.test;
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 手动补录并绑定长码(膨胀梁码)和短码(底板码),不启动 Spring
+ * 流程同正常生产:登录 -> check 登记长码 -> verify 验证长码 -> pcbind 绑定,任一步失败即停止
+ */
+public class HmbBindTest {
+
+    private static final String BASE = "http://192.168.17.170:8980/js/a";
+
+    private static final String LONG_SN = "F956210325198AJ21A010030"; // 长码 膨胀梁码
+    private static final String SHORT_SN = "CZ0601956A230014";        // 短码 底板码
+
+    // 与客户端登录框默认账号一致,密码按客户端方式 Base64 传
+    private static final String USER = "system";
+    private static final String PASSWORD = "Aa111111";
+
+    @Test
+    public void bind() {
+        String sid = login();
+        if (sid == null) {
+            return;
+        }
+
+        Map<String, Object> hmb = new HashMap<>();
+        hmb.put("__ajax", "json");
+        hmb.put("__sid", sid);
+        hmb.put("sn", LONG_SN);
+        if (!call("check 登记长码", BASE + "/mes/mesProductHmb/check", hmb)) {
+            return;
+        }
+        if (!call("verify 验证长码", BASE + "/mes/mesProductHmb/verify", hmb)) {
+            return;
+        }
+
+        Map<String, Object> bind = new HashMap<>();
+        bind.put("__ajax", "json");
+        bind.put("sn", SHORT_SN);
+        bind.put("wsn", LONG_SN);
+        bind.put("oprno", "OP105A"); // 接口只允许 OP105 绑定
+        bind.put("lineSn", "CZ060");
+        bind.put("ucode", USER);
+        call("pcbind 绑定", BASE + "/mes/mesProductRecord/pcbind", bind);
+    }
+
+    // 登录拿 sessionid,失败返回 null;shiro 只在 POST 时执行登录(客户端 LoginFarme 也是 POST)
+    private String login() {
+        Map<String, Object> p = new HashMap<>();
+        p.put("__ajax", "json");
+        p.put("validCode", "");
+        p.put("username", Base64.encode(USER));
+        p.put("password", Base64.encode(PASSWORD));
+        String ret = HttpUtil.post(BASE + "/login", p, 15000);
+        System.out.println("[登录] " + ret);
+        JSONObject obj = JSONUtil.parseObj(ret);
+        if (!"true".equalsIgnoreCase(obj.getStr("result"))) {
+            System.out.println("登录失败,停止");
+            return null;
+        }
+        return obj.getStr("sessionid");
+    }
+
+    // 发 POST 表单,打印结果,result=true 返回 true
+    private boolean call(String name, String url, Map<String, Object> params) {
+        String ret = HttpUtil.post(url, params, 15000);
+        System.out.println("[" + name + "] " + ret);
+        boolean ok = JSONUtil.isTypeJSON(ret) && "true".equalsIgnoreCase(JSONUtil.parseObj(ret).getStr("result"));
+        if (!ok) {
+            System.out.println(name + " 失败,停止");
+        }
+        return ok;
+    }
+}