[FIX] FMS:报表校验逐月查损益改直调账簿余额,断 getClosingOverview↔checkBalanceSheet 无限递归(A40)- #1215

#1215
This commit is contained in:
YunaiV
2026-09-26 11:27:38 +08:00
parent 752852ae19
commit 7cca10fcc9
3 changed files with 8 additions and 13 deletions
@@ -61,9 +61,6 @@ public interface FmsClosingPeriodService {
/**
* 获得指定会计期间的损益结转余额(末级损益科目本期借贷差额绝对值之和)
*
* 供报表勾稽逐月检查损益是否结转使用:直接查账簿余额,
* 不重入 getClosingOverview(后者内部会回调报表 check,构成无限递归)。
*
* @param accountSetId 账套编号
* @param month 会计期间
* @param userId 用户编号
@@ -7,8 +7,6 @@ import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.fms.controller.admin.closing.vo.FmsClosingOverviewRespVO;
import cn.iocoder.yudao.module.fms.controller.admin.closing.vo.FmsClosingQueryReqVO;
import cn.iocoder.yudao.module.fms.controller.admin.ledger.vo.subjectbalance.FmsLedgerSubjectBalanceRespVO;
import cn.iocoder.yudao.module.fms.controller.admin.report.vo.balance.FmsBalanceSheetCheckRespVO;
import cn.iocoder.yudao.module.fms.controller.admin.report.vo.balance.FmsBalanceSheetRowRespVO;
@@ -292,7 +290,7 @@ public class FmsBalanceSheetServiceImpl implements FmsBalanceSheetService {
}
/**
* 判断查询期间内各月的损益是否均已结转,逐月检查结账概览的损益余额
* 判断查询期间内各月的损益是否均已结转
*
* @param listReqVO 查询条件
* @param userId 用户编号
@@ -302,8 +300,7 @@ public class FmsBalanceSheetServiceImpl implements FmsBalanceSheetService {
YearMonth endMonth = LocalDateTimeUtils.parseYearMonth(listReqVO.getEndMonth());
for (YearMonth currentMonth = LocalDateTimeUtils.parseYearMonth(listReqVO.getStartMonth());
!currentMonth.isAfter(endMonth); currentMonth = currentMonth.plusMonths(1)) {
// 直接查当月损益余额,不再重入 getClosingOverview
//(其内部会回调本类 checkBalanceSheet → 本方法,对同月构成无界自递归,栈溢出)
// 直接查询损益余额,避免报表校验与结账概况循环调用
BigDecimal profitLossBalance = closingPeriodService.getProfitLossBalance(
listReqVO.getAccountSetId(), currentMonth.toString(), userId);
// 当月损益余额不为零时,说明存在尚未结转的损益
@@ -21,7 +21,6 @@ import cn.iocoder.yudao.module.fms.dal.mysql.report.balance.FmsBalanceSheetConfi
import cn.iocoder.yudao.module.fms.dal.mysql.report.balance.FmsBalanceSheetReportMapper;
import cn.iocoder.yudao.module.fms.enums.config.FmsSubjectTypeEnum;
import cn.iocoder.yudao.module.fms.enums.report.FmsReportTypeEnum;
import cn.iocoder.yudao.module.fms.controller.admin.closing.vo.FmsClosingOverviewRespVO;
import cn.iocoder.yudao.module.fms.service.closing.FmsClosingPeriodService;
import cn.iocoder.yudao.module.fms.service.closing.FmsClosingSchemeService;
import cn.iocoder.yudao.module.fms.service.closing.FmsClosingVoucherService;
@@ -46,6 +45,7 @@ import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.when;
@@ -206,8 +206,8 @@ public class FmsBalanceSheetServiceImplTest extends BaseDbUnitTest {
FmsTrialBalanceRespVO trialBalance = new FmsTrialBalanceRespVO();
trialBalance.setBalanced(false);
when(initialBalanceService.getTrialBalance(1L, 10L)).thenReturn(trialBalance);
when(closingPeriodService.getClosingOverview(any(), eq(10L)))
.thenReturn(new FmsClosingOverviewRespVO().setProfitLossBalance(new BigDecimal("20.00")));
when(closingPeriodService.getProfitLossBalance(1L, "2026-08", 10L))
.thenReturn(new BigDecimal("20.00"));
// 调用
FmsBalanceSheetCheckRespVO result = balanceSheetService.checkBalanceSheet(buildQueryReqVO(), 10L);
@@ -241,14 +241,15 @@ public class FmsBalanceSheetServiceImplTest extends BaseDbUnitTest {
.setChildren(Collections.emptyList())));
when(initialBalanceService.getTrialBalance(1L, 10L))
.thenReturn(new FmsTrialBalanceRespVO().setBalanced(true));
when(closingPeriodService.getClosingOverview(any(), eq(10L)))
.thenReturn(new FmsClosingOverviewRespVO().setProfitLossBalance(BigDecimal.ZERO));
when(closingPeriodService.getProfitLossBalance(1L, "2026-08", 10L))
.thenReturn(BigDecimal.ZERO);
// 调用
FmsBalanceSheetCheckRespVO result = balanceSheetService.checkBalanceSheet(buildQueryReqVO(), 10L);
// 断言
assertEquals(0, result.getUnmappedSubjects().size());
assertTrue(result.getProfitLossTransferred());
}
// ========== 随机对象 ==========