feat: 先票后款全额认领放开匹配合计上限并按覆盖判定收票状态
This commit is contained in:
+6
-9
@@ -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) {
|
||||
|
||||
+2
-1
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user