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

- 新增、修改和导入科目时校验财务参数
- 补全报表模板,修正备抵科目、投资收益和还本公式
- 增加模板升级及报表金额回归测试
This commit is contained in:
YunaiV
2026-09-26 12:12:34 +08:00
parent 66780d9b1a
commit b0397843a8
2 changed files with 45 additions and 0 deletions
@@ -53,6 +53,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
import static cn.iocoder.yudao.module.fms.enums.ErrorCodeConstants.ACCOUNT_SET_NOT_INITIALIZED;
import static cn.iocoder.yudao.module.fms.enums.ErrorCodeConstants.SUBJECT_CODE_DUPLICATE;
import static cn.iocoder.yudao.module.fms.enums.ErrorCodeConstants.SUBJECT_CODE_RULE_INVALID;
import static cn.iocoder.yudao.module.fms.enums.ErrorCodeConstants.SUBJECT_CURRENCY_INVALID;
@@ -161,6 +162,9 @@ public class FmsSubjectServiceImpl implements FmsSubjectService {
accountSetService.validateAccountSetWritePermission(createReqVO.getAccountSetId(), userId);
// 1.2 查询财务参数
FmsFinanceParameterDO financeParameter = financeParameterService.getFinanceParameter(createReqVO.getAccountSetId());
if (financeParameter == null) {
throw exception(ACCOUNT_SET_NOT_INITIALIZED);
}
// 1.3 校验科目编码唯一
validateSubjectCodeUnique(null, createReqVO.getAccountSetId(), createReqVO.getCode());
// 1.4 校验上级科目和科目编码规则
@@ -209,6 +213,9 @@ public class FmsSubjectServiceImpl implements FmsSubjectService {
// 1.2 查询财务参数
FmsFinanceParameterDO financeParameter = financeParameterService.getFinanceParameter(
updateReqVO.getAccountSetId());
if (financeParameter == null) {
throw exception(ACCOUNT_SET_NOT_INITIALIZED);
}
// 1.3 校验科目存在
FmsSubjectDO subject = validateSubjectExists(updateReqVO.getAccountSetId(), updateReqVO.getId());
if (ObjUtil.notEqual(subject.getParentId(), updateReqVO.getParentId())) {
@@ -416,6 +423,9 @@ public class FmsSubjectServiceImpl implements FmsSubjectService {
accountSetService.validateAccountSetWritePermission(accountSetId, userId);
// 1.3 加载导入依赖
FmsFinanceParameterDO financeParameter = financeParameterService.getFinanceParameter(accountSetId);
if (financeParameter == null) {
throw exception(ACCOUNT_SET_NOT_INITIALIZED);
}
Map<String, FmsSubjectDO> subjectMap = convertMap(
subjectMapper.selectListByAccountSetIdAndType(accountSetId, null), FmsSubjectDO::getCode);
Map<String, Long> auxiliaryTypeIdMap = auxiliaryTypeService.getAuxiliaryTypeIdMap(accountSetId);
@@ -116,6 +116,41 @@ public class FmsSubjectServiceImplTest extends BaseDbUnitTest {
assertTrue(subjects.get(1).getAuxiliaryTypeIds().isEmpty());
}
@Test
public void testCreateSubject_accountSetNotInitialized() {
// 准备参数
FmsSubjectSaveReqVO reqVO = buildSubjectSaveReqVO(1L, "1001", "库存现金");
// 调用,并断言异常
assertServiceException(() -> subjectService.createSubject(reqVO, 10L), ACCOUNT_SET_NOT_INITIALIZED);
// 断言未写入科目
assertEquals(0, subjectMapper.selectCount());
}
@Test
public void testUpdateSubject_accountSetNotInitialized() {
// 准备参数
FmsSubjectSaveReqVO reqVO = buildSubjectSaveReqVO(1L, "1001", "库存现金");
reqVO.setId(1L);
// 调用,并断言异常
assertServiceException(() -> subjectService.updateSubject(reqVO, 10L), ACCOUNT_SET_NOT_INITIALIZED);
}
@Test
public void testImportSubjectList_accountSetNotInitialized() {
// 准备参数
FmsSubjectImportExcelVO importVO = new FmsSubjectImportExcelVO();
importVO.setCode("1001");
importVO.setName("库存现金");
// 调用,并断言异常
assertServiceException(() -> subjectService.importSubjectList(1L, Collections.singletonList(importVO), 10L),
ACCOUNT_SET_NOT_INITIALIZED);
// 断言未写入科目
assertEquals(0, subjectMapper.selectCount());
}
@Test
public void testCreateSubject_success() {
// 准备参数