# dynamic-report
**Repository Path**: www.QQ2014.com/dynamic-report
## Basic Information
- **Project Name**: dynamic-report
- **Description**: 动态报表,希望能帮助更多的程序员
- **Primary Language**: Java
- **License**: Unlicense
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 4
- **Created**: 2024-01-13
- **Last Updated**: 2024-01-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 动态报表设计
需求:客户每提出报表的修改就需要修改程序,所以需要针对客户的需求进行动态配置展示报表
实现:将sql语句配置到数据库里,动态显示条件,动态显示列,动态显示图形
希望看官们多多提建议和意见,希望能帮助到更多的程序员
# 一、表结构
## 1.0、模块表
表名称:tb_module
表中文名称:模块表
用途:用于增加报表对应的模块菜单
| 字段名称 | 字段说明 | 字段类型 | 允许为空 | 说明 |
| ----------- | ------------ | ------------ | -------- | ---------------------------- |
| module_id | 模块编号 | int | 否 | 主键,不自增
手工自定义 |
| module_code | 模块英文名称 | varchar(100) | 否 | |
| module_name | 模块名称 | varchar(100) | 否 | |
| url | 前端路径 | varchar(200) | 是 | |
| request_url | 后端路径 | varchar(200) | 是 | |
| parent_id | 父模块 | int | 否 | |
| delete_flag | 删除标志 | int | 是 | |
| type | 模块类型 | int | 否 | 1-平台,2-商户 |
| level | 层级 | int | 否 | |
| is_report | 是否是报表 | int | 是 | 默认为0 |
| order_by | 排序 | int | 是 | |
## 1.1、报表设置表
表名称:tb_report_config
表中文名称:报表设置表
用途:保存报表的sql、是否图形展示等信息
| 字段名称 | 字段说明 | 字段类型 | 允许为空 | 说明 |
| ---------------- | ------------- | ------------ | -------- | ------------------------- |
| report_config_id | 报表配置编号 | int | 否 | 主键,自增 |
| report_name | 报表英文名称 | varchar(100) | 否 | |
| module_id | 模块编号 | int | 否 | tb_module.
module_id |
| module_name | 模块名称 | varchar(100) | 是 | |
| select_sql | select语句 | text | 否 | |
| from_sql | from语句 | text | 否 | |
| where_sql | 基础where语句 | text | 是 | |
| group_by_sql | group语句 | text | 是 | |
| order_by_sql | order语句 | text | 是 | |
| need_chart | 是否需要图形 | int | 是 | 默认为0 |
| user_confine | 数据权限 | text | 是 | |
## 1.2、报表字段表
表名称:tb_report_field
表中文名称:报表字段表
用途:保存一张报表对应的字段列
| 字段名称 | 字段说明 | 字段类型 | 允许为空 | 说明 |
| ----------------------- | ---------------- | ------------ | -------- | --------------------------------------- |
| report_field_id | 报表字段编号 | int | 否 | 主键,自增 |
| report_config_id | 报表设置编号 | int | 否 | tb_report_config.
report_config_id |
| field_name | 字段名称 | varchar(100) | 否 | |
| alias_field_name | 字段别名 | varchar(100) | | 主要用于排序,
需要表别名 |
| field_cn_name | 字段中文名称 | varchar(100) | 否 | |
| field_type | 字段类型 | varchar(100) | | |
| field_width | 字段长度 | int | 否 | |
| on_show | 是否显示 | int | 是 | 默认为0 |
| order_by | 排序 | int | 是 | |
| show_detail | 是否显示明细 | int | 是 | 默认为0 |
| detail_report_config_id | 明细报表配置编号 | int | 是 | |
| need_total | 需要合计 | int | 是 | 默认为0 |
| axis | 坐标轴 | varchar(10) | 是 | x 或者 y |
## 1.3、报表条件表
表名称:tb_report_where
表中文名称:报表条件表
用途:保存一张报表对应的条件字段列
| 字段名称 | 字段说明 | 字段类型 | 允许为空 | 说明 |
| ---------------- | ------------ | ------------ | -------- | ------------------------------------------------------ |
| report_where_id | 报表条件编号 | int | 否 | 主键,自增 |
| report_config_id | 报表设置编号 | int | 否 | tb_report_config.
report_config_id |
| param_name | 参数名称 | varchar(100) | 否 | |
| param_type | 参数类型 | varchar(10) | 否 | |
| field_name | 字段名称 | varchar(100) | 否 | |
| field_cn_name | 字段中文名称 | varchar(100) | 否 | |
| compare | 比较值 | int | 是 | 比较(1-等于,2-大于,3-大于等于,
4-小于,5-小于等于) |
| default_value | 默认值 | varchar(100) | 是 | |
| date_type | 日期类型 | int | 是 | 日期类型
(1-开始日期,2-结束日期) |
| table_name | 表名称 | varchar(100) | 是 | 参数类型为select时,
查询表名称 |
| link_json | 关联字段 | varchar(500) | 是 | 参数类型为select时,
关联字段对应json |
| on_show | 是否显示 | int | 是 | 默认为0 |
| order_by | 排序 | int | 是 | |
## 1.4、报表用户配置表
表名称:tb_report_user_field
表中文名称:报表用户配置表
用途:保存每个用户对每一张报表的显示列,列宽
| 字段名称 | 字段说明 | 字段类型 | 允许为空 | 说明 |
| -------------------- | ---------------- | ------------ | -------- | --------------------------------------- |
| report_user_field_id | 报表用户字段编号 | int | 否 | 主键,自增 |
| report_config_id | 报表设置编号 | int | 否 | tb_report_config.
report_config_id |
| user_id | 用户编号 | int | 否 | |
| user_name | 用户名称 | varchar(30) | 是 | |
| field_name | 字段名称 | varchar(100) | 否 | |
| field_width | 字段长度 | int | 否 | |
| order_by | 排序 | int | 是 | |
| delete_flag | 删除标志 | int | 是 | |
## 1.5、报表看板表
表名称:tb_report_chart
表中文名称:报表看板表
用途:用于保存看板中图形需要的数据
| 字段名称 | 字段说明 | 字段类型 | 允许为空 | 说明 |
| ---------------- | ---------------------------- | ------------ | -------- | --------------------------------------------- |
| report_chart_id | 报表图形编号 | int | 否 | 主键,自增 |
| report_config_id | 报表设置编号 | int | 否 | tb_report_config.
report_config_id |
| module_id | 模块编号 | int | 否 | tb_module.
module_id |
| chart_type | 图形类型 | int | 否 | 柱状=1,饼状=2,
折线=3,排行=4 |
| chart_name | 图形名称 | varchar(50) | 是 | |
| x_axis | x轴字段 | varchar(100) | 否 | |
| x_field_type | x轴字段类型 | varchar(100) | 是 | |
| y_axis | y轴字段 | varchar(100) | 否 | |
| y_field_type | y轴字段类型 | varchar(100) | 是 | |
| chart_module_id | 每个图形对应
的模块编号 | int | 否 | |
| need_total | 看板是否带合计 | int | 否 | |
| date_field_name | 图形中的日期字段 | varchar(100) | 否 | 用于处理看板中
近7天,
近30天的条件 |
## 1.5、报表看板条件表
表名称:tb_report_chart_where
表中文名称:报表看板条件表
用途:用于保存看板中图形需要的条件
| 字段名称 | 字段说明 | 字段类型 | 允许为空 | 说明 |
| --------------------- | ---------------- | ------------ | -------- | ------------------------------------------------------ |
| report_chart_where_id | 报表看板条件编号 | int | 否 | 主键,自增 |
| module_id | 模块编号 | int | 否 | |
| param_name | 参数名称 | varchar(100) | 否 | |
| param_type | 参数类型 | varchar(10) | 否 | |
| field_name | 字段名称 | varchar(100) | 否 | |
| field_cn_name | 字段中文名称 | varchar(100) | 否 | |
| compare | 比较值 | int | 是 | 比较(1-等于,2-大于,3-大于等于,
4-小于,5-小于等于) |
| default_value | 默认值 | varchar(100) | 是 | |
| table_name | 表名称 | varchar(100) | 是 | 参数类型为select时,
查询表名称 |
| link_json | 关联字段 | varchar(500) | 是 | 参数类型为select时,
关联字段对应json |
| on_show | 是否显示 | int | 是 | 默认为0 |
| order_by | 排序 | int | 是 | |
| | | | | |
| | | | | |
# 二、功能说明
## 2.0、模块配置
配置对应的报表菜单到 tb_module 中

## 2.1、报表配置
将 SQL 配置到 报表配置表 tb_report_config 中

## 2.2、配置显示列
将显示列配置到 报表字段表中 tb_report_field 中

## 2.3、配置条件
将显示条件配置到 报表条件中 tb_report_where 中

## 2.4、配置看板
将看板需要显示的图形配置到 tb_report_chart 中

## 2.5、配置看板条件
将看板需要的条件配置到 tb_report_chart_where 中

## 2.6、前端协助
启动程序:swagger地址:
http://localhost:8000/doc.html

# 三、接口说明
* 前端在打开页面时,调用 /report/getBusinessType 方法 获取有多少动态报表
* 并调用 /report/getModuleReport 传入模块ID查找有多少报表条件,需要循环动态将控件显示到页面中
* 操作用户,输入条件点击查询调用 /report/getReportList 方法查询,该查询中返回包含当前页合计行
* 需要总合计行的话,需要调用 /report/getReportSum 方法
* 操作用户,点击导出EXCEL,调用/report/reportToExcel 方法导出
* 图形显示时,先调用 /report/getReportAxis 获取坐标,可以支持柱状图、饼状图、折线图、排行榜
* 获取图形报表,调用 /report/getReportAxisList 方法获取图形报表数据
* 获取看板,在调用模块接口 /report/getBusinessType 返回的数据中,isReport = 1为报表,isReport = 2 为看板
* 获取看板配置,调用 /report/getReportChart 方法,传入 moduleId 获取
* 根据看板配置的每个图形的 x 轴,y 轴,调用 /report/getReportAxisList 方法,获取每个图形的数据
## 3.1、查询报表菜单接口

## 3.2、获取报表配置

## 3.3、获取报表数据(同时调用两个接口)
### 1、获取数据,以及分页时当前页合计

### 2、获取总合计

## 3.4、数据导出EXCEL

## 3.5、获取图形显示配置(先获取坐标轴)

## 3.6、获取图形数据

## 3.7、获取看板配置

## 3.8、获取看板中图形的数据

# 四、网格数据显示明细说明
## 4.1、配置明细sql
在 tb_report_config 中配置明细查询需要的sql

* module_id 为 0
* 其他和配置报表内容一致
## 4.2、配置明细按钮
report_config_id 为**动态**报表的编号
在 tb_report_field 字段表中配置当前报表需要【查看明细】的按钮

* 配置按钮
* field_name: handle
* alias_field_name: handle
* 这两个字段必须是 handle,前端用这个字段进行判断是否显示按钮
* 配置显示明细
* show_detail: 值为1,意思为显示明细
* 配置明细对应sql
* detail_report_config_id:对应 tb_report_config 配置表的编号
## 4.3、配置明细对应的条件
report_config_id 为**明细**报表的编号
在 tb_report_where 条件表中配置明细对应的条件,由于是网格中点击某一行数据进行跳转明细,则需要知道根据这一行数据的哪一个字段组成条件

## 4.4、配置明细表格对应的字段列
report_config_id 为**明细**报表的编号
在 tb_report_field 字段表中配置明细对应的字段

## 4.5、显示效果


# 五、效率优化
* 报表的效率来源于数据量多少,还有SQL的执行效率;如果数据量大可以先把数据存下来,再用SQL展示
* 针对于配置的SQL效率进行创建索引,只能具体情况具体对待了
* 可以通过 druid 进行查看SQL执行效率,地址:http://localhost:8000/druid/login.html 用户名:admin,密码:admin

# 六、效果展示
## 6.1、表格数据
动态条件、动态列、动态按钮

可根据汇总对象进行汇总

## 6.2、图形数据
右上角为 x轴,y轴,可手动选择之后查询

## 6.3、看板
根据配置展示不同的图形

## 6.4、导出excel

## 6.5、动态生成查询条件
支持下拉多选(数据源取自表 或者 自定义)、输入、日期、时间


# 七、看板图形中的日期处理



# 八、看板图形中点击跳转的处理

**配置 tb_report_chart 时,一定注意,x轴的 xAxis 的值需要在 tb_report_where 中存在,否则条件不起作用。**
tb_report_chart

tb_report_where
