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/main/java/jnpf/bizcommon/audit/service/support/AuditDiffKey.java |   63 +++++++++++++++++++++++++++++++
 1 files changed, 63 insertions(+), 0 deletions(-)

diff --git a/jnpf-biz-common/jnpf-biz-common-audit/src/main/java/jnpf/bizcommon/audit/service/support/AuditDiffKey.java b/jnpf-biz-common/jnpf-biz-common-audit/src/main/java/jnpf/bizcommon/audit/service/support/AuditDiffKey.java
new file mode 100644
index 0000000..2e2051e
--- /dev/null
+++ b/jnpf-biz-common/jnpf-biz-common-audit/src/main/java/jnpf/bizcommon/audit/service/support/AuditDiffKey.java
@@ -0,0 +1,63 @@
+package jnpf.bizcommon.audit.service.support;
+
+import java.util.Locale;
+
+/** 涓哄悓鍚嶅瓧娈甸檮鍔犵墿鐞嗚〃浣滅敤鍩熺殑鍙寔涔呭寲澶嶅悎閿�� */
+public final class AuditDiffKey {
+
+    private static final String SCOPED_PREFIX = "@table:";
+
+    private AuditDiffKey() {
+    }
+
+    /**
+     * 闀垮害鍓嶇紑璁╄〃鍚嶅拰瀛楁鍚嶇殑杈圭晫鏃犳涔夛紝鍚屾椂鍙娇鐢� PostgreSQL JSONB 鍙帴鍙楃殑鍙墦鍗板瓧绗︺��
+     */
+    public static String of(String targetTable, String field) {
+        String normalizedField = normalize(field);
+        String normalizedTable = normalize(targetTable);
+        if (normalizedTable == null) {
+            return normalizedField == null ? "" : normalizedField;
+        }
+        String effectiveField = normalizedField == null ? "" : normalizedField;
+        return SCOPED_PREFIX + normalizedTable.length() + ":" + normalizedTable + ":" + effectiveField;
+    }
+
+    public static boolean isScoped(String key) {
+        if (key == null || !key.startsWith(SCOPED_PREFIX)) {
+            return false;
+        }
+        int lengthEnd = key.indexOf(':', SCOPED_PREFIX.length());
+        if (lengthEnd < 0) {
+            return false;
+        }
+        try {
+            int tableLength = Integer.parseInt(key.substring(SCOPED_PREFIX.length(), lengthEnd));
+            long fieldSeparator = (long) lengthEnd + 1L + tableLength;
+            return tableLength >= 0 && fieldSeparator < key.length()
+                    && key.charAt((int) fieldSeparator) == ':';
+        } catch (NumberFormatException ignored) {
+            return false;
+        }
+    }
+
+    /** 鍙敤浜庡吋瀹瑰凡鍔犺浇鍒板唴瀛樼殑鏃ч敭锛涜繑鍥炲�间笉浼氬啀鎼哄甫鏃� NUL 鍒嗛殧绗︺�� */
+    public static String normalizeStored(String key) {
+        if (key == null) {
+            return null;
+        }
+        int separator = key.indexOf(Character.MIN_VALUE);
+        if (separator < 0) {
+            return key;
+        }
+        return of(key.substring(0, separator), key.substring(separator + 1));
+    }
+
+    private static String normalize(String value) {
+        if (value == null) {
+            return null;
+        }
+        String normalized = value.trim().toLowerCase(Locale.ROOT);
+        return normalized.isEmpty() ? null : normalized;
+    }
+}

--
Gitblit v1.8.0