From 34981c30a78e8bbd7791131059a9210f9928b62c Mon Sep 17 00:00:00 2001
From: 刘光辉 <347230014@qq.com>
Date: 星期四, 17 九月 2026 09:24:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master' into master

---
 jnpf-lims/jnpf-lims-biz/src/test/java/jnpf/limsService/support/LimsSignUsageSupportProbe.java |  101 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 101 insertions(+), 0 deletions(-)

diff --git a/jnpf-lims/jnpf-lims-biz/src/test/java/jnpf/limsService/support/LimsSignUsageSupportProbe.java b/jnpf-lims/jnpf-lims-biz/src/test/java/jnpf/limsService/support/LimsSignUsageSupportProbe.java
new file mode 100644
index 0000000..8eebdd4
--- /dev/null
+++ b/jnpf-lims/jnpf-lims-biz/src/test/java/jnpf/limsService/support/LimsSignUsageSupportProbe.java
@@ -0,0 +1,101 @@
+package jnpf.limsService.support;
+
+import jnpf.limsEntity.LimsSignUsageTarget;
+import jnpf.limsEntity.SignOpType;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+/** SIGN_USED 鐨勫箓绛夈�佸垎缁勪笌鎵归噺閮ㄥ垎鎴愬姛绾� JVM 鎺㈤拡銆� */
+public final class LimsSignUsageSupportProbe {
+
+    private static int passed;
+    private static int failed;
+
+    public static void main(String[] args) {
+        LimsSignUsageTarget a = target("A", "LS-001");
+        LimsSignUsageTarget b = target("B", "LS-001");
+        LimsSignUsageTarget c = target("C", "LS-002");
+
+        LimsSignUsageSupport.UsageGroup ordered =
+                LimsSignUsageSupport.groupByBizCode(Arrays.asList(a, b)).get(0);
+        LimsSignUsageSupport.UsageGroup reordered =
+                LimsSignUsageSupport.groupByBizCode(Arrays.asList(b, a, a)).get(0);
+        String key1 = LimsSignUsageSupport.clientEventId(
+                "sign-1", SignOpType.JIANCE_AUDIT_PASS, ordered);
+        String key2 = LimsSignUsageSupport.clientEventId(
+                "sign-1", SignOpType.JIANCE_AUDIT_PASS, reordered);
+        check("鐩爣椤哄簭鍜岄噸澶嶉」涓嶆敼鍙樺箓绛夐敭", key1.equals(key2), key1 + " vs " + key2);
+        check("骞傜瓑閿暱搴﹀浐瀹氫负 67", key1.length() == 67, key1);
+
+        String changed = LimsSignUsageSupport.clientEventId(
+                "sign-1", SignOpType.JIANCE_AUDIT_PASS,
+                LimsSignUsageSupport.groupByBizCode(Collections.singletonList(a)).get(0));
+        check("瀹為檯鐩爣鍙樺寲鏃跺箓绛夐敭鍙樺寲", !key1.equals(changed), changed);
+        check("涓氬姟妯″潡杩涘叆浜嬩欢鍒嗙粍", "LIMS-妫�娴嬩换鍔�".equals(ordered.getBizModule()),
+                ordered.getBizModule());
+
+        LimsSignUsageTarget otherModule = target("A", "LS-001");
+        otherModule.setBizModule("LIMS-鍏朵粬妯″潡");
+        String changedModule = LimsSignUsageSupport.clientEventId(
+                "sign-1", SignOpType.JIANCE_AUDIT_PASS,
+                LimsSignUsageSupport.groupByBizCode(Collections.singletonList(otherModule)).get(0));
+        check("涓氬姟妯″潡鍙樺寲鏃跺箓绛夐敭鍙樺寲", !key1.equals(changedModule), changedModule);
+
+        Map<String, Object> partial = LimsSignUsageSupport.signExtra(
+                Arrays.asList("A", "B"), Collections.singletonList(a));
+        List<?> requested = (List<?>) partial.get("requestedTargets");
+        List<?> affected = (List<?>) partial.get("affectedTargets");
+        check("璇锋眰鎽樿淇濈暀 A/B", requested.size() == 2, String.valueOf(requested));
+        check("閮ㄥ垎鎴愬姛鍙瀹為檯 A", affected.size() == 1
+                && String.valueOf(affected.get(0)).contains("targetId=A")
+                && !String.valueOf(affected.get(0)).contains("targetId=B"), String.valueOf(affected));
+        check("affected 涓庡疄闄呯洰鏍囨暟涓�鑷�", Integer.valueOf(1).equals(partial.get("affected")),
+                String.valueOf(partial));
+        check("瀹為檯缁撴灉鎽樿鎼哄甫涓氬姟妯″潡", String.valueOf(affected.get(0))
+                .contains("bizModule=LIMS-妫�娴嬩换鍔�"), String.valueOf(affected));
+
+        Map<String, Object> canonical1 = LimsSignUsageSupport.signExtra(
+                Arrays.asList("B", "A", "A"), Arrays.asList(b, a, a));
+        Map<String, Object> canonical2 = LimsSignUsageSupport.signExtra(
+                Arrays.asList("A", "B"), Arrays.asList(a, b));
+        check("绛惧悕浣跨敤鎽樿涓嶅彈鐩爣椤哄簭鍜岄噸澶嶉」褰卞搷",
+                canonical1.equals(canonical2), canonical1 + " vs " + canonical2);
+
+        List<LimsSignUsageSupport.UsageGroup> groups =
+                LimsSignUsageSupport.groupByBizCode(Arrays.asList(a, b, c));
+        check("璺ㄤ袱涓� bizCode 鐢熸垚涓や釜浜嬩欢缁�", groups.size() == 2, String.valueOf(groups.size()));
+        check("鍚� bizCode 鐨勪袱涓洰鏍囧湪鍚屼竴缁�", groups.get(0).getTargets().size() == 2,
+                String.valueOf(groups.get(0).getTargets().size()));
+        check("affected=0 涓嶄骇鐢熶簨浠剁粍",
+                LimsSignUsageSupport.groupByBizCode(Collections.emptyList()).isEmpty(), "浠嶆湁鍒嗙粍");
+
+        System.out.println("=== SIGN_USED 鏂█锛�" + passed + " 閫氳繃 / " + failed + " 澶辫触 ===");
+        System.exit(failed == 0 ? 0 : 1);
+    }
+
+    private static LimsSignUsageTarget target(String id, String bizCode) {
+        return LimsSignUsageTarget.builder()
+                .targetTable("lims_jianyan_xiang")
+                .targetId(id)
+                .bizType("JIANCE_TASK")
+                .bizModule("LIMS-妫�娴嬩换鍔�")
+                .bizCode(bizCode)
+                .build();
+    }
+
+    private static void check(String name, boolean ok, String detail) {
+        if (ok) {
+            passed++;
+            System.out.println("  [PASS] " + name);
+        } else {
+            failed++;
+            System.out.println("  [FAIL] " + name + " -- " + detail);
+        }
+    }
+
+    private LimsSignUsageSupportProbe() {
+    }
+}

--
Gitblit v1.8.0