:feat: 付款申请收款方高风险黑名单统一走特批(特批附件校验/特批审核挂起/结果联动审批状态/金蝶推送门禁)
This commit is contained in:
+9
-4
@@ -124,7 +124,7 @@ public final class HcsSyncConstant {
|
||||
public static final String SPEC_STATUS_NONE = "none";
|
||||
|
||||
/**
|
||||
* 特批状态:待特批(额度超额标记,扫描任务据此发起 C106-3)
|
||||
* 特批状态:待特批(高风险/黑名单或额度超额标记,扫描任务据此发起 C106-3)
|
||||
*/
|
||||
public static final String SPEC_STATUS_NEED = "need";
|
||||
|
||||
@@ -134,17 +134,17 @@ public final class HcsSyncConstant {
|
||||
public static final String SPEC_STATUS_PUSHING = "pushing";
|
||||
|
||||
/**
|
||||
* 特批状态:特批中(C106-3 已发起,结果人工确认,§9-U1)
|
||||
* 特批状态:特批中(C106-3 已发起,TMS 挂起「特批审核」,等待合规 paymentLegal/result 回调)
|
||||
*/
|
||||
public static final String SPEC_STATUS_PROCESSING = "processing";
|
||||
|
||||
/**
|
||||
* 特批状态:特批通过(人工确认)
|
||||
* 特批状态:特批通过(合规回调/人工确认,联动恢复"审批通过"放行)
|
||||
*/
|
||||
public static final String SPEC_STATUS_APPROVED = "approved";
|
||||
|
||||
/**
|
||||
* 特批状态:特批驳回(人工确认)
|
||||
* 特批状态:特批驳回(合规回调/人工确认,联动付款审批驳回走重新提交闭环)
|
||||
*/
|
||||
public static final String SPEC_STATUS_REJECTED = "rejected";
|
||||
|
||||
@@ -180,6 +180,11 @@ public final class HcsSyncConstant {
|
||||
*/
|
||||
public static final String ATTACHMENT_TYPE_SPEC_EXPLANATION = "特批附件";
|
||||
|
||||
/**
|
||||
* 付款申请附件类型值:特批附件(前端付款表单附件类型枚举 attachmentType,付款附件结构与合同 fileType 结构不同)
|
||||
*/
|
||||
public static final String PAYMENT_ATTACH_TYPE_SPECIAL = "special_approval";
|
||||
|
||||
/**
|
||||
* 附件类型:用印附件(双章归档文件,取值沿用 ContractManageServiceImpl#FILE_TYPE_SEAL_ARCHIVE)
|
||||
*/
|
||||
|
||||
+5
-4
@@ -136,11 +136,11 @@ public class HcsSyncController {
|
||||
}
|
||||
|
||||
/**
|
||||
* 特批结果人工确认(§9-U1 过渡方案:v4 无结果查询/回调接口)
|
||||
* 特批结果人工确认(§9-U1 过渡兜底:与合规 paymentLegal/result 回调等效,均联动付款审批状态)
|
||||
*/
|
||||
@PostMapping("/spec-pay/confirm")
|
||||
@ApiOperationSupport(order = 3)
|
||||
@Operation(summary = "特批结果人工确认", description = "传入付款申请ID与结果(approved/rejected),仅特批中(processing)允许确认")
|
||||
@Operation(summary = "特批结果人工确认", description = "传入付款申请ID与结果(approved/rejected),仅特批中(processing)允许确认;approved 恢复审批通过放行,rejected 联动付款审批驳回")
|
||||
public R<String> confirmSpecResult(@Parameter(description = "付款申请ID", required = true) @RequestParam Long id,
|
||||
@Parameter(description = "确认结果 approved/rejected", required = true) @RequestParam String result) {
|
||||
return R.data(hcsPaymentSyncSupport.confirmSpecResult(id, result));
|
||||
@@ -248,11 +248,12 @@ public class HcsSyncController {
|
||||
* <p>
|
||||
* 免登免授权同合同接口(blade.secure 放行);
|
||||
* iPaaS 网关注册映射:/gwzh/HTHG/paymentLegal/result → /hcs/paymentLegal/result;
|
||||
* 报文同合同接口(requestId=TMS付款申请ID),付款特批结果不联动付款审批状态(§4.4)。
|
||||
* 报文 {sourceSystem, requestId=TMS付款申请ID, status=APPROVED/REJECTED, reason},
|
||||
* approved 恢复"审批通过"放行,rejected 联动付款审批驳回走重新提交闭环。
|
||||
*/
|
||||
@PostMapping("/paymentLegal/result")
|
||||
@ApiOperationSupport(order = 16)
|
||||
@Operation(summary = "付款特批结果回传接收", description = "合规系统推送付款特批结果,按付款申请ID定位并回写特批状态")
|
||||
@Operation(summary = "付款特批结果回传接收", description = "合规系统推送付款特批结果,按付款申请ID定位并联动特批状态与付款审批状态,原文留痕")
|
||||
public R<String> paymentLegalResult(@RequestBody(required = false) HcsLegalResultDTO param) {
|
||||
return R.data(hcsPaymentSyncSupport.handleLegalResult(param));
|
||||
}
|
||||
|
||||
+66
-16
@@ -29,6 +29,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
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.StringUtil;
|
||||
import org.springblade.hcs.config.HcsProperties;
|
||||
import org.springblade.hcs.dto.HcsCreditCheckDTO;
|
||||
@@ -51,13 +52,17 @@ import org.springframework.stereotype.Component;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* HCS 付款提交校验支撑组件(C101-1 客商风险 + C106-1 额度校验,设计文档 §5.4,D15/R2-Q3)
|
||||
* <p>
|
||||
* 付款申请提交(submit)事务内同步调用(查询类同步):
|
||||
* ① C101-1 按收款方客商编号查风险,黑名单且 block-blacklist=true 时阻断提交;
|
||||
* ① C101-1 收款方为外部客商时查风险,高风险(风险等级=2)/黑名单提示且必须上传「特批附件」,
|
||||
* 并标记 hcs_spec_status=need 转付款特批链路(审批通过后扫描任务发起 C106-3,合规 paymentLegal/result 回调联动);
|
||||
* 内部组织客商默认无风险不查询;
|
||||
* ② C106-1 校验申请金额是否超出合同额度,超额不拦截提交,置 hcs_credit_status=over 并标记
|
||||
* hcs_spec_status=need 转特批链路(D15/R2-Q2)。
|
||||
* 校验依赖合同已推送(hcs_fd_id 存在),未推送时按 credit.require-contract-synced 配置阻断或跳过。
|
||||
@@ -87,7 +92,7 @@ public class HcsCreditCheckSupport {
|
||||
* @param payment 付款申请单(须含合同与收款方信息)
|
||||
*/
|
||||
public void checkOnSubmit(PaymentApplication payment) {
|
||||
// ① 客商风险校验(可配开关),黑名单阻断提交
|
||||
// ① 客商风险校验(可配开关):外部客商高风险/黑名单须特批附件并标记待特批
|
||||
if (hcsProperties.getRisk().isCheckOnPayment()) {
|
||||
checkRelativeRisk(payment);
|
||||
}
|
||||
@@ -99,35 +104,49 @@ public class HcsCreditCheckSupport {
|
||||
}
|
||||
|
||||
/**
|
||||
* C101-1 收款方客商风险校验:黑名单且 block-blacklist=true 时阻断提交
|
||||
* C101-1 收款方客商风险校验:仅外部客商查询,高风险/黑名单必须上传特批附件,
|
||||
* 并标记 hcs_spec_status=need 转付款特批链路(不再直接阻断)
|
||||
*/
|
||||
private void checkRelativeRisk(PaymentApplication payment) {
|
||||
String customerCode = queryCustomerCode(payment.getPayeeName());
|
||||
if (StringUtil.isBlank(customerCode)) {
|
||||
CustomerArchive customerArchive = queryCustomerArchive(payment.getPayeeName());
|
||||
if (customerArchive == null) {
|
||||
writeCheckLog(payment, HcsSyncConstant.CHECK_TYPE_RISK, HcsSyncConstant.CHECK_RESULT_SKIP,
|
||||
"收款方[" + payment.getPayeeName() + "]反查不到客商编号,跳过风险校验(§9-U6)", null);
|
||||
log.warn("HCS付款提交风险校验跳过:paymentNo={},收款方反查不到客商编号", payment.getPaymentNo());
|
||||
return;
|
||||
}
|
||||
// 内部组织类型客商默认无风险,不查 C101-1(与 queryCustomerRisk 展示口径一致)
|
||||
if (HcsSyncConstant.CUSTOMER_KIND_INTERNAL.equals(customerArchive.getCustomerKind())) {
|
||||
writeCheckLog(payment, HcsSyncConstant.CHECK_TYPE_RISK, HcsSyncConstant.CHECK_RESULT_SKIP,
|
||||
"收款方[" + payment.getPayeeName() + "]为内部组织客商,默认无风险跳过校验", null);
|
||||
return;
|
||||
}
|
||||
HcsRiskQueryDTO param = new HcsRiskQueryDTO();
|
||||
// 【必填】客商编号:按收款方名称反查 CustomerArchive 客商编码(用哪个编码待联调,§9-U6)
|
||||
param.setFdNumber(customerCode);
|
||||
param.setFdNumber(customerArchive.getCustomerCode());
|
||||
HcsResult<HcsRiskVO> result = hcsClient.getRelativeRisk(param);
|
||||
if (result == null || !result.isSuccess()) {
|
||||
log.error("HCS客商风险查询失败响应:{},paymentNo={},fdNumber={}",
|
||||
result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), payment.getPaymentNo(), customerCode);
|
||||
result == null ? "无响应" : String.format("msg=%s, traceId=%s", result.getMsg(), result.getTraceId()), payment.getPaymentNo(), customerArchive.getCustomerCode());
|
||||
throw new HcsException("C101-1 客商风险查询失败:" + (result == null ? "响应为空" : result.getMsg()));
|
||||
}
|
||||
HcsRiskVO risk = result.getData();
|
||||
String blackStatus = risk == null ? null : risk.getFdBlackStatus();
|
||||
boolean blacklist = BLACK_STATUS_YES.equalsIgnoreCase(blackStatus);
|
||||
writeCheckLog(payment, HcsSyncConstant.CHECK_TYPE_RISK, blacklist ? HcsSyncConstant.CHECK_RESULT_FAIL : HcsSyncConstant.CHECK_RESULT_PASS,
|
||||
"收款方[" + payment.getPayeeName() + "]黑名单=" + blackStatus + ",风险等级=" + (risk == null ? null : risk.getFdRiskLevel()),
|
||||
String riskLevel = risk == null ? null : risk.getFdRiskLevel();
|
||||
boolean risky = HcsSyncConstant.RISK_LEVEL_HIGH.equals(riskLevel) || BLACK_STATUS_YES.equalsIgnoreCase(blackStatus);
|
||||
writeCheckLog(payment, HcsSyncConstant.CHECK_TYPE_RISK, risky ? HcsSyncConstant.CHECK_RESULT_FAIL : HcsSyncConstant.CHECK_RESULT_PASS,
|
||||
"收款方[" + payment.getPayeeName() + "]黑名单=" + blackStatus + ",风险等级=" + riskLevel + ",高风险/黑名单=" + risky,
|
||||
result.getTraceId());
|
||||
if (blacklist && hcsProperties.getRisk().isBlockBlacklist()) {
|
||||
log.error("HCS付款提交被风险校验阻断:paymentNo={},收款方[{}]黑名单", payment.getPaymentNo(), payment.getPayeeName());
|
||||
throw new ServiceException("收款方客商黑名单,禁止提交付款申请");
|
||||
if (!risky) {
|
||||
return;
|
||||
}
|
||||
// 高风险/黑名单:必须上传「特批附件」类型附件(提示阻断),并标记待特批(审批通过后推送 C106-3);
|
||||
// 清空旧特批流程ID:特批单次有效,重新提交须重新发起 C106-3(否则会 C106-4 更新旧驳回单)
|
||||
if (!hasSpecAttachment(payment.getAttachmentsJson())) {
|
||||
throw new ServiceException("收款方[" + payment.getPayeeName() + "]为高风险/黑名单客商,必须上传「特批附件」类型附件后再提交审批");
|
||||
}
|
||||
payment.setHcsSpecFdId(null);
|
||||
payment.setHcsSpecStatus(HcsSyncConstant.SPEC_STATUS_NEED);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -249,19 +268,50 @@ public class HcsCreditCheckSupport {
|
||||
}
|
||||
|
||||
/**
|
||||
* 按名称反查客商编码(照 KingdeeApBillSyncSupport#queryCustomerCode 惯例,查不到返回 null)
|
||||
* 按名称反查客商档案(内部/外部类型判断与客商编码获取共用;查不到返回 null)
|
||||
*/
|
||||
private String queryCustomerCode(String customerName) {
|
||||
private CustomerArchive queryCustomerArchive(String customerName) {
|
||||
if (StringUtil.isBlank(customerName)) {
|
||||
return null;
|
||||
}
|
||||
CustomerArchive customerArchive = customerArchiveMapper.selectOne(Wrappers.<CustomerArchive>lambdaQuery()
|
||||
return customerArchiveMapper.selectOne(Wrappers.<CustomerArchive>lambdaQuery()
|
||||
.and(wrapper -> wrapper.eq(CustomerArchive::getFullName, customerName).or().eq(CustomerArchive::getShortName, customerName))
|
||||
.eq(CustomerArchive::getIsDeleted, 0)
|
||||
.last("limit 1"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 按名称反查客商编码(照 KingdeeApBillSyncSupport#queryCustomerCode 惯例,查不到返回 null)
|
||||
*/
|
||||
private String queryCustomerCode(String customerName) {
|
||||
CustomerArchive customerArchive = queryCustomerArchive(customerName);
|
||||
return customerArchive == null ? null : customerArchive.getCustomerCode();
|
||||
}
|
||||
|
||||
/**
|
||||
* 附件中是否已上传特批附件(付款附件结构 attachmentType=special_approval,即前端付款表单「特批附件」类型;
|
||||
* 兼容 fileType=特批附件 结构;口径同合同提交校验 validateSpecExplanationOnSubmit)
|
||||
*/
|
||||
private boolean hasSpecAttachment(String attachmentsJson) {
|
||||
if (StringUtil.isBlank(attachmentsJson)) {
|
||||
return false;
|
||||
}
|
||||
try {
|
||||
Object parsed = JsonUtil.parse(attachmentsJson, List.class);
|
||||
if (!(parsed instanceof List<?> attachments)) {
|
||||
return false;
|
||||
}
|
||||
return attachments.stream().filter(Map.class::isInstance).map(Map.class::cast)
|
||||
.anyMatch(attachment -> HcsSyncConstant.PAYMENT_ATTACH_TYPE_SPECIAL
|
||||
.equals(Objects.toString(attachment.get("attachmentType"), null))
|
||||
|| HcsSyncConstant.ATTACHMENT_TYPE_SPEC_EXPLANATION
|
||||
.equals(Objects.toString(attachment.get(HcsSyncConstant.ATTACHMENT_TYPE_FIELD), null)));
|
||||
} catch (Exception exception) {
|
||||
log.error("HCS付款提交附件JSON解析失败:按未上传特批附件处理", exception);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验留痕(blade_hcs_check_log,异常不影响主流程)
|
||||
*/
|
||||
|
||||
+28
-5
@@ -33,6 +33,7 @@ import org.springblade.core.tool.utils.StringUtil;
|
||||
import org.springblade.hcs.config.HcsProperties;
|
||||
import org.springblade.hcs.dto.HcsLegalResultDTO;
|
||||
import org.springblade.transport.constant.HcsSyncConstant;
|
||||
import org.springblade.transport.constant.TransportBusiConstant;
|
||||
import org.springblade.transport.mapper.PaymentApplicationMapper;
|
||||
import org.springblade.transport.pojo.entity.PaymentApplication;
|
||||
import org.springframework.stereotype.Component;
|
||||
@@ -43,8 +44,10 @@ import java.util.List;
|
||||
/**
|
||||
* HCS 付款链推送编排支撑组件(结算付款特批 C106-3/4 + 履约记录 C108-1/2 + 特批结果推送接收,设计文档 §5.0/§5.5/§5.6)
|
||||
* <p>
|
||||
* 编排顺序:特批(额度超额标记 need 时发起)→ 履约记录(审批通过新建 / 实际付款推进更新)。
|
||||
* 编排顺序:特批(提交时高风险/黑名单须特批附件或额度超额标记 need 时发起)→ 履约记录(审批通过新建 / 实际付款推进更新)。
|
||||
* 特批流程ID 与履约记录ID 在各自 Support 内即时持久化;整体同步状态(hcs_sync_status)由本组件统一回写。
|
||||
* 特批发起后 TMS 挂起 currentNode="特批审核",合规 paymentLegal/result 回调联动付款审批状态
|
||||
* (通过恢复"审批通过"放行 / 驳回联动审批驳回走重新提交闭环),人工确认等效兜底。
|
||||
*
|
||||
* @author Chill
|
||||
*/
|
||||
@@ -71,7 +74,7 @@ public class HcsPaymentSyncSupport {
|
||||
*/
|
||||
public String pushPayment(PaymentApplication payment) {
|
||||
StringBuilder result = new StringBuilder();
|
||||
// ① 结算付款特批:提交时额度超额(hcs_spec_status=need)且未发起时发起 C106-3(C106-1 暂不对接后无自动置 need,仅历史数据/人工场景可达)
|
||||
// ① 结算付款特批:提交时高风险/黑名单(须特批附件)或额度超额(hcs_spec_status=need)且未发起时发起 C106-3
|
||||
if (HcsSyncConstant.SPEC_STATUS_NEED.equals(payment.getHcsSpecStatus())) {
|
||||
result.append(hcsSpecPaySyncSupport.pushSpecPay(payment));
|
||||
}
|
||||
@@ -115,7 +118,7 @@ public class HcsPaymentSyncSupport {
|
||||
}
|
||||
|
||||
/**
|
||||
* 特批结果人工确认(§9-U1 过渡方案:v4 无结果查询/回调接口)
|
||||
* 特批结果人工确认(页面确认与合规 paymentLegal/result 回调等效,§9-U1 过渡兜底)
|
||||
*
|
||||
* @param id 付款申请单ID
|
||||
* @param result confirmed approved / rejected
|
||||
@@ -132,6 +135,8 @@ public class HcsPaymentSyncSupport {
|
||||
if (!HcsSyncConstant.SPEC_STATUS_PROCESSING.equals(payment.getHcsSpecStatus())) {
|
||||
throw new ServiceException("仅特批中的付款申请允许确认结果(当前状态:" + payment.getHcsSpecStatus() + ")");
|
||||
}
|
||||
// 特批结果联动付款审批状态(通过恢复放行 / 驳回联动审批驳回),随 updateById 一并落库
|
||||
syncPaymentOnSpecResult(payment, HcsSyncConstant.SPEC_STATUS_APPROVED.equals(result));
|
||||
payment.setHcsSpecStatus(result);
|
||||
paymentApplicationMapper.updateById(payment);
|
||||
log.info("HCS特批结果人工确认:paymentNo={},specFdId={},结果={}", payment.getPaymentNo(), payment.getHcsSpecFdId(), result);
|
||||
@@ -139,10 +144,11 @@ public class HcsPaymentSyncSupport {
|
||||
}
|
||||
|
||||
/**
|
||||
* 付款特批结果接收处理(合规 paymentLegal/result 推送,替代未建设的 B103,D15 回传机制):
|
||||
* 付款特批结果接收处理(合规 paymentLegal/result 回调通知特批审批结果):
|
||||
* sourceSystem 须与 third-party.hcs.src-system 配置一致(不符抛出"来源系统标识错误"异常),
|
||||
* requestId=TMS 付款申请ID、status=APPROVED/REJECTED;
|
||||
* 付款特批结果不联动付款审批状态(§4.4),仅回写 hcs_spec_status
|
||||
* 特批结果联动付款审批状态:approved 恢复"审批通过"放行(后续金蝶推送放行),
|
||||
* rejected 联动付款审批驳回(returned),走"重新编辑→提交→审批→重新特批"闭环
|
||||
*
|
||||
* @param param 合规推送报文
|
||||
* @return 处理结果描述
|
||||
@@ -169,12 +175,29 @@ public class HcsPaymentSyncSupport {
|
||||
log.warn("付款特批结果状态未识别:paymentNo={},status={},reason={}", payment.getPaymentNo(), param.getStatus(), param.getReason());
|
||||
return "状态字段未识别(paymentNo=" + payment.getPaymentNo() + ")";
|
||||
}
|
||||
syncPaymentOnSpecResult(payment, HcsSyncConstant.SPEC_STATUS_APPROVED.equals(status));
|
||||
payment.setHcsSpecStatus(status);
|
||||
paymentApplicationMapper.updateById(payment);
|
||||
log.info("付款特批结果推送处理完成:paymentNo={},结果={},reason={}", payment.getPaymentNo(), status, param.getReason());
|
||||
return "特批结果已处理:" + status;
|
||||
}
|
||||
|
||||
/**
|
||||
* 特批结果联动付款审批状态(handleLegalResult 与 confirmSpecResult 共用,仅改字段,随 updateById 落库):
|
||||
* approved 恢复"审批通过"展示并放行(审批状态保持 approved,金蝶推送门禁解除);
|
||||
* rejected 联动付款审批驳回(returned + "已驳回"),走重新编辑→提交→审批→重新特批闭环
|
||||
* (提交时重新校验收款方风险与特批附件)
|
||||
*/
|
||||
private void syncPaymentOnSpecResult(PaymentApplication payment, boolean approved) {
|
||||
if (approved) {
|
||||
payment.setCurrentNode("审批通过");
|
||||
} else {
|
||||
payment.setApprovalStatus(TransportBusiConstant.RETURNED);
|
||||
payment.setCurrentNode("已驳回");
|
||||
payment.setCurrentProcessor("待处理");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 按 TMS 付款申请ID 定位付款申请(合规推送 requestId)
|
||||
*/
|
||||
|
||||
+10
-7
@@ -30,32 +30,33 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.springblade.core.tool.utils.StringUtil;
|
||||
import org.springblade.hcs.config.HcsProperties;
|
||||
import org.springblade.hcs.dto.HcsAttachmentRefDTO;
|
||||
import org.springblade.hcs.dto.HcsFormSaveVO;
|
||||
import org.springblade.hcs.dto.HcsMechanismsDTO;
|
||||
import org.springblade.hcs.dto.HcsResult;
|
||||
import org.springblade.hcs.dto.HcsFormSaveVO;
|
||||
import org.springblade.hcs.dto.HcsSpecPayFormDataDTO;
|
||||
import org.springblade.hcs.dto.HcsSpecPayPropsDTO;
|
||||
import org.springblade.hcs.dto.HcsSpecPaySaveDTO;
|
||||
import org.springblade.hcs.exception.HcsException;
|
||||
import org.springblade.hcs.feign.IHcsClient;
|
||||
import org.springblade.transport.constant.HcsSyncConstant;
|
||||
import org.springblade.transport.mapper.ContractManageMapper;
|
||||
import org.springblade.transport.mapper.PaymentApplicationMapper;
|
||||
import org.springblade.transport.pojo.entity.ContractManage;
|
||||
import org.springblade.transport.pojo.entity.PaymentApplication;
|
||||
import org.springblade.transport.mapper.ContractManageMapper;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* HCS 结算付款特批同步支撑组件(C106-3 发起 / C106-4 更新,设计文档 §5.5)
|
||||
* <p>
|
||||
* 触发:付款申请审批通过且 hcs_spec_status=need(提交时额度超额标记)→ 扫描任务发起 C106-3,
|
||||
* 返回 data.data.fdId(双层嵌套)→ hcs_spec_fd_id,状态置 processing;
|
||||
* 触发:付款申请提交时收款方外部客商高风险/黑名单(须特批附件)或额度超额标记 hcs_spec_status=need
|
||||
* → 审批通过后扫描任务发起 C106-3,返回 data.data.fdId(双层嵌套)→ hcs_spec_fd_id,状态置 processing
|
||||
* 并挂起 currentNode="特批审核";
|
||||
* 单据变更且特批流程存在时走 C106-4(顶层 fdId=hcs_spec_fd_id,附件不带 fdBindType)。
|
||||
* 特批结果:v4 无结果查询/回调接口,approved/rejected 一期由页面人工确认(§9-U1)。
|
||||
* 特批结果:合规 paymentLegal/result 回调联动付款审批状态(通过放行/驳回联动审批驳回),
|
||||
* 页面人工确认等效兜底(§9-U1)。
|
||||
*
|
||||
* @author Chill
|
||||
*/
|
||||
@@ -91,8 +92,10 @@ public class HcsSpecPaySyncSupport {
|
||||
String specFdId = extractNestedFdId(payment, result);
|
||||
payment.setHcsSpecFdId(specFdId);
|
||||
payment.setHcsSpecStatus(HcsSyncConstant.SPEC_STATUS_PROCESSING);
|
||||
// TMS 流程挂起展示:等待合规 paymentLegal/result 回调联动付款审批状态(与合同链路 hangSpecReview 口径一致)
|
||||
payment.setCurrentNode(HcsSyncConstant.SPEC_REVIEW_NODE);
|
||||
paymentApplicationMapper.updateById(payment);
|
||||
log.info("HCS结算付款特批发起成功:paymentNo={},specFdId={}", payment.getPaymentNo(), specFdId);
|
||||
log.info("HCS结算付款特批发起成功:paymentNo={},specFdId={},挂起「{}」", payment.getPaymentNo(), specFdId, HcsSyncConstant.SPEC_REVIEW_NODE);
|
||||
return "C106-3 特批发起成功";
|
||||
}
|
||||
// C106-4 更新:顶层 fdId 必填,内层无业务数据,以内层 success 判断
|
||||
|
||||
Reference in New Issue
Block a user