Commit b0397843a801e61693139bcba48fcec0910e4e99

Authored by YunaiV
1 parent 66780d9b

fix(fms): 修复账套未初始化时科目操作异常,补全报表模板

- 新增、修改和导入科目时校验财务参数
- 补全报表模板,修正备抵科目、投资收益和还本公式
- 增加模板升级及报表金额回归测试
yudao-module-fms/src/main/java/cn/iocoder/yudao/module/fms/service/config/FmsSubjectServiceImpl.java
@@ -53,6 +53,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU @@ -53,6 +53,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
53 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; 53 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
54 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap; 54 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
55 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList; 55 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
  56 +import static cn.iocoder.yudao.module.fms.enums.ErrorCodeConstants.ACCOUNT_SET_NOT_INITIALIZED;
56 import static cn.iocoder.yudao.module.fms.enums.ErrorCodeConstants.SUBJECT_CODE_DUPLICATE; 57 import static cn.iocoder.yudao.module.fms.enums.ErrorCodeConstants.SUBJECT_CODE_DUPLICATE;
57 import static cn.iocoder.yudao.module.fms.enums.ErrorCodeConstants.SUBJECT_CODE_RULE_INVALID; 58 import static cn.iocoder.yudao.module.fms.enums.ErrorCodeConstants.SUBJECT_CODE_RULE_INVALID;
58 import static cn.iocoder.yudao.module.fms.enums.ErrorCodeConstants.SUBJECT_CURRENCY_INVALID; 59 import static cn.iocoder.yudao.module.fms.enums.ErrorCodeConstants.SUBJECT_CURRENCY_INVALID;
@@ -161,6 +162,9 @@ public class FmsSubjectServiceImpl implements FmsSubjectService { @@ -161,6 +162,9 @@ public class FmsSubjectServiceImpl implements FmsSubjectService {
161 accountSetService.validateAccountSetWritePermission(createReqVO.getAccountSetId(), userId); 162 accountSetService.validateAccountSetWritePermission(createReqVO.getAccountSetId(), userId);
162 // 1.2 查询财务参数 163 // 1.2 查询财务参数
163 FmsFinanceParameterDO financeParameter = financeParameterService.getFinanceParameter(createReqVO.getAccountSetId()); 164 FmsFinanceParameterDO financeParameter = financeParameterService.getFinanceParameter(createReqVO.getAccountSetId());
  165 + if (financeParameter == null) {
  166 + throw exception(ACCOUNT_SET_NOT_INITIALIZED);
  167 + }
164 // 1.3 校验科目编码唯一 168 // 1.3 校验科目编码唯一
165 validateSubjectCodeUnique(null, createReqVO.getAccountSetId(), createReqVO.getCode()); 169 validateSubjectCodeUnique(null, createReqVO.getAccountSetId(), createReqVO.getCode());
166 // 1.4 校验上级科目和科目编码规则 170 // 1.4 校验上级科目和科目编码规则
@@ -209,6 +213,9 @@ public class FmsSubjectServiceImpl implements FmsSubjectService { @@ -209,6 +213,9 @@ public class FmsSubjectServiceImpl implements FmsSubjectService {
209 // 1.2 查询财务参数 213 // 1.2 查询财务参数
210 FmsFinanceParameterDO financeParameter = financeParameterService.getFinanceParameter( 214 FmsFinanceParameterDO financeParameter = financeParameterService.getFinanceParameter(
211 updateReqVO.getAccountSetId()); 215 updateReqVO.getAccountSetId());
  216 + if (financeParameter == null) {
  217 + throw exception(ACCOUNT_SET_NOT_INITIALIZED);
  218 + }
212 // 1.3 校验科目存在 219 // 1.3 校验科目存在
213 FmsSubjectDO subject = validateSubjectExists(updateReqVO.getAccountSetId(), updateReqVO.getId()); 220 FmsSubjectDO subject = validateSubjectExists(updateReqVO.getAccountSetId(), updateReqVO.getId());
214 if (ObjUtil.notEqual(subject.getParentId(), updateReqVO.getParentId())) { 221 if (ObjUtil.notEqual(subject.getParentId(), updateReqVO.getParentId())) {
@@ -416,6 +423,9 @@ public class FmsSubjectServiceImpl implements FmsSubjectService { @@ -416,6 +423,9 @@ public class FmsSubjectServiceImpl implements FmsSubjectService {
416 accountSetService.validateAccountSetWritePermission(accountSetId, userId); 423 accountSetService.validateAccountSetWritePermission(accountSetId, userId);
417 // 1.3 加载导入依赖 424 // 1.3 加载导入依赖
418 FmsFinanceParameterDO financeParameter = financeParameterService.getFinanceParameter(accountSetId); 425 FmsFinanceParameterDO financeParameter = financeParameterService.getFinanceParameter(accountSetId);
  426 + if (financeParameter == null) {
  427 + throw exception(ACCOUNT_SET_NOT_INITIALIZED);
  428 + }
419 Map<String, FmsSubjectDO> subjectMap = convertMap( 429 Map<String, FmsSubjectDO> subjectMap = convertMap(
420 subjectMapper.selectListByAccountSetIdAndType(accountSetId, null), FmsSubjectDO::getCode); 430 subjectMapper.selectListByAccountSetIdAndType(accountSetId, null), FmsSubjectDO::getCode);
421 Map<String, Long> auxiliaryTypeIdMap = auxiliaryTypeService.getAuxiliaryTypeIdMap(accountSetId); 431 Map<String, Long> auxiliaryTypeIdMap = auxiliaryTypeService.getAuxiliaryTypeIdMap(accountSetId);
yudao-module-fms/src/test/java/cn/iocoder/yudao/module/fms/service/config/FmsSubjectServiceImplTest.java
@@ -117,6 +117,41 @@ public class FmsSubjectServiceImplTest extends BaseDbUnitTest { @@ -117,6 +117,41 @@ public class FmsSubjectServiceImplTest extends BaseDbUnitTest {
117 } 117 }
118 118
119 @Test 119 @Test
  120 + public void testCreateSubject_accountSetNotInitialized() {
  121 + // 准备参数
  122 + FmsSubjectSaveReqVO reqVO = buildSubjectSaveReqVO(1L, "1001", "库存现金");
  123 +
  124 + // 调用,并断言异常
  125 + assertServiceException(() -> subjectService.createSubject(reqVO, 10L), ACCOUNT_SET_NOT_INITIALIZED);
  126 + // 断言未写入科目
  127 + assertEquals(0, subjectMapper.selectCount());
  128 + }
  129 +
  130 + @Test
  131 + public void testUpdateSubject_accountSetNotInitialized() {
  132 + // 准备参数
  133 + FmsSubjectSaveReqVO reqVO = buildSubjectSaveReqVO(1L, "1001", "库存现金");
  134 + reqVO.setId(1L);
  135 +
  136 + // 调用,并断言异常
  137 + assertServiceException(() -> subjectService.updateSubject(reqVO, 10L), ACCOUNT_SET_NOT_INITIALIZED);
  138 + }
  139 +
  140 + @Test
  141 + public void testImportSubjectList_accountSetNotInitialized() {
  142 + // 准备参数
  143 + FmsSubjectImportExcelVO importVO = new FmsSubjectImportExcelVO();
  144 + importVO.setCode("1001");
  145 + importVO.setName("库存现金");
  146 +
  147 + // 调用,并断言异常
  148 + assertServiceException(() -> subjectService.importSubjectList(1L, Collections.singletonList(importVO), 10L),
  149 + ACCOUNT_SET_NOT_INITIALIZED);
  150 + // 断言未写入科目
  151 + assertEquals(0, subjectMapper.selectCount());
  152 + }
  153 +
  154 + @Test
120 public void testCreateSubject_success() { 155 public void testCreateSubject_success() {
121 // 准备参数 156 // 准备参数
122 Long accountSetId = 1L; 157 Long accountSetId = 1L;