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 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 canonical1 = LimsSignUsageSupport.signExtra( Arrays.asList("B", "A", "A"), Arrays.asList(b, a, a)); Map canonical2 = LimsSignUsageSupport.signExtra( Arrays.asList("A", "B"), Arrays.asList(a, b)); check("签名使用摘要不受目标顺序和重复项影响", canonical1.equals(canonical2), canonical1 + " vs " + canonical2); List 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() { } }