跳转到主要内容

财务-报告

财务报表系统开发文档

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: 报表生成请求DTO
  • ReportGenerateResponse.java: 报表生成响应DTO
  • ReportItemValueDTO.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 报表生成流程

  1. 用户在前端选择报表模板和期间
  2. 前端调用报表生成接口(/api/report/generate
  3. 后端获取报表模板和项目结构
  4. 后端计算当前期间和比较期间的项目金额
  5. 后端生成财务指标和图表数据
  6. 后端将结果返回给前端
  7. 前端展示报表数据和图表

7.2 模板项目配置流程

  1. 用户在模板管理页面选择一个模板
  2. 进入模板项目管理页面
  3. 点击"新增项目"按钮,填写项目信息
  4. 配置项目的计算公式和数据来源
  5. 保存项目配置
  6. 可以对项目进行验证,确保计算公式正确

8. 总结

财务报表系统是一个功能完整、灵活可扩展的财务报表解决方案。该系统通过前端提供友好的用户界面,后端提供强大的计算能力,能够满足企业对财务报表的各种需求。系统支持多种报表类型、灵活的项目配置和复杂的计算公式,是企业财务管理的重要工具。