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-biz-common/jnpf-biz-common-audit/src/test/java/jnpf/bizcommon/audit/service/value/JnpfUserFieldValueResolverProbe.java |  150 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 150 insertions(+), 0 deletions(-)

diff --git a/jnpf-biz-common/jnpf-biz-common-audit/src/test/java/jnpf/bizcommon/audit/service/value/JnpfUserFieldValueResolverProbe.java b/jnpf-biz-common/jnpf-biz-common-audit/src/test/java/jnpf/bizcommon/audit/service/value/JnpfUserFieldValueResolverProbe.java
new file mode 100644
index 0000000..1f48a72
--- /dev/null
+++ b/jnpf-biz-common/jnpf-biz-common-audit/src/test/java/jnpf/bizcommon/audit/service/value/JnpfUserFieldValueResolverProbe.java
@@ -0,0 +1,150 @@
+package jnpf.bizcommon.audit.service.value;
+
+import jnpf.bizcommon.audit.entity.model.AuditFieldDiffViewVO;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/** userSelect 鐢ㄦ埛 id 鈫� 銆岀湡瀹炲鍚�/璐﹀彿銆嶇殑鎵归噺瑙f瀽銆佹帶浠剁被鍨嬪垽鎹笌绉熸埛杈圭晫鎺㈤拡銆� */
+public final class JnpfUserFieldValueResolverProbe {
+
+    private static int passed;
+    private static int failed;
+
+    public static void main(String[] args) {
+        CountingLookup lookup = new CountingLookup();
+        JnpfUserFieldValueResolver resolver = new JnpfUserFieldValueResolver(lookup);
+
+        List<AuditFieldDiffViewVO> fields = Arrays.asList(
+                field("tijiao_ren", "userSelect", "", "u-admin"),
+                field("fuhe_ren", "UserSelect", "u-admin", "u-ys"),
+                field("chouyang_ren", "userSelect", "", "[\"u-ys\",\"u-gone\"]"),
+                // 涓や釜闈� userSelect 骞叉壈椤瑰埢鎰忕敤**鐙湁**鐨勫�硷細鑻ョ敤 u-admin 杩欑宸茶鐪熷疄鐢ㄦ埛
+                // 瀛楁鏀堕泦杩囩殑 id锛屽嵆渚胯В鏋愬櫒閿欒鍦版妸瀹冧滑涔熸敹杩涘幓锛孲et 鍘婚噸鍚庢潯鏁扮汗涓濅笉鍔紝
+                // 鏂█灏辨垚浜嗘案杩滆浆涓嶇孩鐨勬憜璁撅紙L077 鍙樹綋 5/8 鍚屾闄烽槺锛夈��
+                field("beizhu", "input", "", "u-only-in-beizhu"),
+                field("zhuangtai", "select", "", "u-only-in-zhuangtai"));
+
+        resolver.resolve(new AuditFieldValueContext("lims_ceshi_huichuan", "0", null), fields);
+
+        check("鏁存壒鍙煡涓�娆″簱", lookup.calls == 1, "calls=" + lookup.calls);
+        check("绉熸埛杈圭晫閫忎紶杩涙煡璇�", "0".equals(lookup.lastTenantId), String.valueOf(lookup.lastTenantId));
+
+        // 鍒ゆ嵁鏄帶浠剁被鍨嬩笉鏄瓧娈靛悕锛氶潪 userSelect 鐨勫垪鍗充究瀛樼潃鐢ㄦ埛 id 涔熶笉纰帮紝
+        // 鍚﹀垯浼氭妸鎭板ソ绛変簬鏌愪釜鐢ㄦ埛 id 鐨勬櫘閫氭枃鏈鏀规垚浜哄悕銆�
+        check("闈� userSelect 鎺т欢涓嶈瑙f瀽",
+                fields.get(3).getNewDisplay() == null && fields.get(4).getNewDisplay() == null,
+                fields.get(3).getNewDisplay() + " / " + fields.get(4).getNewDisplay());
+        check("闈� userSelect 鎺т欢鐨勫�间笉杩� ID 鏀堕泦",
+                lookup.requestedIds.equals(Arrays.asList("u-admin", "u-ys", "u-gone")),
+                lookup.requestedIds.toString());
+
+        check("灞曠ず鏍煎紡涓� realName/account", "绠$悊鍛�/admin".equals(fields.get(0).getNewDisplay()),
+                fields.get(0).getNewDisplay());
+        check("鎺т欢绫诲瀷澶у皬鍐欎笉鏁忔劅", "yangsui/ys0001".equals(fields.get(1).getNewDisplay()),
+                fields.get(1).getNewDisplay());
+        check("oldData 涓� newData 涓や晶閮借В鏋�", "绠$悊鍛�/admin".equals(fields.get(1).getOldDisplay()),
+                fields.get(1).getOldDisplay());
+        check("绌哄�艰В鏋愭垚绌轰覆鑰屼笉鏄�屽悕绉版殏涓嶅彲鐢ㄣ��", "".equals(fields.get(0).getOldDisplay()),
+                fields.get(0).getOldDisplay());
+        check("澶氶�夋寜璇锋眰椤哄簭瑙f瀽锛屽崟椤规煡涓嶅埌鎵嶅洖钀�",
+                "yangsui/ys0001銆佸悕绉版殏涓嶅彲鐢�".equals(fields.get(2).getNewDisplay()),
+                fields.get(2).getNewDisplay());
+
+        // 鍓嶅簭瑙f瀽鍣紙琛ㄤ笓鐢�/瀛楀吀锛夊凡缁忓~杩� display 鐨勫瓧娈典笉閲嶅鏌ュ簱鈥斺��
+        // @Order 寤虹珛鐨勪紭鍏堢骇闈犺繖涓� if 鎵嶈惤寰椾笅鍘汇��
+        CountingLookup skipLookup = new CountingLookup();
+        AuditFieldDiffViewVO resolved = field("qingyan_ren", "userSelect", "", "u-admin");
+        resolved.setNewDisplay("绠$悊鍛�");
+        new JnpfUserFieldValueResolver(skipLookup).resolve(
+                new AuditFieldValueContext("lims_qingyandan", "0", null),
+                Collections.singletonList(resolved));
+        check("鍓嶅簭瑙f瀽鍣ㄥ凡濉殑 display 涓嶈瑕嗙洊锛屼篃涓嶈Е鍙戞煡搴�",
+                skipLookup.calls == 0 && "绠$悊鍛�".equals(resolved.getNewDisplay()),
+                skipLookup.calls + " / " + resolved.getNewDisplay());
+
+        // 绉熸埛鎷夸笉鍒版椂瀹佸彲涓嶈В鏋愶紝涔熶笉鍋氫竴娆℃棤杈圭晫鐨勫叏搴撴煡璇€��
+        CountingLookup blankTenant = new CountingLookup();
+        new JnpfUserFieldValueResolver(blankTenant).resolve(
+                new AuditFieldValueContext("lims_ceshi_huichuan", "", null),
+                Collections.singletonList(field("tijiao_ren", "userSelect", "", "u-admin")));
+        check("绌虹鎴� fail-closed锛堜笉鏌ュ簱锛�", blankTenant.calls == 0,
+                String.valueOf(blankTenant.calls));
+
+        check("supports 瀵逛换鎰忚〃鎭掍负 true锛坲serSelect 鏄钩鍙版帶浠讹級",
+                resolver.supports("lims_ceshi_huichuan") && resolver.supports("any_table")
+                        && resolver.supports(null),
+                "supports 鏀剁獎浜嗛�傜敤琛�");
+
+        // 灞曠ず鏍煎紡瑁呴厤鏈韩锛堥獙鏀舵爣鍑嗐�岀鐞嗗憳/admin銆嶇殑鐩存帴鍒ゆ嵁锛�
+        check("userDisplay 鎷� realName/account",
+                "绠$悊鍛�/admin".equals(JnpfUserFieldValueResolver.userDisplay("绠$悊鍛�", "admin")),
+                JnpfUserFieldValueResolver.userDisplay("绠$悊鍛�", "admin"));
+        check("userDisplay 缂鸿处鍙锋椂涓嶇暀瀛ら浂闆舵枩鏉�",
+                "绠$悊鍛�".equals(JnpfUserFieldValueResolver.userDisplay("绠$悊鍛�", null))
+                        && "绠$悊鍛�".equals(JnpfUserFieldValueResolver.userDisplay("绠$悊鍛�", "  ")),
+                JnpfUserFieldValueResolver.userDisplay("绠$悊鍛�", null));
+        check("userDisplay 缂哄鍚嶆椂閫�鍥炶处鍙�",
+                "admin".equals(JnpfUserFieldValueResolver.userDisplay(null, "admin")),
+                JnpfUserFieldValueResolver.userDisplay(null, "admin"));
+        check("userDisplay 涓よ竟閮界┖杩斿洖 null锛堣皟鐢ㄦ柟鎹涓嶅叆 map锛�",
+                JnpfUserFieldValueResolver.userDisplay(null, null) == null,
+                String.valueOf(JnpfUserFieldValueResolver.userDisplay(null, null)));
+
+        // @Order 甯搁噺鐨勭浉瀵规搴忓嵆瑙f瀽浼樺厛绾э紱鏁板�煎啓鍙嶄細璁╅�氱敤瑙f瀽鍣ㄦ姠鍦ㄨ〃涓撶敤涔嬪墠銆�
+        check("瑙f瀽鍣ㄤ紭鍏堢骇 琛ㄤ笓鐢� < 瀛楀吀 < 鐢ㄦ埛鍏滃簳",
+                LimsQingyandanFieldValueResolver.ORDER < JnpfDictionaryFieldValueResolver.ORDER
+                        && JnpfDictionaryFieldValueResolver.ORDER < JnpfUserFieldValueResolver.ORDER,
+                LimsQingyandanFieldValueResolver.ORDER + " / "
+                        + JnpfDictionaryFieldValueResolver.ORDER + " / "
+                        + JnpfUserFieldValueResolver.ORDER);
+
+        System.out.println("=== 鐢ㄦ埛瀛楁瑙f瀽鏂█锛�" + passed + " 閫氳繃 / " + failed + " 澶辫触 ===");
+        System.exit(failed == 0 ? 0 : 1);
+    }
+
+    private static AuditFieldDiffViewVO field(String name, String componentType,
+                                              String oldData, String newData) {
+        AuditFieldDiffViewVO field = new AuditFieldDiffViewVO();
+        field.setField(name);
+        field.setComponentType(componentType);
+        field.setOldData(oldData);
+        field.setNewData(newData);
+        return field;
+    }
+
+    private static final class CountingLookup implements JnpfUserFieldValueResolver.UserLookup {
+        private int calls;
+        private String lastTenantId;
+        private final List<String> requestedIds = new ArrayList<>();
+
+        @Override
+        public Map<String, String> names(String tenantId, Set<String> ids) {
+            calls++;
+            lastTenantId = tenantId;
+            requestedIds.addAll(ids);
+            Map<String, String> result = new LinkedHashMap<>();
+            result.put("u-admin", "绠$悊鍛�/admin");
+            result.put("u-ys", "yangsui/ys0001");
+            return result;   // u-gone 鍒绘剰缂哄腑锛氭ā鎷熺敤鎴疯鍒�/鏌ヤ笉鍒�
+        }
+    }
+
+    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 JnpfUserFieldValueResolverProbe() {
+    }
+}

--
Gitblit v1.8.0