feat: 新增付款特批走合同合规开关(默认关闭,特批附件必传逻辑保留)

thirdParty.hcs.spec-pay.enabled=false(默认)时:付款申请审批通过后不再发起 C106-3/4、不挂起特批审核、金蝶推送门禁放行;提交时高风险/黑名单 C101-1 风险校验与特批附件必传逻辑保留。同步 doc/nacos 配置样例与本地 Nacos。
This commit is contained in:
刘泉佳
2026-11-03 20:14:14 +08:00
parent 281ba78340
commit 2d0c4a4b26
8 changed files with 32 additions and 7 deletions
@@ -114,7 +114,7 @@ public class PaymentApplicationController extends BladeController {
}
PaymentApplication payment = paymentApplicationService.getById(id);
String specStatus = payment == null ? null : payment.getHcsSpecStatus();
if (HcsSyncConstant.SPEC_STATUS_NEED.equals(specStatus)) {
if (hcsImmediatePushSupport.isSpecPayEnabled() && HcsSyncConstant.SPEC_STATUS_NEED.equals(specStatus)) {
return R.success("审批通过,付款特批待发起,可在详情页重推合规");
}
if (Arrays.asList(HcsSyncConstant.SPEC_STATUS_PUSHING, HcsSyncConstant.SPEC_STATUS_PROCESSING).contains(specStatus)) {
@@ -24,6 +24,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springblade.core.tool.api.R;
import org.springblade.transport.config.BfiProperties;
import org.springblade.transport.constant.HcsSyncConstant;
import org.springblade.hcs.config.HcsProperties;
import org.springblade.transport.event.KingdeeBillApprovedEvent;
import org.springblade.transport.pojo.entity.PaymentApplication;
import org.springblade.transport.service.IFormalSettlementService;
@@ -65,6 +66,7 @@ public class KingdeeApprovalSyncListener {
private final IInvoiceApplicationService invoiceApplicationService;
private final IInvoiceReceiptService invoiceReceiptService;
private final BfiProperties bfiProperties;
private final HcsProperties hcsProperties;
/** 当前审批请求线程的自动推送失败原因,供 Controller 取走提示前端(见类注释线程说明) */
private static final ThreadLocal<String> SYNC_FAILURE = new ThreadLocal<>();
@@ -183,9 +185,10 @@ public class KingdeeApprovalSyncListener {
return;
}
// 付款特批未完成(高风险/黑名单/额度超额)时金蝶必然拒推:跳过而非置失败,
// 特批通过后由 HcsPaymentSyncSupport 重新发布本事件自动补推
// 特批通过后由 HcsPaymentSyncSupport 重新发布本事件自动补推;
// 特批不走合同系统(spec-pay.enabled=false)时不跳过
PaymentApplication payment = paymentApplicationService.getById(id);
if (payment != null && payment.getHcsSpecStatus() != null
if (hcsProperties.getSpecPay().isEnabled() && payment != null && payment.getHcsSpecStatus() != null
&& List.of(HcsSyncConstant.SPEC_STATUS_NEED, HcsSyncConstant.SPEC_STATUS_PUSHING,
HcsSyncConstant.SPEC_STATUS_PROCESSING).contains(payment.getHcsSpecStatus())) {
log.info("付款申请[{}]审批通过自动同步金蝶跳过(付款特批未完成):hcsSpecStatus={}", id, payment.getHcsSpecStatus());
@@ -51,6 +51,7 @@ import org.springblade.thirdparty.bfi.util.BfiUtil;
import org.springblade.transport.config.BfiProperties;
import org.springblade.transport.constant.KingdeeAttachmentConstant;
import org.springblade.transport.constant.HcsSyncConstant;
import org.springblade.hcs.config.HcsProperties;
import org.springblade.transport.constant.KingdeeBfiConstant;
import org.springblade.transport.constant.KingdeeLockConstant;
import org.springblade.transport.constant.TransportBusiConstant;
@@ -187,6 +188,7 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl<PaymentApplic
private final BladeRedis bladeRedis;
private final ApplicationEventPublisher eventPublisher;
private final HcsCreditCheckSupport hcsCreditCheckSupport;
private final HcsProperties hcsProperties;
private final IContractExeStageService contractExeStageService;
@Override
@@ -718,8 +720,9 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl<PaymentApplic
context.paymentNoCache().put(id, entity.getPaymentNo());
if (!TransportBusiConstant.APPROVED.equals(entity.getApprovalStatus())) throw new ServiceException("仅审批通过的付款申请允许生成金蝶单据");
// 高风险/黑名单客商付款特批门禁:待特批/特批审核中(挂起"特批审核")禁止推送金蝶,
// 特批通过(合规 paymentLegal/result 回调恢复"审批通过")后放行
if (entity.getHcsSpecStatus() != null && List.of(HcsSyncConstant.SPEC_STATUS_NEED, HcsSyncConstant.SPEC_STATUS_PUSHING,
// 特批通过(合规 paymentLegal/result 回调恢复"审批通过")后放行;
// 特批不走合同系统(spec-pay.enabled=false)时不拦截
if (hcsProperties.getSpecPay().isEnabled() && entity.getHcsSpecStatus() != null && List.of(HcsSyncConstant.SPEC_STATUS_NEED, HcsSyncConstant.SPEC_STATUS_PUSHING,
HcsSyncConstant.SPEC_STATUS_PROCESSING).contains(entity.getHcsSpecStatus())) {
throw new ServiceException("收款方客商为高风险/黑名单,付款特批审核中(" + entity.getCurrentNode() + "),特批完成后方可推送金蝶");
}
@@ -171,6 +171,13 @@ public class HcsImmediatePushSupport {
return hcsProperties.getPush().isImmediateEnabled();
}
/**
* 付款特批走合同合规开关(thirdParty.hcs.spec-pay.enabled),关闭时审批响应不再提示特批待发起/已发起
*/
public boolean isSpecPayEnabled() {
return hcsProperties.getSpecPay().isEnabled();
}
/**
* 项目立项"通过"按钮路径:在审批事务提交返回后由 Controller 同步调用,失败原因留在当前线程供其取走
*
@@ -86,8 +86,9 @@ public class HcsPaymentSyncSupport {
public String pushPayment(PaymentApplication payment) {
StringBuilder result = new StringBuilder();
// ① 结算付款特批:提交时高风险/黑名单(须特批附件)或额度超额(hcs_spec_status=need)且未发起时发起 C106-3;
// 发起后挂起等待特批结果,特批通过后不推履约数据(各业务环节推送),仅补推金蝶(驳回不产生履约数据)
if (HcsSyncConstant.SPEC_STATUS_NEED.equals(payment.getHcsSpecStatus())) {
// 发起后挂起等待特批结果,特批通过后不推履约数据(各业务环节推送),仅补推金蝶(驳回不产生履约数据);
// spec-pay.enabled=false(特批不走合同系统)时跳过发起,need 仅作附件要求留痕
if (HcsSyncConstant.SPEC_STATUS_NEED.equals(payment.getHcsSpecStatus()) && hcsProperties.getSpecPay().isEnabled()) {
String specResult = hcsSpecPaySyncSupport.pushSpecPay(payment);
// C106-4 更新路径不改状态,统一归一为特批审核中,避免下轮扫描重复发起
if (HcsSyncConstant.SPEC_STATUS_NEED.equals(payment.getHcsSpecStatus())) {
@@ -273,6 +273,13 @@ public class HcsProperties {
@Data
public static class SpecPay {
/**
* 付款特批走合同合规开关(thirdParty.hcs.spec-pay.enabled,默认 false 不推送合同合规):
* true 时审批通过后发起 C106-3/4、挂起"特批审核"、特批完成前拦截金蝶推送;
* false 时不再发起 C106-3/4、不挂起、不拦截金蝶推送;
* 提交时高风险/黑名单风险校验与「特批附件」必传逻辑保留(risk.check-on-payment)
*/
private boolean enabled = false;
/**
* 特批单据状态(fd_doc_status,示例 10,§9-U3 待联调)
*/
+2
View File
@@ -324,6 +324,8 @@ thirdParty:
require-contract-synced: ${HCS_CREDIT_REQUIRE_CONTRACT_SYNCED:true}
# 结算付款特批(C106-3/4)
spec-pay:
# 付款特批走合同合规开关(false 时不再发起 C106-3/4、不挂起"特批审核"、不拦金蝶推送;提交时特批附件必传逻辑保留)
enabled: ${HCS_SPEC_PAY_ENABLED:false}
# 单据状态(示例 10)
doc-status: ${HCS_SPEC_PAY_DOC_STATUS:10}
# 付款用途/性质/类型字典值(§9-U3 待联调后配置)
+2
View File
@@ -270,6 +270,8 @@ thirdParty:
require-contract-synced: ${HCS_CREDIT_REQUIRE_CONTRACT_SYNCED:true}
# 结算付款特批(C106-3/4)
spec-pay:
# 付款特批走合同合规开关(false 时不再发起 C106-3/4、不挂起"特批审核"、不拦金蝶推送;提交时特批附件必传逻辑保留)
enabled: ${HCS_SPEC_PAY_ENABLED:false}
# 单据状态(示例 10)
doc-status: ${HCS_SPEC_PAY_DOC_STATUS:10}
# 付款用途/性质/类型字典值(§9-U3 待联调后配置)