diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java index 81b95b30..7775a849 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsContractSyncSupport.java @@ -112,6 +112,7 @@ public class HcsContractSyncSupport { private final HcsAttachmentSupport hcsAttachmentSupport; private final HcsExeStageSyncSupport hcsExeStageSyncSupport; private final HcsContractSpecSyncSupport hcsContractSpecSyncSupport; + private final HcsCreditCheckSupport hcsCreditCheckSupport; /** * 合同金蝶同步结果接收处理(合规 contractKingdee/result 推送,D903,投送人/钢厂/结算中心合同共用): @@ -279,16 +280,16 @@ public class HcsContractSyncSupport { RiskResult riskPartyB = queryRisk(contractManage, "乙方", contractManage.getPartyB()); // 风险等级:甲乙双方取先查到的非空值(无法量化比较,留痕双方原始值,联调后细化) String riskLevel = StringUtil.isNotBlank(riskPartyA.riskLevel()) ? riskPartyA.riskLevel() : riskPartyB.riskLevel(); - // 黑名单状态:任一方黑名单即为是 - boolean blacklist = riskPartyA.blacklist() || riskPartyB.blacklist(); + // 黑名单状态:任一方金蝶黑名单(A801-5)命中即为是(复用 HcsCreditCheckSupport.isKingdeeBlacklistHit 公共口径) + boolean blacklist = riskPartyA.kingdeeHit() || riskPartyB.kingdeeHit(); contractManage.setHcsRiskLevel(riskLevel); contractManage.setKingdeeBlackStatus(blacklist ? BLACK_STATUS_YES : "no"); contractManage.setHcsRiskTime(LocalDateTime.now()); contractManageMapper.updateById(contractManage); boolean risky = HcsSyncConstant.RISK_LEVEL_HIGH.equals(riskLevel) || blacklist; - log.info("HCS合同风险校验完成:contractNo={},甲方[{}={}/{}],乙方[{}={}/{}],高风险/黑名单={}", - contractManage.getContractNo(), contractManage.getPartyA(), riskPartyA.blackStatus(), riskPartyA.riskLevel(), - contractManage.getPartyB(), riskPartyB.blackStatus(), riskPartyB.riskLevel(), risky); + log.info("HCS合同风险校验完成:contractNo={},甲方[金蝶黑名单={},等级={}],乙方[金蝶黑名单={},等级={}],高风险/黑名单={}", + contractManage.getContractNo(), riskPartyA.kingdeeHit(), riskPartyA.riskLevel(), + riskPartyB.kingdeeHit(), riskPartyB.riskLevel(), risky); return risky; } @@ -346,13 +347,13 @@ public class HcsContractSyncSupport { if (customerArchive == null) { writeCheckLog(contractManage, HcsSyncConstant.CHECK_RESULT_SKIP, standing + "方[" + partyName + "]反查不到客商编号,跳过风险校验(§9-U6)", null); - return new RiskResult(null, null, false); + return new RiskResult(false, null); } // 内部组织类型客商默认无风险,不调 C101-1(与展示/提交/付款链路口径一致) if (HcsCreditCheckSupport.isInternalCustomer(customerArchive)) { writeCheckLog(contractManage, HcsSyncConstant.CHECK_RESULT_SKIP, standing + "方[" + partyName + "]为内部组织客商,默认无风险跳过校验", null); - return new RiskResult(null, null, false); + return new RiskResult(false, null); } HcsRiskQueryDTO param = new HcsRiskQueryDTO(); // 【必填】客商编号:按甲乙方名称反查 CustomerArchive 客商编码(§9-U6) @@ -364,12 +365,12 @@ public class HcsContractSyncSupport { throw new HcsException("C101-1 客商风险查询失败:" + (result == null ? "响应为空" : result.getMsg())); } HcsRiskVO risk = result.getData(); - String blackStatus = risk == null ? null : risk.getFdBlackStatus(); String riskLevel = risk == null ? null : risk.getFdRiskLevel(); - boolean blacklist = BLACK_STATUS_YES.equalsIgnoreCase(blackStatus); - writeCheckLog(contractManage, blacklist ? HcsSyncConstant.CHECK_RESULT_FAIL : HcsSyncConstant.CHECK_RESULT_PASS, - standing + "方[" + partyName + "]黑名单=" + blackStatus + ",风险等级=" + riskLevel, result.getTraceId()); - return new RiskResult(blackStatus, riskLevel, blacklist); + // 黑名单判定复用公共方法:仅以金蝶黑名单(A801-5)命中为准,C101-1 黑名单状态不参与 + boolean kingdeeHit = hcsCreditCheckSupport.isKingdeeBlacklistHit(customerArchive.getUnifiedCreditCode()); + writeCheckLog(contractManage, kingdeeHit ? HcsSyncConstant.CHECK_RESULT_FAIL : HcsSyncConstant.CHECK_RESULT_PASS, + standing + "方[" + partyName + "]金蝶黑名单=" + kingdeeHit + ",风险等级=" + riskLevel, result.getTraceId()); + return new RiskResult(kingdeeHit, riskLevel); } /** @@ -780,8 +781,8 @@ public class HcsContractSyncSupport { } /** - * 单方风险查询结果 + * 单方风险查询结果(kingdeeHit=金蝶黑名单 A801-5 是否命中,公共口径见 {@link HcsCreditCheckSupport#isKingdeeBlacklistHit}) */ - private record RiskResult(String blackStatus, String riskLevel, boolean blacklist) { + private record RiskResult(boolean kingdeeHit, String riskLevel) { } } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java index ef42c4ac..a9371bec 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/support/hcs/HcsCreditCheckSupport.java @@ -358,6 +358,22 @@ public class HcsCreditCheckSupport { return StringUtil.isBlank(levelName) ? null : levelName; } + /** + * 金蝶黑名单命中判定(A801-5,公共方法):按统一社会信用代码/税号查询, + * 黑名单记录存在即命中;查询失败静默返回 false(queryBlacklistByCodes 内记 error 日志备查)。 + * 展示组装(buildRiskDetail)、列表筛选、合同推送链路(checkRelativeRisk)统一复用本方法口径 + * + * @param creditCode 统一社会信用代码/税号 + * @return 是否命中金蝶黑名单 + */ + public boolean isKingdeeBlacklistHit(String creditCode) { + if (StringUtil.isBlank(creditCode)) { + return false; + } + String code = creditCode.trim().toUpperCase(); + return this.queryBlacklistByCodes(List.of(code)).get(code) != null; + } + /** * 组装客商风险明细文案(后台统一组装、前端只展示;列表悬浮明细与表单实时提示共用本方法,口径一致), * 格式:【客商名称】:被列入外部黑名单(失信类别:xx);{列入事由};风险等级:xx,分段说明: