From 7e7fa6be4025aeeaf32e6606832180242f608360 Mon Sep 17 00:00:00 2001 From: dadiyang Date: Tue, 22 Sep 2026 00:53:32 +0800 Subject: [PATCH] fix(fms):报表勾稽逐月查损益改直调 getProfitLossBalance,断 getClosingOverview↔checkBalanceSheet 无限递归栈溢出(A40) --- yudao-module-fms/src/main/java/cn/iocoder/yudao/module/fms/service/closing/FmsClosingPeriodService.java | 14 ++++++++++++++ yudao-module-fms/src/main/java/cn/iocoder/yudao/module/fms/service/closing/FmsClosingPeriodServiceImpl.java | 5 +++++ yudao-module-fms/src/main/java/cn/iocoder/yudao/module/fms/service/report/FmsBalanceSheetServiceImpl.java | 10 +++++----- 3 files changed, 24 insertions(+), 5 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 b6bb20d..e6de378 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 @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.fms.service.closing; import cn.iocoder.yudao.module.fms.controller.admin.closing.vo.FmsClosingOverviewRespVO; import cn.iocoder.yudao.module.fms.controller.admin.closing.vo.FmsClosingQueryReqVO; +import java.math.BigDecimal; import java.time.LocalDateTime; import java.time.YearMonth; @@ -58,6 +59,19 @@ public interface FmsClosingPeriodService { FmsClosingOverviewRespVO getClosingOverview(FmsClosingQueryReqVO queryReqVO, Long userId); /** + * 获得指定会计期间的损益结转余额(末级损益科目本期借贷差额绝对值之和) + * + * 供报表勾稽逐月检查损益是否结转使用:直接查账簿余额, + * 不重入 getClosingOverview(后者内部会回调报表 check,构成无限递归)。 + * + * @param accountSetId 账套编号 + * @param month 会计期间 + * @param userId 用户编号 + * @return 损益余额 + */ + BigDecimal getProfitLossBalance(Long accountSetId, String month, Long userId); + + /** * 结账 * * @param queryReqVO 结账期间 diff --git a/yudao-module-fms/src/main/java/cn/iocoder/yudao/module/fms/service/closing/FmsClosingPeriodServiceImpl.java b/yudao-module-fms/src/main/java/cn/iocoder/yudao/module/fms/service/closing/FmsClosingPeriodServiceImpl.java index 207c930..c058e22 100644 --- a/yudao-module-fms/src/main/java/cn/iocoder/yudao/module/fms/service/closing/FmsClosingPeriodServiceImpl.java +++ b/yudao-module-fms/src/main/java/cn/iocoder/yudao/module/fms/service/closing/FmsClosingPeriodServiceImpl.java @@ -199,6 +199,11 @@ public class FmsClosingPeriodServiceImpl implements FmsClosingPeriodService { } @Override + public BigDecimal getProfitLossBalance(Long accountSetId, String month, Long userId) { + return calculateProfitLossBalance(accountSetId, LocalDateTimeUtils.parseYearMonth(month), userId); + } + + @Override @Transactional(rollbackFor = Exception.class) @LogRecord(type = FMS_CLOSING_TYPE, subType = FMS_CLOSING_PERIOD_CLOSE_SUB_TYPE, bizNo = "{{#queryReqVO.accountSetId}}", success = FMS_CLOSING_PERIOD_CLOSE_SUCCESS) 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 f7d912f..0edf679 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 @@ -302,12 +302,12 @@ 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)) { - FmsClosingQueryReqVO closingQueryReqVO = new FmsClosingQueryReqVO(); - closingQueryReqVO.setAccountSetId(listReqVO.getAccountSetId()); - closingQueryReqVO.setMonth(currentMonth.toString()); - FmsClosingOverviewRespVO overview = closingPeriodService.getClosingOverview(closingQueryReqVO, userId); + // 直接查当月损益余额,不再重入 getClosingOverview + //(其内部会回调本类 checkBalanceSheet → 本方法,对同月构成无界自递归,栈溢出) + BigDecimal profitLossBalance = closingPeriodService.getProfitLossBalance( + listReqVO.getAccountSetId(), currentMonth.toString(), userId); // 当月损益余额不为零时,说明存在尚未结转的损益 - if (NumberUtils.zeroIfNull(overview.getProfitLossBalance()).signum() != 0) { + if (NumberUtils.zeroIfNull(profitLossBalance).signum() != 0) { return false; } } -- libgit2 0.21.4