From 746fd3e95f191e03bd4364ec4bc2107b4bce48f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Mon, 2 Nov 2026 19:16:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=87=8D=E6=8E=A8=E8=AE=A4=E9=A2=86?= =?UTF-8?q?=E6=94=B6=E7=A5=A8=E5=8D=95=E6=94=AF=E6=8C=81=E6=90=BA=E5=B8=A6?= =?UTF-8?q?=E5=8C=B9=E9=85=8D=E7=BB=93=E7=AE=97=E5=8D=95=E9=87=91=E9=A2=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FormalSettlementController.java | 7 +++-- .../service/IFormalSettlementService.java | 8 ++++-- .../impl/FormalSettlementServiceImpl.java | 28 ++++++++++++++++++- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/FormalSettlementController.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/FormalSettlementController.java index d1e8a9b5..1ab8deab 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/FormalSettlementController.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/controller/FormalSettlementController.java @@ -241,9 +241,10 @@ public class FormalSettlementController extends BladeController { @PostMapping("/repush-claimed-invoice") @ApiOperationSupport(order = 16) - @Operation(summary = "重推认领收票单(查看页入口:收票单A303-2+指定应付A302-6 一步式,failed/pushed 通吃)") - public R repushClaimedInvoice(@RequestParam Long id, @RequestParam String invoiceNo) { - return R.data(formalSettlementService.repushClaimedInvoice(id, invoiceNo)); + @Operation(summary = "重推认领收票单(查看页入口:收票单A303-2+指定应付A302-6 一步式,failed/pushed 通吃,可带匹配金额)") + public R repushClaimedInvoice(@RequestParam Long id, @RequestParam String invoiceNo, + @RequestParam(required = false) BigDecimal matchedAmount) { + return R.data(formalSettlementService.repushClaimedInvoice(id, invoiceNo, matchedAmount)); } @PostMapping("/sync-kingdee-ar-result") diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IFormalSettlementService.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IFormalSettlementService.java index 2b099a26..3da31cf3 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IFormalSettlementService.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/IFormalSettlementService.java @@ -18,6 +18,7 @@ import org.springblade.transport.pojo.vo.PreSettlementVO; import org.springblade.transport.pojo.entity.PreSettlement; import org.springblade.transport.pojo.dto.PreSettlementDetailAdjustRequest; import org.springblade.transport.pojo.entity.FormalSettlementDetailFee; +import java.math.BigDecimal; import java.util.Collection; import java.util.List; import org.springblade.transport.pojo.dto.FormalSettlementPaymentRequest; @@ -77,11 +78,12 @@ public interface IFormalSettlementService extends BaseService * 前置付款结算单 + 审批通过 + 财务应付单已同步;先复用收票推送状态机重推金蝶收票单(A303-2, * A801-3 幂等预检防重复保存),再组装应付单防重键逐单 A302-6 指定应付(幂等) * - * @param id 正式结算单id - * @param invoiceNo 认领发票号 + * @param id 正式结算单id + * @param invoiceNo 认领发票号 + * @param matchedAmount 匹配结算单金额(可空:空不修改;非空校验 0~发票金额 后更新发票行并重建认领分摊) * @return 重推结果描述 */ - String repushClaimedInvoice(Long id, String invoiceNo); + String repushClaimedInvoice(Long id, String invoiceNo, BigDecimal matchedAmount); /** * 独立事务落"生成失败"状态并记失败原因(在推送事务回滚、行锁释放后执行,与付款/收票口径统一); diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java index 57d244e0..3d6e32cf 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java @@ -1105,7 +1105,7 @@ public class FormalSettlementServiceImpl extends BaseServiceImpllambdaQuery() + .eq(FormalSettlementInvoice::getFormalSettlementId, id) + .eq(FormalSettlementInvoice::getInvoiceNo, trimmedInvoiceNo) + .last("LIMIT 1")); + if (settlementInvoice == null) { + throw new ServiceException("发票" + trimmedInvoiceNo + "不在本结算单发票信息中,无法修改匹配金额"); + } + if (matchedAmount.compareTo(BigDecimal.ZERO) < 0) { + throw new ServiceException("发票" + trimmedInvoiceNo + "匹配结算单金额不能为负数"); + } + if (matchedAmount.compareTo(money(settlementInvoice.getInvoiceAmount())) > 0) { + throw new ServiceException("发票" + trimmedInvoiceNo + "匹配结算单金额不能超过发票金额" + + money(settlementInvoice.getInvoiceAmount())); + } + invoiceMapper.update(null, Wrappers.lambdaUpdate() + .eq(FormalSettlementInvoice::getId, settlementInvoice.getId()) + .set(FormalSettlementInvoice::getMatchedAmount, matchedAmount)); + // 关系重建语义为删全量重建,须传本单全部发票号,只传单票会清掉其他认领关系 + List allInvoiceNos = invoiceMapper.selectList(Wrappers.lambdaQuery() + .eq(FormalSettlementInvoice::getFormalSettlementId, id)).stream() + .map(FormalSettlementInvoice::getInvoiceNo).filter(Func::isNotBlank).distinct().toList(); + invoiceReceiptService.syncSettlementReceiptRelations(id, allInvoiceNos); + } // 第一步:复用收票推送状态机重推金蝶收票单(A303-2,A801-3 幂等预检防重复保存,单笔事务独立回滚) String pushResult = invoiceReceiptService.pushKingdeeReceivedInvoice(List.of(receipt.getId())); // 第二步:收票单就绪后按应付单防重键 A302-6 指定应付(幂等,已指定的跳过)