package jnpf.audit.sdk.aspect; import com.alibaba.fastjson.JSON; import java.io.Serializable; import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; /** AuditLog 批量主键归一化、逐记录 diff 与快照契约检查。 */ public final class AuditLogBatchDiffChecks { private static int passed; private static int failed; public static void main(String[] args) { List ids = AuditLogAspect.normalizeSerializableIds( Arrays.asList(" row-1 ", "row-2", "", "row-1", null)); check("批量主键去空、去重并保持顺序", ids.equals(Arrays.asList("row-1", "row-2"))); check("逗号分隔主键可归一化", AuditLogAspect.normalizeSerializableIds("row-1,row-2") .equals(Arrays.asList("row-1", "row-2"))); List tenIds = AuditLogAspect.normalizeSerializableIds( new String[] {"row-1", "row-2", "row-3", "row-4", "row-5", "row-6", "row-7", "row-8", "row-9", "row-10"}); Map> before = new LinkedHashMap<>(); Map> after = new LinkedHashMap<>(); for (Serializable id : tenIds) { before.put(id, row("pending")); after.put(id, row("done")); } String fieldDiffs = AuditLogAspect.batchFieldDiffs( "lims_task", tenIds, before, after); List diffs = JSON.parseArray(fieldDiffs, Map.class); check("10条记录修改同一字段保留10条差异", diffs.size() == 10); check("每条差异携带物理表和记录主键", diffs.stream().allMatch(item -> "lims_task".equals(item.get("targetTable")) && item.get("targetId") != null)); check("批量差异保留真实前后值", diffs.stream().allMatch(item -> "pending".equals(item.get("oldData")) && "done".equals(item.get("newData")))); String snapshot = AuditLogAspect.batchSnapshot(tenIds, after); List snapshots = JSON.parseArray(snapshot, Map.class); check("批量操作后快照保留10条记录", snapshots.size() == 10); check("每条快照按 targetId 包装数据", snapshots.stream().allMatch(item -> item.get("targetId") != null && item.get("data") instanceof Map)); System.out.println("=== AuditLog 批量差异检查:" + passed + " 通过 / " + failed + " 失败 ==="); if (failed > 0) { System.exit(1); } } private static Map row(String status) { Map row = new LinkedHashMap<>(); row.put("status", status); return row; } private static void check(String name, boolean ok) { if (ok) { passed++; System.out.println(" [PASS] " + name); } else { failed++; System.out.println(" [FAIL] " + name); } } private AuditLogBatchDiffChecks() { } }