fix: 修复黑名单客商风险提示不显示并支持新增客商按编号查询

This commit is contained in:
刘泉佳
2026-10-30 20:09:52 +08:00
parent 65a53a56b6
commit 912a15e0ad
3 changed files with 35 additions and 8 deletions
@@ -63,6 +63,9 @@ public class CustomerRiskVO implements Serializable {
@Schema(description = "风险等级名称(服务端转义:黑名单/高风险/中风险/低风险,黑名单优先;无等级为空)")
private String riskLevelName;
@Schema(description = "是否命中金蝶黑名单(A801-5,黑名单展示口径;红字细分由前端按等级+本标记翻译)")
private Boolean kingdeeBlackHit;
@Schema(description = "是否高风险/黑名单客商(外部客商专用,内部组织恒为 false)")
private Boolean risky;
@@ -216,13 +216,15 @@ public class HcsSyncController {
/**
* 客商风险等级查询(C101-1,展示用,前端接入设计 §3.3;强制校验仍在推送/付款链路):
* 内部组织类型客商默认无风险不调合规,外部客商高风险/黑名单返回提示文案
* 内部组织类型客商默认无风险不调合规,外部客商高风险/黑名单返回提示文案;
* creditCode 供新增客商(档案未落库)查金蝶黑名单兜底,档案存在时以档案为准
*/
@GetMapping("/risk")
@ApiOperationSupport(order = 10)
@Operation(summary = "客商风险等级查询", description = "C101-1 按客商编号查询风险等级与黑名单状态(展示用),内部客商默认无风险,高风险/黑名单返回风险提示文案,结果留痕")
public R<CustomerRiskVO> risk(@Parameter(description = "客商编号", required = true) @RequestParam String customerCode) {
return R.data(hcsCreditCheckSupport.queryCustomerRisk(customerCode));
@Operation(summary = "客商风险等级查询", description = "C101-1 按客商编号查询风险等级与黑名单状态(展示用),内部客商默认无风险,高风险/黑名单返回风险提示文案,结果留痕;creditCode 为新增客商场景金蝶黑名单查询兜底")
public R<CustomerRiskVO> risk(@Parameter(description = "客商编号", required = true) @RequestParam String customerCode,
@Parameter(description = "统一社会信用代码(新增客商档案未落库时兜底查金蝶黑名单)") @RequestParam(required = false) String creditCode) {
return R.data(hcsCreditCheckSupport.queryCustomerRisk(customerCode, creditCode));
}
/**
@@ -205,12 +205,26 @@ public class HcsCreditCheckSupport {
/**
* 客商风险查询(C101-1,展示与提交校验共用,前端接入设计 §3.3):
* 内部组织类型客商默认无风险(不调 C101-1);外部客商按编号查询风险等级与黑名单状态并留痕;
* 金蝶黑名单(A801-5)命中同样判定为风险客商(risky=true,C101-1 空数据不漏提示);
* riskTip 经 {@link #buildRiskDetail} 统一组装(等级 + 金蝶黑名单失信类别/列入事由),与列表悬浮明细同口径
*
* @param customerCode 客商编号
* @return 风险展示信息(customerKind/fdBlackStatus/fdRiskLevel/risky/riskTip)
*/
public CustomerRiskVO queryCustomerRisk(String customerCode) {
return this.queryCustomerRisk(customerCode, null);
}
/**
* 客商风险查询(带信用代码,新增客商档案表单实时校验用):
* 金蝶带出的客商尚未落库(本地档案反查不到)时,信用代码无法从档案取得,
* 由前端将金蝶档案带出的统一社会信用代码随编号一并传入,保证 A801-5 黑名单段不缺失
*
* @param customerCode 客商编号(金蝶档案带出的编码)
* @param creditCode 统一社会信用代码(档案存在时以档案为准,档案缺失时兜底入参)
* @return 风险展示信息
*/
public CustomerRiskVO queryCustomerRisk(String customerCode, String creditCode) {
if (StringUtil.isBlank(customerCode)) {
throw new ServiceException("客商编号不能为空");
}
@@ -230,12 +244,20 @@ public class HcsCreditCheckSupport {
}
RelativeRiskResult fetch = this.fetchRelativeRisk(customerCode, customerName);
CustomerRiskVO riskVO = fetch.risk();
// 表单实时提示与列表明细统一组装口径:追加金蝶黑名单段(A801-5 按档案信用代码查询,失败静默缺失)
String creditCode = customerArchive == null ? null : customerArchive.getUnifiedCreditCode();
BfiBlacklistVO hit = StringUtil.isBlank(creditCode) ? null
: this.queryBlacklistByCodes(List.of(creditCode.trim().toUpperCase())).get(creditCode.trim().toUpperCase());
// 表单实时提示与列表明细统一组装口径:追加金蝶黑名单段(A801-5 按信用代码查询,失败静默缺失;
// 档案缺失(新增客商实时校验)时兜底用入参信用代码)
String archiveCreditCode = customerArchive == null ? null : customerArchive.getUnifiedCreditCode();
String effectiveCreditCode = StringUtil.isNotBlank(archiveCreditCode) ? archiveCreditCode : creditCode;
BfiBlacklistVO hit = StringUtil.isBlank(effectiveCreditCode) ? null
: this.queryBlacklistByCodes(List.of(effectiveCreditCode.trim().toUpperCase())).get(effectiveCreditCode.trim().toUpperCase());
String blackCategory = hit == null ? null
: (Func.isEmpty(hit.getAwrpCombofieldTitle()) ? hit.getAwrpCombofield() : hit.getAwrpCombofieldTitle());
// 黑名单判定仅以金蝶黑名单(A801-5)命中为准:C101-1 可能对已列入黑名单的客商返回空数据,命中时必须置 risky=true 才能触发前端提示;
// 命中结果落 kingdeeBlackHit 原始标记,红字文案细分(黑名单/高风险)由前端翻译
if (hit != null) {
riskVO.setRisky(Boolean.TRUE);
riskVO.setKingdeeBlackHit(Boolean.TRUE);
}
riskVO.setRiskTip(buildRiskDetail(customerName, riskVO.getFdRiskLevel(),
blackCategory, hit == null ? null : hit.getAwrpTextareafield()));
try {