From 15dc0791f1ebdfde5c5ac6906570f994897fbcb9 Mon Sep 17 00:00:00 2001 From: b2894lxlx <517289602@qq.com> Date: Fri, 28 Aug 2026 02:10:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E9=A6=96=E4=BB=98=E6=AC=BE?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../FormalSettlementBatchPaymentRequest.java | 23 ++++++++++ .../FormalSettlementController.java | 8 ++++ .../service/IFormalSettlementService.java | 2 + .../service/impl/BillLedgerServiceImpl.java | 2 - .../service/impl/BillPaymentServiceImpl.java | 3 -- .../impl/FormalSettlementServiceImpl.java | 42 +++++++++++++++++-- .../impl/PreSettlementServiceImpl.java | 31 +++++++------- 7 files changed, 88 insertions(+), 23 deletions(-) create mode 100644 blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/dto/FormalSettlementBatchPaymentRequest.java diff --git a/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/dto/FormalSettlementBatchPaymentRequest.java b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/dto/FormalSettlementBatchPaymentRequest.java new file mode 100644 index 0000000..75fad7f --- /dev/null +++ b/blade-service-api/blade-transport-api/src/main/java/org/springblade/transport/pojo/dto/FormalSettlementBatchPaymentRequest.java @@ -0,0 +1,23 @@ +package org.springblade.transport.pojo.dto; + +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.List; + +/** 正式结算批量付款申请请求。 @author Chill */ +@Data +public class FormalSettlementBatchPaymentRequest implements Serializable { + @Serial private static final long serialVersionUID = 1L; + private List items; + private String remark; + + @Data + public static class Item implements Serializable { + @Serial private static final long serialVersionUID = 1L; + private Long id; + private BigDecimal appliedAmount; + } +} 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 8604023..b8d2420 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 @@ -20,6 +20,7 @@ import org.springblade.core.secure.annotation.PreAuth; import org.springblade.core.tool.api.R; import org.springblade.transport.pojo.dto.FormalSettlementSaveRequest; import org.springblade.transport.pojo.dto.FormalSettlementPaymentRequest; +import org.springblade.transport.pojo.dto.FormalSettlementBatchPaymentRequest; import org.springblade.transport.pojo.dto.FormalSettlementStatusRequest; import org.springblade.transport.pojo.dto.PreSettlementDetailAdjustRequest; import org.springblade.transport.pojo.entity.FormalSettlementDetailFee; @@ -158,4 +159,11 @@ public class FormalSettlementController extends BladeController { public R applyPayment(@RequestBody FormalSettlementPaymentRequest request) { return R.data(formalSettlementService.applyPayment(request)); } + + @PostMapping("/apply-payments") + @ApiOperationSupport(order = 18) + @Operation(summary = "批量发起尾款付款申请") + public R> applyPayments(@RequestBody FormalSettlementBatchPaymentRequest request) { + return R.data(formalSettlementService.applyPayments(request)); + } } 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 abb997c..710291a 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 @@ -20,6 +20,7 @@ import org.springblade.transport.pojo.dto.PreSettlementDetailAdjustRequest; import org.springblade.transport.pojo.entity.FormalSettlementDetailFee; import java.util.List; import org.springblade.transport.pojo.dto.FormalSettlementPaymentRequest; +import org.springblade.transport.pojo.dto.FormalSettlementBatchPaymentRequest; /** * 正式结算单服务 @@ -41,4 +42,5 @@ public interface IFormalSettlementService extends BaseService List detailFees(Long detailId); void adjustDetail(PreSettlementDetailAdjustRequest request); String applyPayment(FormalSettlementPaymentRequest request); + List applyPayments(FormalSettlementBatchPaymentRequest request); } diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/BillLedgerServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/BillLedgerServiceImpl.java index e3645c2..64f7119 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/BillLedgerServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/BillLedgerServiceImpl.java @@ -86,14 +86,12 @@ public class BillLedgerServiceImpl extends BaseServiceImpl availableOptions(String keyword, Long deptId, Long selectedId) { - LocalDate today = LocalDate.now(); return list(Wrappers.lambdaQuery() .and(Func.isNotEmpty(keyword), wrapper -> wrapper.like(BillLedger::getBillNo, keyword) .or().like(BillLedger::getIssuerName, keyword) .or().like(BillLedger::getReceiverName, keyword)) .and(wrapper -> wrapper .gt(BillLedger::getAvailableBalance, BigDecimal.ZERO) - .ge(BillLedger::getMaturityDate, today) .or(selectedId != null, child -> child.eq(BillLedger::getId, selectedId))) .orderByAsc(BillLedger::getMaturityDate) .orderByDesc(BillLedger::getCreateTime) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/BillPaymentServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/BillPaymentServiceImpl.java index 15125ee..156594a 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/BillPaymentServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/BillPaymentServiceImpl.java @@ -255,9 +255,6 @@ public class BillPaymentServiceImpl extends BaseServiceImpl applyPayments(FormalSettlementBatchPaymentRequest request) { + if (request == null || request.getItems() == null || request.getItems().isEmpty()) { + throw new ServiceException("请至少选择一条正式结算单"); + } + List items = request.getItems(); + if (items.stream().anyMatch(item -> item == null || item.getId() == null)) { + throw new ServiceException("付款申请单据不能为空"); + } + if (items.stream().map(FormalSettlementBatchPaymentRequest.Item::getId).distinct().count() != items.size()) { + throw new ServiceException("付款申请单据不能重复"); + } + List settlements = items.stream().map(item -> existing(item.getId())).toList(); + Long contractId = settlements.get(0).getContractId(); + if (items.size() > 1 && (contractId == null + || settlements.stream().anyMatch(item -> !Objects.equals(contractId, item.getContractId())))) { + throw new ServiceException("批量付款申请必须选择同一合同的正式结算单"); + } + List paymentNos = new java.util.ArrayList<>(); + for (int index = 0; index < settlements.size(); index++) { + FormalSettlementBatchPaymentRequest.Item item = items.get(index); + paymentNos.add(createPayment(settlements.get(index), item.getAppliedAmount(), request.getRemark())); + } + return paymentNos; + } + + private String createPayment(FormalSettlement settlement, BigDecimal appliedAmount, String remark) { if (!APPROVED.equals(settlement.getApprovalStatus())) throw new ServiceException("仅审批通过的正式结算单允许发起付款申请"); if (!"payable".equals(settlement.getSettlementType())) throw new ServiceException("仅应付正式结算单允许发起付款申请"); - BigDecimal amount = positive(request.getAppliedAmount(), "申请付款金额"); + BigDecimal amount = positive(appliedAmount, "申请付款金额"); BigDecimal available = money(settlement.getSettlementAmount()).subtract(money(settlement.getAppliedPaymentAmount())); if (amount.compareTo(available) > 0) throw new ServiceException("申请付款金额不能超过剩余可申请金额" + available); FormalSettlementPayment payment = new FormalSettlementPayment(); @@ -360,7 +392,7 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl feeItems = parseFeeItems(feeRow.getFeeItemsJson()); boolean containsFreight = feeItems.keySet().stream().anyMatch(this::isFreightFeeItem); + BigDecimal componentAmount = feeItems.values().stream().map(this::money) + .reduce(BigDecimal.ZERO, BigDecimal::add); if (!containsFreight) { + BigDecimal freightAmount = money(feeRow.getFreightAmount()); aggregates.merge( summaryKey(feeTypeMap.getOrDefault("运输费", ""), "运输费"), - money(feeRow.getFreightAmount()), + freightAmount, BigDecimal::add); + componentAmount = componentAmount.add(freightAmount); } feeItems.forEach((feeItem, amount) -> aggregates.merge( summaryKey(feeTypeMap.getOrDefault(feeItem, ""), feeItem), money(amount), BigDecimal::add)); + BigDecimal residualAmount = money(money(feeRow.getSettlementAmountTax()) + .subtract(componentAmount)); + if (residualAmount.signum() != 0) { + aggregates.merge( + summaryKey(feeTypeMap.getOrDefault("其他费用", ""), "其他费用"), + residualAmount, + BigDecimal::add); + } } summaryFeeMapper.delete(Wrappers.lambdaQuery() .eq(PreSettlementSummaryFee::getPreSettlementId, settlementId) @@ -885,9 +897,6 @@ public class PreSettlementServiceImpl extends BaseServiceImpl