feat: 结算单认领分摊金额改取手动匹配金额

This commit is contained in:
刘泉佳
2026-11-02 18:38:11 +08:00
parent 34e9030164
commit 49ccb435ea
@@ -75,6 +75,7 @@ import org.springblade.transport.pojo.entity.CustomerContact;
import org.springblade.transport.pojo.entity.CustomerInvoiceInfo;
import org.springblade.transport.pojo.entity.FormalSettlement;
import org.springblade.transport.pojo.entity.FormalSettlementDetail;
import org.springblade.transport.pojo.entity.FormalSettlementInvoice;
import org.springblade.transport.pojo.entity.InvoiceReceipt;
import org.springblade.transport.pojo.entity.InvoiceReceiptRecord;
import org.springblade.transport.pojo.entity.InvoiceReceiptSettlement;
@@ -981,7 +982,14 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
.eq(InvoiceReceipt::getApprovalStatus, TransportBusiConstant.APPROVED)
.last("FOR UPDATE"));
this.checkSingleSettlementClaim(settlement, matchedReceipts);
// 重建本结算单认领关系(删旧建新,认领金额=发票金额全额认领)
// 重建本结算单认领关系(删旧建新):分摊金额取发票行的匹配结算单金额(支持手动修改),未匹配到的回退发票全额
Map<String, BigDecimal> matchedByInvoiceNo = formalSettlementInvoiceMapper.selectList(
Wrappers.<FormalSettlementInvoice>lambdaQuery()
.eq(FormalSettlementInvoice::getFormalSettlementId, settlementId))
.stream()
.filter(row -> Func.isNotBlank(row.getInvoiceNo()))
.collect(Collectors.toMap(FormalSettlementInvoice::getInvoiceNo,
row -> money(row.getMatchedAmount()), (left, right) -> left));
settlementRelationMapper.delete(Wrappers.<InvoiceReceiptSettlement>lambdaQuery()
.eq(InvoiceReceiptSettlement::getFormalSettlementId, settlementId));
for (InvoiceReceipt receipt : matchedReceipts) {
@@ -991,9 +999,10 @@ public class InvoiceReceiptServiceImpl extends BaseServiceImpl<InvoiceReceiptMap
relation.setFormalSettlementNo(settlement.getFormalSettlementNo());
relation.setSettlementAmount(money(settlement.getSettlementAmount()));
relation.setReceivedInvoiceAmount(receivedAmount(settlementId, receipt.getId()));
relation.setAllocatedInvoiceAmount(money(receipt.getInvoiceAmount()));
relation.setAllocatedInvoiceAmount(
matchedByInvoiceNo.getOrDefault(receipt.getInvoiceNo(), money(receipt.getInvoiceAmount())));
settlementRelationMapper.insert(relation);
log.info("结算单[{}]认领收票登记[{}]:全额认领 {}", settlement.getFormalSettlementNo(),
log.info("结算单[{}]认领收票登记[{}]:分摊金额 {}", settlement.getFormalSettlementNo(),
receipt.getInvoiceNo(), relation.getAllocatedInvoiceAmount());
}
refreshSettlementInvoiceStatus(settlementId);
@@ -2105,7 +2114,7 @@ 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";
settlement.setInvoiceAmount(invoiceAmount);