From 26c9a32c6bcbf5c1dde10fcc348873516feb9d7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Wed, 21 Oct 2026 17:37:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=E5=AE=A2=E5=95=86?= =?UTF-8?q?=E9=A3=8E=E9=99=A9=E6=89=B9=E9=87=8F=E4=B8=8E=E6=8C=89=E5=90=8D?= =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=E5=8F=8A=E9=A3=8E=E9=99=A9?= =?UTF-8?q?=E7=AD=89=E7=BA=A7=E8=BD=AC=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit C101-1 展示链路:/hcs/risk/batch 批量查询(单失败跳过)、/hcs/risk/by-name 按名称查询(反查编号不阻断);CustomerRiskVO 回填 customerCode 并新增 riskLevelName 服务端转义(黑名单优先,0=低/1=中/2=高风险) --- .../transport/pojo/vo/CustomerRiskVO.java | 6 +++ .../controller/HcsSyncController.java | 11 +++++ .../support/hcs/HcsCreditCheckSupport.java | 42 +++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/CustomerRiskVO.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/CustomerRiskVO.java index 1b523f3a..da93615f 100644 --- a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/CustomerRiskVO.java +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/vo/CustomerRiskVO.java @@ -45,6 +45,9 @@ public class CustomerRiskVO implements Serializable { @Serial private static final long serialVersionUID = 1L; + @Schema(description = "客商编号") + private String customerCode; + @Schema(description = "客商类型:internal内部组织(默认无风险)/external外部客商") private String customerKind; @@ -57,6 +60,9 @@ public class CustomerRiskVO implements Serializable { @Schema(description = "风险等级:0=低风险,1=中风险,2=高风险") private String fdRiskLevel; + @Schema(description = "风险等级名称(服务端转义:黑名单/高风险/中风险/低风险,黑名单优先;无等级为空)") + private String riskLevelName; + @Schema(description = "是否高风险/黑名单客商(外部客商专用,内部组织恒为 false)") private Boolean risky; diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java index 9b70b716..993d414d 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/HcsSyncController.java @@ -235,6 +235,17 @@ public class HcsSyncController { return R.data(hcsCreditCheckSupport.queryCustomerRiskBatch(Func.toStrList(customerCodes))); } + /** + * 客商风险按名称查询(C101-1,客商档案表单展示用,前端接入设计 §3.3): + * 按名称反查客商编号后口径同 /risk;反查不到客商编号不阻断(risky=false,§9-U6) + */ + @GetMapping("/risk/by-name") + @ApiOperationSupport(order = 14) + @Operation(summary = "客商风险按名称查询", description = "C101-1 按客商名称查询风险(展示用),名称反查编号后口径同编号查询,反查不到默认无风险") + public R riskByName(@Parameter(description = "客商名称", required = true) @RequestParam String customerName) { + return R.data(hcsCreditCheckSupport.queryCustomerRiskByName(customerName)); + } + /** * 附件上传到合同系统(C103-2 代理,前端接入设计 §3.2),返回合规附件ID */ 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 1331708b..8d2d8288 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 @@ -30,6 +30,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.tool.jackson.JsonUtil; +import org.springblade.core.tool.utils.Func; import org.springblade.core.tool.utils.StringUtil; import org.springblade.hcs.config.HcsProperties; import org.springblade.hcs.dto.HcsCreditCheckDTO; @@ -52,6 +53,7 @@ import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Objects; @@ -207,6 +209,7 @@ public class HcsCreditCheckSupport { .eq(CustomerArchive::getIsDeleted, 0) .last("limit 1")); CustomerRiskVO riskVO = new CustomerRiskVO(); + riskVO.setCustomerCode(customerCode); riskVO.setCustomerName(customerArchive == null ? customerCode : customerArchive.getFullName()); // 内部组织类型客商默认无风险;档案不存在按外部客商查询(不静默放行) boolean internal = customerArchive != null && HcsSyncConstant.CUSTOMER_KIND_INTERNAL.equals(customerArchive.getCustomerKind()); @@ -230,6 +233,7 @@ public class HcsCreditCheckSupport { boolean risky = HcsSyncConstant.RISK_LEVEL_HIGH.equals(riskLevel) || BLACK_STATUS_YES.equalsIgnoreCase(blackStatus); riskVO.setFdBlackStatus(blackStatus); riskVO.setFdRiskLevel(riskLevel); + riskVO.setRiskLevelName(riskLevelName(blackStatus, riskLevel)); riskVO.setRisky(risky); if (risky) { riskVO.setRiskTip("【" + riskVO.getCustomerName() + "】:被列入外部黑名单;涉贪污受贿裁判相关提及方(3年以上及其他);被执行人信息;买卖合同纠纷;劳动纠纷;重大纠纷"); @@ -267,6 +271,44 @@ public class HcsCreditCheckSupport { return queryCustomerRisk(customerCode); } + /** + * 风险等级转义(C101-1 枚举 0=低风险/1=中风险/2=高风险):黑名单状态优先展示,无等级返回空 + */ + private String riskLevelName(String blackStatus, String riskLevel) { + if (BLACK_STATUS_YES.equalsIgnoreCase(blackStatus)) { + return "黑名单"; + } + return switch (Objects.toString(riskLevel, "")) { + case "2" -> "高风险"; + case "1" -> "中风险"; + case "0" -> "低风险"; + default -> null; + }; + } + + /** + * 客商风险批量查询(C101-1,客商列表页展示用,前端接入设计 §3.3): + * 逐个复用 {@link #queryCustomerRisk}(内部客商默认无风险,外部客商查 C101-1,与付款页面展示口径一致); + * C101-1 仅支持单编号查询,逐个串行调用;展示场景单个失败跳过不阻断整页(强制校验仍在合同/付款链路) + * + * @param customerCodes 客商编号集合 + * @return 风险展示信息列表(查询失败的客商不在结果中) + */ + public List queryCustomerRiskBatch(List customerCodes) { + List riskList = new ArrayList<>(); + if (Func.isEmpty(customerCodes)) { + return riskList; + } + for (String customerCode : customerCodes) { + try { + riskList.add(this.queryCustomerRisk(customerCode)); + } catch (Exception exception) { + log.error("客商风险批量查询单个失败,跳过:customerCode={}", customerCode, exception); + } + } + return riskList; + } + /** * 按名称反查客商档案(内部/外部类型判断与客商编码获取共用;查不到返回 null) */