feat: 先票后款全额认领放开匹配合计上限并按覆盖判定收票状态

This commit is contained in:
刘泉佳
2026-10-31 16:52:21 +08:00
parent f2b1a2feb7
commit 933fb37de6
2 changed files with 8 additions and 10 deletions
@@ -1229,17 +1229,14 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl<FormalSettlemen
FormalSettlement settlement = existing(request.getFormalSettlementId());
List<FormalSettlementSaveRequest.Invoice> invoices = request.getInvoices();
Set<String> invoiceNumbers = new LinkedHashSet<>();
BigDecimal matchedTotal = BigDecimal.ZERO;
for (FormalSettlementSaveRequest.Invoice item : invoices) {
String invoiceNo = item == null ? "" : requiredText(item.getInvoiceNo(), "发票号");
if (!invoiceNumbers.add(invoiceNo)) throw new ServiceException("发票号" + invoiceNo + "重复");
matchedTotal = matchedTotal.add(money(item.getMatchedAmount()));
}
// 认领闸门:确认前按票号重查金蝶复核可用性,选中到确认之间票被认领/使用/红冲在此拦截
invoiceReceiptService.assertInvoicesClaimable(invoiceNumbers);
if (matchedTotal.compareTo(money(settlement.getSettlementAmount())) > 0) {
throw new ServiceException("发票匹配结算单金额合计不能超过结算金额");
}
// 先票后款:认领金额=发票全额,发票合计可超过结算金额(发票金额与结算金额本就是两个口径),
// 不再校验"匹配合计不能超过结算金额";收票状态以是否覆盖结算金额判定(invoiceStatus)
List<FormalSettlementInvoice> existingInvoices = invoiceMapper.selectList(
Wrappers.<FormalSettlementInvoice>lambdaQuery().eq(FormalSettlementInvoice::getFormalSettlementId, settlement.getId()));
Set<String> existingNumbers = existingInvoices.stream().map(FormalSettlementInvoice::getInvoiceNo)
@@ -1749,9 +1746,8 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl<FormalSettlemen
}
matchedTotal = matchedTotal.add(matchedAmount);
}
if (matchedTotal.compareTo(money(settlement.getSettlementAmount())) > 0) {
throw new ServiceException("发票匹配结算单金额合计不能超过结算金额");
}
// 先票后款:认领金额=发票全额,发票合计可超过结算金额(发票金额与结算金额本就是两个口径),
// 不再校验"匹配合计不能超过结算金额";收票状态以是否覆盖结算金额判定(invoiceStatus)
invoiceMapper.delete(Wrappers.<FormalSettlementInvoice>lambdaQuery()
.eq(FormalSettlementInvoice::getFormalSettlementId, settlement.getId()));
int lineNo = 1;
@@ -2316,7 +2312,8 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl<FormalSettlemen
private String invoiceStatus(BigDecimal invoiceAmount, BigDecimal settlementAmount) {
BigDecimal matchedAmount = money(invoiceAmount);
if (matchedAmount.compareTo(BigDecimal.ZERO) <= 0) return "unreceived";
return matchedAmount.compareTo(money(settlementAmount)) == 0 ? "completed" : "partial";
// 先票后款全额认领:匹配金额=发票全额,可超过结算金额,覆盖即视为已完成收票
return matchedAmount.compareTo(money(settlementAmount)) >= 0 ? "completed" : "partial";
}
private record PaymentSummary(BigDecimal appliedAmount, BigDecimal paidAmount) {
@@ -2119,8 +2119,9 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
FormalSettlement settlement = formalSettlementMapper.selectById(settlementId);
if (settlement == null) return;
BigDecimal invoiceAmount = receivedAmount(settlementId, null);
// 先票后款全额认领:匹配金额=发票全额,可超过结算金额,覆盖即视为已完成收票
String invoiceStatus = invoiceAmount.compareTo(BigDecimal.ZERO) <= 0 ? "unreceived"
: invoiceAmount.compareTo(money(settlement.getSettlementAmount())) == 0 ? "completed" : "partial";
: invoiceAmount.compareTo(money(settlement.getSettlementAmount())) >= 0 ? "completed" : "partial";
settlement.setInvoiceAmount(invoiceAmount);
settlement.setInvoiceStatus(invoiceStatus);
formalSettlementMapper.updateById(settlement);