feat: 客商提审接入国资委黑名单校验(A801-5)
- submitApproval 前置实时查询金蝶黑名单(enable=1),按统一社会信用代码大写精确匹配 - 禁止交易类(A)硬拦截报错并提示失信类别与列入事由;风险警示类(B)默认放行告警,thirdparty.bfi.blacklist.blockRiskWarning=true 时一并拦截 - 黑名单查询异常不阻断准入,记 error 日志放行(金蝶可用性口径待联调确认)
This commit is contained in:
+49
@@ -45,6 +45,7 @@ import org.springblade.thirdparty.bfi.pojo.dto.BfiCustomerQueryDTO;
|
|||||||
import org.springblade.thirdparty.bfi.pojo.vo.BfiBillSaveResultErrorVO;
|
import org.springblade.thirdparty.bfi.pojo.vo.BfiBillSaveResultErrorVO;
|
||||||
import org.springblade.thirdparty.bfi.pojo.vo.BfiBillSaveResultItemVO;
|
import org.springblade.thirdparty.bfi.pojo.vo.BfiBillSaveResultItemVO;
|
||||||
import org.springblade.thirdparty.bfi.pojo.vo.BfiBillSaveResultVO;
|
import org.springblade.thirdparty.bfi.pojo.vo.BfiBillSaveResultVO;
|
||||||
|
import org.springblade.thirdparty.bfi.pojo.vo.BfiBlacklistVO;
|
||||||
import org.springblade.thirdparty.bfi.pojo.vo.BfiCustomerVO;
|
import org.springblade.thirdparty.bfi.pojo.vo.BfiCustomerVO;
|
||||||
import org.springblade.thirdparty.bfi.pojo.vo.BfiPageVO;
|
import org.springblade.thirdparty.bfi.pojo.vo.BfiPageVO;
|
||||||
import org.springblade.thirdparty.bfi.service.IBfiService;
|
import org.springblade.thirdparty.bfi.service.IBfiService;
|
||||||
@@ -229,6 +230,13 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl<CustomerArchiveM
|
|||||||
@Value("${thirdParty.bfi.customer.lockLeaseSeconds:1800}")
|
@Value("${thirdParty.bfi.customer.lockLeaseSeconds:1800}")
|
||||||
private long customerSyncLockLeaseSeconds;
|
private long customerSyncLockLeaseSeconds;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 客商提审命中金蝶黑名单风险警示类(B)时是否一并拦截;
|
||||||
|
* 默认 false 仅放行告警,禁止交易类(A)始终拦截,与集团合规口径确认后可调整
|
||||||
|
*/
|
||||||
|
@Value("${thirdparty.bfi.blacklist.blockRiskWarning:false}")
|
||||||
|
private boolean blacklistBlockRiskWarning;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IPage<CustomerArchiveVO> selectCustomerArchivePage(IPage<CustomerArchiveVO> page, CustomerArchiveVO customer) {
|
public IPage<CustomerArchiveVO> selectCustomerArchivePage(IPage<CustomerArchiveVO> page, CustomerArchiveVO customer) {
|
||||||
List<CustomerArchiveVO> records = baseMapper.selectCustomerArchivePage(page, customer, currentScopeUserId());
|
List<CustomerArchiveVO> records = baseMapper.selectCustomerArchivePage(page, customer, currentScopeUserId());
|
||||||
@@ -303,6 +311,7 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl<CustomerArchiveM
|
|||||||
validateBase(detail);
|
validateBase(detail);
|
||||||
validateScoreForApproval(detail);
|
validateScoreForApproval(detail);
|
||||||
validateApproval(detail);
|
validateApproval(detail);
|
||||||
|
validateBlacklist(detail);
|
||||||
CustomerArchive before = Objects.requireNonNull(BeanUtil.copyProperties(detail, CustomerArchive.class));
|
CustomerArchive before = Objects.requireNonNull(BeanUtil.copyProperties(detail, CustomerArchive.class));
|
||||||
CustomerArchive after = copyCustomer(before);
|
CustomerArchive after = copyCustomer(before);
|
||||||
after.setApprovalStatus(APPROVAL_REVIEWING);
|
after.setApprovalStatus(APPROVAL_REVIEWING);
|
||||||
@@ -1041,6 +1050,46 @@ public class CustomerArchiveServiceImpl extends BaseServiceImpl<CustomerArchiveM
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 国资委黑名单校验(A801-5):客商提审进入准入审批前实时查询金蝶黑名单,
|
||||||
|
* 按统一社会信用代码精确匹配;命中禁止交易类(A)硬拦截,
|
||||||
|
* 风险警示类(B)默认放行告警、可经 {@code thirdparty.bfi.blacklist.blockRiskWarning} 配置拦截,
|
||||||
|
* 其他类别放行告警;黑名单查询异常不阻断准入(放行并记录错误日志),金蝶可用性口径待联调确认
|
||||||
|
*
|
||||||
|
* @param customer 客商
|
||||||
|
*/
|
||||||
|
private void validateBlacklist(CustomerArchiveVO customer) {
|
||||||
|
String creditCode = customer.getUnifiedCreditCode();
|
||||||
|
if (Func.isEmpty(creditCode)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
List<BfiBlacklistVO> blacklist;
|
||||||
|
try {
|
||||||
|
blacklist = bfiService.queryBlacklist("1");
|
||||||
|
} catch (Exception exception) {
|
||||||
|
log.error("查询金蝶黑名单失败,黑名单校验放行,fullName={},unifiedCreditCode={}",
|
||||||
|
customer.getFullName(), creditCode, exception);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String code = creditCode.trim().toUpperCase();
|
||||||
|
BfiBlacklistVO hit = blacklist.stream()
|
||||||
|
.filter(item -> Func.isNotEmpty(item.getNumber()) && code.equals(item.getNumber().trim().toUpperCase()))
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
if (hit == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
String category = Func.isEmpty(hit.getAwrpCombofieldTitle()) ? hit.getAwrpCombofield() : hit.getAwrpCombofieldTitle();
|
||||||
|
boolean forbidden = "A".equals(hit.getAwrpCombofield());
|
||||||
|
boolean riskWarning = "B".equals(hit.getAwrpCombofield());
|
||||||
|
if (forbidden || (riskWarning && blacklistBlockRiskWarning)) {
|
||||||
|
throw new ServiceException(String.format("客商【%s】在国资委黑名单中(失信类别:%s,列入事由:%s),不允许提交准入审批",
|
||||||
|
customer.getFullName(), category, hit.getAwrpTextareafield()));
|
||||||
|
}
|
||||||
|
log.warn("客商命中金蝶黑名单风险警示类,放行,fullName={},unifiedCreditCode={},失信类别={},列入事由={}",
|
||||||
|
customer.getFullName(), creditCode, category, hit.getAwrpTextareafield());
|
||||||
|
}
|
||||||
|
|
||||||
private void validateUnique(CustomerArchiveVO customer) {
|
private void validateUnique(CustomerArchiveVO customer) {
|
||||||
LambdaQueryWrapper<CustomerArchive> unifiedCreditCodeQuery = Wrappers.<CustomerArchive>lambdaQuery()
|
LambdaQueryWrapper<CustomerArchive> unifiedCreditCodeQuery = Wrappers.<CustomerArchive>lambdaQuery()
|
||||||
.eq(CustomerArchive::getUnifiedCreditCode, customer.getUnifiedCreditCode())
|
.eq(CustomerArchive::getUnifiedCreditCode, customer.getUnifiedCreditCode())
|
||||||
|
|||||||
Reference in New Issue
Block a user