fix: 预付转正式结转手工合计费用行,修复推送金蝶金额缺失

- rebuildSummaryFees 不再将预结算手工费用行(manualFlag=1)并入自动汇总:金蝶分录只送手工行,并入后被当作明细再汇总跳过,导致 YJ2026101900004 转正式后水费 500 元未推送金蝶
- 预结算手工行结转为正式手工行(同键已存在时沿用页面维护值不重复插入)
- applySummaryRequest 空列表视为沿用 rebuild 结果,不再按空请求删光手工行(与预结算同口径)
This commit is contained in:
刘泉佳
2026-10-19 21:38:28 +08:00
parent 2885375b02
commit 20038ae187
@@ -1349,6 +1349,9 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl<FormalSettlemen
List<FormalSettlementSummaryFee> existingManualRows = existingRows.stream()
.filter(row -> Integer.valueOf(1).equals(row.getManualFlag())).toList();
Map<String, BigDecimal> aggregates = new LinkedHashMap<>();
// 预结算手工费用行不并入自动汇总:金蝶分录只送手工行(manualFlag=1),并入自动汇总
// 会被当作明细再汇总跳过,推送金蝶时金额缺失(如预付单手工水费转正式后丢失)
Map<String, BigDecimal> sourceManualAmounts = new LinkedHashMap<>();
for (FormalSettlementSource source : sourceMapper.selectList(Wrappers.<FormalSettlementSource>lambdaQuery()
.eq(FormalSettlementSource::getFormalSettlementId, settlementId))) {
List<PreSettlementSummaryFee> sourceSummary = preSummaryFeeMapper.selectList(
@@ -1356,9 +1359,12 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl<FormalSettlemen
.eq(PreSettlementSummaryFee::getPreSettlementId, source.getPreSettlementId())
.eq(PreSettlementSummaryFee::getIsDeleted, 0));
sourceSummary.forEach(row -> {
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<String, String> feeTypeMap = feeTypeMap();
@@ -1393,6 +1399,25 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl<FormalSettlemen
manualRow.setLineNo(lineNo++);
summaryFeeMapper.updateById(manualRow);
}
// 预结算手工费用行结转为正式手工行(保留 manualFlag=1 供金蝶分录取数);已存在同键手工行时沿用页面维护值不重复插入
for (Map.Entry<String, BigDecimal> 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<FormalSettlemen
}
private void applySummaryRequest(Long settlementId, List<FormalSettlementSaveRequest.SummaryFee> requestRows) {
if (requestRows == null) return;
if (requestRows == null) {
return;
}
// 空列表表示沿用 rebuildSummaryFees 结果(如预结算转正式结转的手工合计行),不得按空请求删光手工行
if (requestRows.isEmpty()) {
renumberSummaryFees(settlementId);
return;
}
Map<String, Set<String>> allowedManualFees = new LinkedHashMap<>();
for (Map<String, Object> option : preSettlementService.feeOptions()) {
Set<String> feeItems = new LinkedHashSet<>();