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