From 7cca10fcc9499b82c71b1955b89b720bfe8d3748 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sat, 26 Sep 2026 11:27:38 +0800 Subject: [PATCH] [FIX] FMS:报表校验逐月查损益改直调账簿余额,断 getClosingOverview↔checkBalanceSheet 无限递归(A40)- #1215 #1215 --- yudao-module-fms/src/main/java/cn/iocoder/yudao/module/fms/service/closing/FmsClosingPeriodService.java | 3 --- yudao-module-fms/src/main/java/cn/iocoder/yudao/module/fms/service/report/FmsBalanceSheetServiceImpl.java | 7 ++----- yudao-module-fms/src/test/java/cn/iocoder/yudao/module/fms/service/report/FmsBalanceSheetServiceImplTest.java | 11 ++++++----- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/yudao-module-fms/src/main/java/cn/iocoder/yudao/module/fms/service/closing/FmsClosingPeriodService.java b/yudao-module-fms/src/main/java/cn/iocoder/yudao/module/fms/service/closing/FmsClosingPeriodService.java index e6de378..a40f85e 100644 --- a/yudao-module-fms/src/main/java/cn/iocoder/yudao/module/fms/service/closing/FmsClosingPeriodService.java +++ b/yudao-module-fms/src/main/java/cn/iocoder/yudao/module/fms/service/closing/FmsClosingPeriodService.java @@ -61,9 +61,6 @@ public interface FmsClosingPeriodService { /** * 获得指定会计期间的损益结转余额(末级损益科目本期借贷差额绝对值之和) * - * 供报表勾稽逐月检查损益是否结转使用:直接查账簿余额, - * 不重入 getClosingOverview(后者内部会回调报表 check,构成无限递归)。 - * * @param accountSetId 账套编号 * @param month 会计期间 * @param userId 用户编号 diff --git a/yudao-module-fms/src/main/java/cn/iocoder/yudao/module/fms/service/report/FmsBalanceSheetServiceImpl.java b/yudao-module-fms/src/main/java/cn/iocoder/yudao/module/fms/service/report/FmsBalanceSheetServiceImpl.java index 0edf679..afd80a6 100644 --- a/yudao-module-fms/src/main/java/cn/iocoder/yudao/module/fms/service/report/FmsBalanceSheetServiceImpl.java +++ b/yudao-module-fms/src/main/java/cn/iocoder/yudao/module/fms/service/report/FmsBalanceSheetServiceImpl.java @@ -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); // 当月损益余额不为零时,说明存在尚未结转的损益 diff --git a/yudao-module-fms/src/test/java/cn/iocoder/yudao/module/fms/service/report/FmsBalanceSheetServiceImplTest.java b/yudao-module-fms/src/test/java/cn/iocoder/yudao/module/fms/service/report/FmsBalanceSheetServiceImplTest.java index 6cad241..1e85f37 100644 --- a/yudao-module-fms/src/test/java/cn/iocoder/yudao/module/fms/service/report/FmsBalanceSheetServiceImplTest.java +++ b/yudao-module-fms/src/test/java/cn/iocoder/yudao/module/fms/service/report/FmsBalanceSheetServiceImplTest.java @@ -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()); } // ========== 随机对象 ========== -- libgit2 0.21.4