# 报表表头排序过滤


## 场景

场景：报表在展示时，希望按照某个字段进行排序，或者希望快捷的根据表头字段进行筛选过滤。

## 使用步骤

- 在报表的表单插件，重写方法，设置该报表哪些字段支持排序，哪些字段支持过滤
```java
public class RptTreeFormPlugin extends AbstractReportFormPlugin {
	
	@Override
	public void setSortAndFilter(List<SortAndFilterEvent> list) {
		super.setSortAndFilter(list);
		for(SortAndFilterEvent event : list){
			if("name".equals(event.getColumnName()) 
					|| "number".equals(event.getColumnName())){
				event.setSort(true);
				event.setFilter(true);
			}
		}
	}
}
```
- 构造字段比较符时，可以进行插件干预，设置比较符替换系统默认的比较符（比较符的信息必须来自系统本身）

```java
@Override
public Map<String, Object> createFilterInfo() {
    //优先取插件设置的过滤信息
    FormViewPluginProxy pluginProxy = getView().getService(FormViewPluginProxy.class);
    if(pluginProxy instanceof ReportViewPluginProxy) {
        ReportViewPluginProxy proxy = (ReportViewPluginProxy)pluginProxy;
        CreateFilterInfoEvent event = new CreateFilterInfoEvent(this, view, fieldKey);
        proxy.fireBeforeCreateFilterInfo(event);
        if(event.isCancel() && !event.getFilterInfo().isEmpty()){
            return event.getFilterInfo();
        }
    }
    //取默认的过滤信息
    return createDefaultFilterInfo();
}
```
- 界面点击排序或者过滤时，平台将排序或者过滤信息传递到ReportQueryParam中，报表的取数插件可进行使用
```java
@Override
public DataSet query(ReportQueryParam queryParam, Object selectedObj) throws Throwable {
    List<QFilter> filters = queryParam.getFilter().getHeadFilters();
    /*FilterItemInfo item = queryParam.getFilter().getFilterItem("textfield2");
    if(item != null && !StringUtils.isBlank(item.getValue())){
        QFilter q = new QFilter("name", QCP.equals, item.getValue());
        filters.add(q);
    }*/
    List<FilterItemInfo> items = queryParam.getFilter().getTableHeadFilterItems(); //表头过滤的原始信息，可以根据过滤信息自己生成过滤条件
    for(FilterItemInfo item : items){
        if(item != null && !StringUtils.isBlank(item.getValue()) && "textfield2".equals(item.getPropName())){
            QFilter q = new QFilter("name", QCP.equals, item.getValue());
            filters.add(q);
        }
    }
    ORM orm = ORM.create();
    String selectedField = "number,name,parent as pid,isleaf,id as rowid";
    return orm.queryDataSet(getClass().getName(), 
            "knight_tree123", 
            selectedField, 
            filters.toArray(new QFilter[filters.size()]),  
            queryParam.getSortInfo());
}
```
- 效果展示
    ![package](image\kz_sortAndFilter_01.png)
