From d99488b999632b3507ea2c4404ae78554669b2ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Tue, 13 Oct 2026 20:05:16 +0800 Subject: [PATCH] =?UTF-8?q?:fix:=20=E4=BF=AE=E5=A4=8D=E4=BB=98=E6=AC=BE?= =?UTF-8?q?=E7=94=B3=E8=AF=B7=E8=8D=89=E7=A8=BF=E9=87=8D=E5=AD=98=E6=97=B6?= =?UTF-8?q?=E7=BB=93=E7=AE=97=E5=85=B3=E8=81=94=E5=94=AF=E4=B8=80=E7=B4=A2?= =?UTF-8?q?=E5=BC=95=E5=86=B2=E7=AA=81=EF=BC=88=E9=80=BB=E8=BE=91=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E6=AE=8B=E7=95=99=E6=97=A7=E8=A1=8C=EF=BC=8C=E6=94=B9?= =?UTF-8?q?=E7=89=A9=E7=90=86=E5=88=A0=E9=99=A4=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/PaymentApplicationSettlementMapper.java | 11 +++++++++++ .../service/impl/PaymentApplicationServiceImpl.java | 12 +++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/PaymentApplicationSettlementMapper.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/PaymentApplicationSettlementMapper.java index 78e02855..29d34fa0 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/PaymentApplicationSettlementMapper.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/mapper/PaymentApplicationSettlementMapper.java @@ -1,10 +1,21 @@ package org.springblade.transport.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Delete; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import org.springblade.transport.pojo.entity.PaymentApplicationSettlement; /** 付款申请关联正式结算单 Mapper。 */ @Mapper public interface PaymentApplicationSettlementMapper extends BaseMapper { + + /** + * 按付款申请主键物理删除关联记录(表存在不含逻辑删除字段的关系唯一索引,重存前必须物理清理) + * + * @param paymentApplicationId 付款申请主键 + * @return 删除行数 + */ + @Delete("DELETE FROM blade_payment_application_settlement WHERE payment_application_id = #{paymentApplicationId}") + int deleteByPaymentApplicationId(@Param("paymentApplicationId") Long paymentApplicationId); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java index a52fcc28..fffde5e0 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java @@ -325,7 +325,7 @@ private final CustomerReceiptAccountMapper receiptAccountMapper; validateProjectAdvanceContract(entity); validateSelectedBill(entity, false); validateQuota(entity); - // HCS 提交同步校验(事务内查询类同步,D15/R2-Q3):C101-1 风险(黑名单阻断)+ C106-1 额度(超额转特批) + // HCS 提交同步校验(事务内查询类同步,D15/R2-Q3):C101-1 风险(收款方外部客商高风险/黑名单须特批附件并标记待特批)+ C106-1 额度(超额转特批) hcsCreditCheckSupport.checkOnSubmit(entity); entity.setApprovalStatus(TransportBusiConstant.REVIEWING); entity.setCurrentNode("财务审核"); @@ -388,6 +388,12 @@ private final CustomerReceiptAccountMapper receiptAccountMapper; public String doSyncKingdee(Long id, KingdeeSyncContext context) { PaymentApplication entity = lockedPayment(id); 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, + HcsSyncConstant.SPEC_STATUS_PROCESSING).contains(entity.getHcsSpecStatus())) { + throw new ServiceException("收款方客商为高风险/黑名单,付款特批审核中(" + entity.getCurrentNode() + "),特批完成后方可推送金蝶"); + } if (KingdeeBfiConstant.KINGDEE_STATUS_SYNCED.equals(entity.getKingdeeStatus()) || KingdeeBfiConstant.KINGDEE_STATUS_PAYING.equals(entity.getKingdeeStatus()) || KingdeeBfiConstant.KINGDEE_STATUS_PAID.equals(entity.getKingdeeStatus()) @@ -1505,8 +1511,8 @@ private final CustomerReceiptAccountMapper receiptAccountMapper; private void saveSettlementRelations(PaymentApplication entity, List settlements) { if (settlements.isEmpty()) return; - settlementRelationMapper.delete(Wrappers.lambdaQuery() - .eq(PaymentApplicationSettlement::getPaymentApplicationId, entity.getId())); + // 关系唯一索引不含 is_deleted,逻辑删除会残留旧行导致重存冲突,此处必须物理删除 + settlementRelationMapper.deleteByPaymentApplicationId(entity.getId()); BigDecimal totalBase = settlements.stream().map(item -> money(item.getSettlementAmount()).subtract( cumulativeFormalSettlementApplied(item.getId(), entity.getId())).max(BigDecimal.ZERO)) .reduce(BigDecimal.ZERO, BigDecimal::add);