财务-报告
财务报表系统开发文档
1. 系统概述
财务报表系统是一个用于管理财务报表模板、配置报表项目、生成财务报表的完整解决方案。该系统支持多种报表类型(如资产负债表、利润表等),提供灵活的项目配置和计算公式功能,能够自动生成准确的财务报表数据。
2. 系统架构
2.1 前端架构
目录结构:
wimoor-ui/src/views/finance/report/
├── items/ # 报表项目展示模块
│ ├── components/
│ │ └── report_sheet.vue # 报表展示组件
│ └── index.vue # 报表项目主页面
└── templates/ # 报表模板管理模块
├── components/
│ ├── template_item_edit.vue # 模板项目编辑组件
│ └── template_items.vue # 模板项目管理组件
└── index.vue # 模板管理主页面
核心组件:
items/index.vue: 报表项目展示页面,通过标签页切换不同报表模板report_sheet.vue: 报表展示组件,负责展示生成的报表数据和图表templates/index.vue: 报表模板管理页面,提供模板的增删改查功能template_items.vue: 模板项目管理组件,负责管理模板下的项目template_item_edit.vue: 模板项目编辑组件,用于配置项目的属性和计算公式
2.2 后端架构
核心控制器:
ReportController.java: 报表生成控制器,处理报表生成请求FinReportItemsController.java: 报表项目控制器,处理报表项目的CRUD操作
核心服务:
IFinReportTemplatesService.java: 报表模板服务接口FinReportTemplatesServiceImpl.java: 报表模板服务实现,包含报表生成核心逻辑
数据传输对象:
ReportGenerateRequest.java: 报表生成请求DTOReportGenerateResponse.java: 报表生成响应DTOReportItemValueDTO.java: 报表项目值DTO
3. 功能模块
3.1 报表模板管理
功能说明:
- 创建、编辑、删除报表模板
- 配置模板的基本信息(名称、编码、类型、描述等)
- 管理模板的状态
核心代码:
<!-- 模板树结构 -->
<el-tree
class="template-tree"
:data="templateTree"
:highlight-current="true"
:props="treeProps"
node-key="templateId"
@node-click="handleTemplateSelect"
>
<!-- 自定义节点内容 -->
</el-tree>
<!-- 模板新增/修改对话框 -->
<el-dialog :title="formTitle" v-model="openForm" width="600px" append-to-body>
<el-form ref="templateFormRef" :model="form" :rules="rules" label-width="120px">
<el-form-item label="模板名称" prop="templateName">
<el-input v-model="form.templateName" placeholder="请输入模板名称"></el-input>
</el-form-item>
<!-- 其他表单字段 -->
</el-form>
</el-dialog>
3.2 报表项目管理
功能说明:
- 为报表模板配置项目
- 设置项目的层级关系(父级项目)
- 配置项目的计算公式和数据来源
- 管理项目的显示属性(是否显示、是否显示零值等)
核心代码:
<!-- 项目列表 -->
<el-table
v-loading="loading"
:data="itemsList"
border
size="small"
:row-style="setRowStyle"
>
<el-table-column prop="lineNumber" label="行次" width="60" align="center"></el-table-column>
<el-table-column prop="itemCode" label="项目编码" width="300"></el-table-column>
<el-table-column label="项目名称">
<template #default="{ row }">
<span :style="{ 'padding-left': (row.itemLevel - 1) * 20 + 'px' }">{{ row.itemName }}</span>
</template>
</el-table-column>
<!-- 其他列 -->
</el-table>
3.3 报表生成
功能说明:
- 根据选择的模板和期间生成报表数据
- 支持多期间比较(当前期间与对比期间)
- 自动计算项目金额和财务指标
- 生成图表数据用于可视化展示
核心代码:
public ReportGenerateResponse generateReport(ReportGenerateRequest request) {
ReportGenerateResponse response = new ReportGenerateResponse();
try {
String groupid = request.getGroupid();
String templateCode = request.getTemplateCode();
String period = request.getPeriod();
// 1. 获取报表模板
List<FinReportTemplates> templates = this.finReportTemplatesMapper.selectFinReportTemplatesList(finReportTemplates);
// 2. 获取报表项目结构
List<FinReportItems> reportItems = finReportItemsService.selectFinReportItemsList(itemsquery);
// 3. 计算当前期间数据
Map<String, BigDecimal> currentAmounts = calculateReportAmounts(groupid, period, reportItems, template);
// 4. 计算比较期间数据(如果需要)
Map<String, BigDecimal> compareAmounts = new HashMap<>();
if (request.getIncludeComparison() && comparePeriod != null && !comparePeriod.isEmpty()) {
compareAmounts = calculateReportAmounts(groupid, comparePeriod, reportItems, template);
}
// 5. 构建响应数据
List<ReportItemValueDTO> itemDTOs = buildReportItems(reportItems, currentAmounts, compareAmounts, amountUnit);
// 6. 计算财务指标、图表数据等
// 7. 组装响应
response.setItems(itemDTOs);
response.setFinancialRatios(financialRatios);
response.setChartData(chartData);
response.setSummary(summary);
} catch (Exception e) {
response.setSuccess(false);
response.setMessage("报表生成失败: " + e.getMessage());
}
return response;
}
4. 核心技术实现
4.1 报表项目金额计算
功能说明:
- 支持多种公式类型:DIRECT(直接科目)、FORMULA(自定义公式)、CUSTOM(自定义规则)、CALCULATED(自动计算)
- 按层级从高到低排序计算,确保父级项目在子级之后计算
核心代码:
private Map<String, BigDecimal> calculateReportAmounts(String groupid, String period,
List<FinReportItems> reportItems,
FinReportTemplates template) {
// 获取科目余额数据
Map<String, BigDecimal> amounts = subjectBalanceService.getAllSubjectBalance(groupid, period);
// 按层级从高到低排序计算,确保父级项目在子级之后计算
List<FinReportItems> sortedItems = reportItems.stream()
.sorted(Comparator.comparing(FinReportItems::getItemLevel).reversed())
.collect(Collectors.toList());
for (FinReportItems item : sortedItems) {
if (!item.getIsShow()) {
continue; // 跳过不显示的项目
}
BigDecimal amount = calculateItemAmount(groupid, period, item, amounts, reportItems);
amounts.put(item.getItemCode(), amount);
}
return amounts;
}
private BigDecimal calculateItemAmount(String groupid, String period, FinReportItems item,
Map<String, BigDecimal> amounts, List<FinReportItems> allItems) {
String formulaType = item.getFormulaType();
String calculationRule = item.getCalculationRule();
String dataSource = item.getDataSource();
try {
switch (formulaType) {
case "DIRECT":
return calculateDirectAmount(groupid, period, item, dataSource);
case "FORMULA":
return calculateFormulaAmount(calculationRule, amounts, item.getFormulaContent());
case "CUSTOM":
return calculateCustomAmount(groupid, period, calculationRule, amounts, allItems);
case "CALCULATED":
return calculateAutoAmount(item, amounts, allItems);
default:
return BigDecimal.ZERO;
}
} catch (Exception e) {
System.err.println("计算项目失败: " + item.getItemCode() + " - " + e.getMessage());
return BigDecimal.ZERO;
}
}
4.2 公式解析与计算
功能说明:
- 使用AviatorEvaluator解析和执行复杂公式
- 支持科目代码引用、数学运算、函数调用等
- 自动处理科目代码到变量名的转换
核心代码:
private BigDecimal evaluateFormula(String formula, Map<String, BigDecimal> amounts) {
try {
// 预处理公式
String processedFormula = processAccountFormula(formula);
// 准备环境变量
Map<String, Object> env = prepareEnvironment(amounts);
// 执行计算
AviatorEvaluator.setOption(Options.ALWAYS_USE_DOUBLE_AS_DECIMAL, false);
Object result = AviatorEvaluator.execute(processedFormula, env);
return convertToBigDecimal(result);
} catch (Exception e) {
throw new RuntimeException("公式计算错误: " + formula, e);
}
}
private String processAccountFormula(String formula) {
// 清理空格
String cleaned = formula.replaceAll("\\s+", "");
// 使用正则匹配科目代码(4位数字),并添加前缀
Pattern pattern = Pattern.compile("\\d{4,}"); // 匹配4位及以上数字
Matcher matcher = pattern.matcher(cleaned);
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
String accountCode = matcher.group();
matcher.appendReplacement(sb, "ACC_" + accountCode);
}
matcher.appendTail(sb);
return sb.toString();
}
5. 接口说明
5.1 报表生成接口
接口地址:/api/report/generate
请求方法:POST
请求参数:
{
"templateCode": "BALANCE_SHEET_STANDARD",
"period": "202312",
"comparePeriod": "202311",
"groupid": "123456",
"amountUnit": 1,
"includeComparison": true,
"includeChartData": true
}
响应参数:
{
"success": true,
"message": "报表生成成功",
"templateCode": "BALANCE_SHEET_STANDARD",
"templateName": "标准资产负债表",
"period": "202312",
"reportDate": "2023-12-31",
"items": [
{
"itemCode": "ASSET_TOTAL",
"itemName": "资产总计",
"itemLevel": 1,
"lineNumber": 1,
"amount": 1000000.00,
"comparisonAmount": 950000.00,
"changeAmount": 50000.00,
"changeRate": 5.26,
"isLeaf": false
}
],
"financialRatios": {},
"chartData": {},
"summary": {}
}
5.2 报表项目列表接口
接口地址:/report/items/list
请求方法:GET
请求参数:
templateId: 模板ID
响应参数:
{
"data": [
{
"itemId": 1,
"templateId": 1,
"itemCode": "ASSET_TOTAL",
"itemName": "资产总计",
"parentCode": "",
"itemLevel": 1,
"lineNumber": 1,
"formulaType": "CALCULATED",
"calculationRule": "SUM(CHILDREN)",
"isShow": true,
"isLeaf": false
}
]
}
6. 技术栈
6.1 前端技术
- Vue 3
- Element Plus
- ECharts(图表展示)
- Axios(HTTP请求)
6.2 后端技术
- Spring Boot
- MyBatis-Plus
- AviatorEvaluator(公式计算)
- Redis(可选,用于缓存)
7. 系统流程
7.1 报表生成流程
- 用户在前端选择报表模板和期间
- 前端调用报表生成接口(
/api/report/generate) - 后端获取报表模板和项目结构
- 后端计算当前期间和比较期间的项目金额
- 后端生成财务指标和图表数据
- 后端将结果返回给前端
- 前端展示报表数据和图表
7.2 模板项目配置流程
- 用户在模板管理页面选择一个模板
- 进入模板项目管理页面
- 点击"新增项目"按钮,填写项目信息
- 配置项目的计算公式和数据来源
- 保存项目配置
- 可以对项目进行验证,确保计算公式正确
8. 总结
财务报表系统是一个功能完整、灵活可扩展的财务报表解决方案。该系统通过前端提供友好的用户界面,后端提供强大的计算能力,能够满足企业对财务报表的各种需求。系统支持多种报表类型、灵活的项目配置和复杂的计算公式,是企业财务管理的重要工具。