Commit 7cca10fcc9499b82c71b1955b89b720bfe8d3748

Authored by YunaiV
1 parent 752852ae

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

#1215
yudao-module-fms/src/main/java/cn/iocoder/yudao/module/fms/service/closing/FmsClosingPeriodService.java
@@ -61,9 +61,6 @@ public interface FmsClosingPeriodService { @@ -61,9 +61,6 @@ public interface FmsClosingPeriodService {
61 /** 61 /**
62 * 获得指定会计期间的损益结转余额(末级损益科目本期借贷差额绝对值之和) 62 * 获得指定会计期间的损益结转余额(末级损益科目本期借贷差额绝对值之和)
63 * 63 *
64 - * 供报表勾稽逐月检查损益是否结转使用:直接查账簿余额,  
65 - * 不重入 getClosingOverview(后者内部会回调报表 check,构成无限递归)。  
66 - *  
67 * @param accountSetId 账套编号 64 * @param accountSetId 账套编号
68 * @param month 会计期间 65 * @param month 会计期间
69 * @param userId 用户编号 66 * @param userId 用户编号
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; @@ -7,8 +7,6 @@ import cn.iocoder.yudao.framework.common.util.date.LocalDateTimeUtils;
7 import cn.iocoder.yudao.framework.common.util.json.JsonUtils; 7 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
8 import cn.iocoder.yudao.framework.common.util.number.NumberUtils; 8 import cn.iocoder.yudao.framework.common.util.number.NumberUtils;
9 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 9 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
10 -import cn.iocoder.yudao.module.fms.controller.admin.closing.vo.FmsClosingOverviewRespVO;  
11 -import cn.iocoder.yudao.module.fms.controller.admin.closing.vo.FmsClosingQueryReqVO;  
12 import cn.iocoder.yudao.module.fms.controller.admin.ledger.vo.subjectbalance.FmsLedgerSubjectBalanceRespVO; 10 import cn.iocoder.yudao.module.fms.controller.admin.ledger.vo.subjectbalance.FmsLedgerSubjectBalanceRespVO;
13 import cn.iocoder.yudao.module.fms.controller.admin.report.vo.balance.FmsBalanceSheetCheckRespVO; 11 import cn.iocoder.yudao.module.fms.controller.admin.report.vo.balance.FmsBalanceSheetCheckRespVO;
14 import cn.iocoder.yudao.module.fms.controller.admin.report.vo.balance.FmsBalanceSheetRowRespVO; 12 import cn.iocoder.yudao.module.fms.controller.admin.report.vo.balance.FmsBalanceSheetRowRespVO;
@@ -292,7 +290,7 @@ public class FmsBalanceSheetServiceImpl implements FmsBalanceSheetService { @@ -292,7 +290,7 @@ public class FmsBalanceSheetServiceImpl implements FmsBalanceSheetService {
292 } 290 }
293 291
294 /** 292 /**
295 - * 判断查询期间内各月的损益是否均已结转,逐月检查结账概览的损益余额 293 + * 判断查询期间内各月的损益是否均已结转
296 * 294 *
297 * @param listReqVO 查询条件 295 * @param listReqVO 查询条件
298 * @param userId 用户编号 296 * @param userId 用户编号
@@ -302,8 +300,7 @@ public class FmsBalanceSheetServiceImpl implements FmsBalanceSheetService { @@ -302,8 +300,7 @@ public class FmsBalanceSheetServiceImpl implements FmsBalanceSheetService {
302 YearMonth endMonth = LocalDateTimeUtils.parseYearMonth(listReqVO.getEndMonth()); 300 YearMonth endMonth = LocalDateTimeUtils.parseYearMonth(listReqVO.getEndMonth());
303 for (YearMonth currentMonth = LocalDateTimeUtils.parseYearMonth(listReqVO.getStartMonth()); 301 for (YearMonth currentMonth = LocalDateTimeUtils.parseYearMonth(listReqVO.getStartMonth());
304 !currentMonth.isAfter(endMonth); currentMonth = currentMonth.plusMonths(1)) { 302 !currentMonth.isAfter(endMonth); currentMonth = currentMonth.plusMonths(1)) {
305 - // 直接查当月损益余额,不再重入 getClosingOverview  
306 - //(其内部会回调本类 checkBalanceSheet → 本方法,对同月构成无界自递归,栈溢出) 303 + // 直接查询损益余额,避免报表校验与结账概况循环调用
307 BigDecimal profitLossBalance = closingPeriodService.getProfitLossBalance( 304 BigDecimal profitLossBalance = closingPeriodService.getProfitLossBalance(
308 listReqVO.getAccountSetId(), currentMonth.toString(), userId); 305 listReqVO.getAccountSetId(), currentMonth.toString(), userId);
309 // 当月损益余额不为零时,说明存在尚未结转的损益 306 // 当月损益余额不为零时,说明存在尚未结转的损益
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 @@ -21,7 +21,6 @@ import cn.iocoder.yudao.module.fms.dal.mysql.report.balance.FmsBalanceSheetConfi
21 import cn.iocoder.yudao.module.fms.dal.mysql.report.balance.FmsBalanceSheetReportMapper; 21 import cn.iocoder.yudao.module.fms.dal.mysql.report.balance.FmsBalanceSheetReportMapper;
22 import cn.iocoder.yudao.module.fms.enums.config.FmsSubjectTypeEnum; 22 import cn.iocoder.yudao.module.fms.enums.config.FmsSubjectTypeEnum;
23 import cn.iocoder.yudao.module.fms.enums.report.FmsReportTypeEnum; 23 import cn.iocoder.yudao.module.fms.enums.report.FmsReportTypeEnum;
24 -import cn.iocoder.yudao.module.fms.controller.admin.closing.vo.FmsClosingOverviewRespVO;  
25 import cn.iocoder.yudao.module.fms.service.closing.FmsClosingPeriodService; 24 import cn.iocoder.yudao.module.fms.service.closing.FmsClosingPeriodService;
26 import cn.iocoder.yudao.module.fms.service.closing.FmsClosingSchemeService; 25 import cn.iocoder.yudao.module.fms.service.closing.FmsClosingSchemeService;
27 import cn.iocoder.yudao.module.fms.service.closing.FmsClosingVoucherService; 26 import cn.iocoder.yudao.module.fms.service.closing.FmsClosingVoucherService;
@@ -46,6 +45,7 @@ import java.util.List; @@ -46,6 +45,7 @@ import java.util.List;
46 import static org.junit.jupiter.api.Assertions.assertEquals; 45 import static org.junit.jupiter.api.Assertions.assertEquals;
47 import static org.junit.jupiter.api.Assertions.assertFalse; 46 import static org.junit.jupiter.api.Assertions.assertFalse;
48 import static org.junit.jupiter.api.Assertions.assertNotNull; 47 import static org.junit.jupiter.api.Assertions.assertNotNull;
  48 +import static org.junit.jupiter.api.Assertions.assertTrue;
49 import static org.mockito.ArgumentMatchers.any; 49 import static org.mockito.ArgumentMatchers.any;
50 import static org.mockito.ArgumentMatchers.eq; 50 import static org.mockito.ArgumentMatchers.eq;
51 import static org.mockito.Mockito.when; 51 import static org.mockito.Mockito.when;
@@ -206,8 +206,8 @@ public class FmsBalanceSheetServiceImplTest extends BaseDbUnitTest { @@ -206,8 +206,8 @@ public class FmsBalanceSheetServiceImplTest extends BaseDbUnitTest {
206 FmsTrialBalanceRespVO trialBalance = new FmsTrialBalanceRespVO(); 206 FmsTrialBalanceRespVO trialBalance = new FmsTrialBalanceRespVO();
207 trialBalance.setBalanced(false); 207 trialBalance.setBalanced(false);
208 when(initialBalanceService.getTrialBalance(1L, 10L)).thenReturn(trialBalance); 208 when(initialBalanceService.getTrialBalance(1L, 10L)).thenReturn(trialBalance);
209 - when(closingPeriodService.getClosingOverview(any(), eq(10L)))  
210 - .thenReturn(new FmsClosingOverviewRespVO().setProfitLossBalance(new BigDecimal("20.00"))); 209 + when(closingPeriodService.getProfitLossBalance(1L, "2026-08", 10L))
  210 + .thenReturn(new BigDecimal("20.00"));
211 211
212 // 调用 212 // 调用
213 FmsBalanceSheetCheckRespVO result = balanceSheetService.checkBalanceSheet(buildQueryReqVO(), 10L); 213 FmsBalanceSheetCheckRespVO result = balanceSheetService.checkBalanceSheet(buildQueryReqVO(), 10L);
@@ -241,14 +241,15 @@ public class FmsBalanceSheetServiceImplTest extends BaseDbUnitTest { @@ -241,14 +241,15 @@ public class FmsBalanceSheetServiceImplTest extends BaseDbUnitTest {
241 .setChildren(Collections.emptyList()))); 241 .setChildren(Collections.emptyList())));
242 when(initialBalanceService.getTrialBalance(1L, 10L)) 242 when(initialBalanceService.getTrialBalance(1L, 10L))
243 .thenReturn(new FmsTrialBalanceRespVO().setBalanced(true)); 243 .thenReturn(new FmsTrialBalanceRespVO().setBalanced(true));
244 - when(closingPeriodService.getClosingOverview(any(), eq(10L)))  
245 - .thenReturn(new FmsClosingOverviewRespVO().setProfitLossBalance(BigDecimal.ZERO)); 244 + when(closingPeriodService.getProfitLossBalance(1L, "2026-08", 10L))
  245 + .thenReturn(BigDecimal.ZERO);
246 246
247 // 调用 247 // 调用
248 FmsBalanceSheetCheckRespVO result = balanceSheetService.checkBalanceSheet(buildQueryReqVO(), 10L); 248 FmsBalanceSheetCheckRespVO result = balanceSheetService.checkBalanceSheet(buildQueryReqVO(), 10L);
249 249
250 // 断言 250 // 断言
251 assertEquals(0, result.getUnmappedSubjects().size()); 251 assertEquals(0, result.getUnmappedSubjects().size());
  252 + assertTrue(result.getProfitLossTransferred());
252 } 253 }
253 254
254 // ========== 随机对象 ========== 255 // ========== 随机对象 ==========