diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java index 91268648..345a6a03 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java @@ -1349,6 +1349,9 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl existingManualRows = existingRows.stream() .filter(row -> Integer.valueOf(1).equals(row.getManualFlag())).toList(); Map aggregates = new LinkedHashMap<>(); + // 预结算手工费用行不并入自动汇总:金蝶分录只送手工行(manualFlag=1),并入自动汇总 + // 会被当作明细再汇总跳过,推送金蝶时金额缺失(如预付单手工水费转正式后丢失) + Map sourceManualAmounts = new LinkedHashMap<>(); for (FormalSettlementSource source : sourceMapper.selectList(Wrappers.lambdaQuery() .eq(FormalSettlementSource::getFormalSettlementId, settlementId))) { List sourceSummary = preSummaryFeeMapper.selectList( @@ -1356,9 +1359,12 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl { - BigDecimal additionalAmount = Integer.valueOf(1).equals(row.getManualFlag()) - ? money(row.getSettlementAmount()) : money(row.getAdjustAmount()); - aggregates.merge(summaryKey(row.getFeeType(), row.getFeeItem()), additionalAmount, BigDecimal::add); + if (Integer.valueOf(1).equals(row.getManualFlag())) { + sourceManualAmounts.merge(summaryKey(row.getFeeType(), row.getFeeItem()), + money(row.getSettlementAmount()), BigDecimal::add); + } else { + aggregates.merge(summaryKey(row.getFeeType(), row.getFeeItem()), money(row.getAdjustAmount()), BigDecimal::add); + } }); } Map feeTypeMap = feeTypeMap(); @@ -1393,6 +1399,25 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl entry : sourceManualAmounts.entrySet()) { + boolean existed = existingManualRows.stream().anyMatch(row -> summaryKey(row).equals(entry.getKey())); + if (existed) { + continue; + } + String[] keyParts = entry.getKey().split("@@@", 2); + FormalSettlementSummaryFee manualRow = new FormalSettlementSummaryFee(); + manualRow.setFormalSettlementId(settlementId); + manualRow.setFeeType(keyParts[0]); + manualRow.setFeeItem(keyParts.length > 1 ? keyParts[1] : ""); + manualRow.setOriginalAmount(BigDecimal.ZERO.setScale(2)); + manualRow.setAdjustAmount(money(entry.getValue())); + manualRow.setSettlementAmount(money(entry.getValue())); + manualRow.setRemark(""); + manualRow.setManualFlag(1); + manualRow.setLineNo(lineNo++); + summaryFeeMapper.insert(manualRow); + } renumberSummaryFees(settlementId); } @@ -1489,7 +1514,14 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl requestRows) { - if (requestRows == null) return; + if (requestRows == null) { + return; + } + // 空列表表示沿用 rebuildSummaryFees 结果(如预结算转正式结转的手工合计行),不得按空请求删光手工行 + if (requestRows.isEmpty()) { + renumberSummaryFees(settlementId); + return; + } Map> allowedManualFees = new LinkedHashMap<>(); for (Map option : preSettlementService.feeOptions()) { Set feeItems = new LinkedHashSet<>();