# 树形报表列表


## 场景

场景：报表在展示时，有些数据之间存在上下级关系，可以通过树形折叠展示的功能体现出来，方便用户清晰直观的查看，导出时需要按照层级结构导出到excel。

## 使用步骤

- 在报表的表单插件，重写方法，设置该报表为树形报表
```java
public class RptTreeFormPlugin extends AbstractReportFormPlugin {
	
	@Override
	public void setTreeReportList(TreeReportListEvent event) {
		super.setTreeReportList(event);
		event.setTreeReportList(true);
	}
	
	
}
```
- 调整数据结构，在原本的数据里面加入 pid（当前行的父行id） 、 rowid（当前数据行id）、 isgroupnode（当前行是否有下级）

```java
@Override
public DataSet query(ReportQueryParam queryParam, Object selectedObj) throws Throwable {
    ORM orm = ORM.create();
    String selectedField = "number,name,parent as pid,isleaf as isgroupnode,id as rowid";
    DataSet ds = orm.queryDataSet(getClass().getName(), 
            "kdtest_basedata_tree", 
            selectedField, 
            null,  
            null);
    return ds;
}
```

- 效果展示
    ![package](image\kz_treereportlist_01.png)

## 实现细节

- 1、报表表单插件增加事件方法，设置是否树形报表
- 2、插件取数时，额外增加三个属性pid（父节点id）、rowid（当前节点id）、isgroupnode（是否有子节点）
- 3、后端动态增加上述三列（不可见）
- 4、对查询结果进行排序（导出时需要按照层级数据展示）
- 5、对查询结果设置seq
- 6、发送前端动态元数据时，把步骤1属性开关传递给前端
- 7、前端虚模式请求数据时，带上当前父节点id
- 8、后端取数据时，根据父节点id取对应的记录
- 9、发送数据给前端时，在数据包平级回传当前父节点id

> 特别注意：
1、对查询结果进行排序和设置seq是一个复杂并且耗性能的操作，所以树形报表数据量不宜过大。
2、只支持通过查询插件自己取数的报表，不支持通过数据源配置的报表；
3、树形报表列表，不支持过滤和排序。