如何使用过滤控件个性化设置单据列表的过滤方案原创
金蝶云社区-聚宝彭
聚宝彭
33人赞赏了该文章 10412次浏览 未经作者许可,禁止转载编辑于2022年04月15日 18:45:33

关键词:单据列表、过滤控件


一、需求

1. 快速过滤视图动态添加过滤字段——文本(textfield), 并设置默认过滤该字段含有"电脑"的业务单据数据

2. 展示常用过滤视图下的组织字段(org)的默认过滤值

3. 针对常用过滤视图下的创建时间字段(createtime), 设置默认过滤"上月"数据

4. 常用过滤视图动态添加过滤字段——创建人(creator.name), 并设置默认过滤"当前用户"的业务单据数据

5. 常用过滤视图下的物料字段只展示名称包含"可乐"的数据

6. 方案过滤视图动态添加过滤字段——单据状态(billstatus)

7. 方案过滤视图, 在物料为条件配置过滤方案时, 只能选择名称包含"主机"的物料数据


二、思路与方案

单据列表插件中提供 filterContainerInit、filterColumnSetFilter、filterContainerBeforeF7Select事件可进行处理。


三、实现过程

1. 新建单据,其单据设计器界面 & 列表设计器界面分别如下图所示。

单据设计器:

image.png


单据列表设计器:

image.png


2. 针对需求1的实现过程。

	@Override
	public void filterContainerInit(FilterContainerInitArgs args) {
		super.filterContainerInit(args);
		
		/****** 快速过滤视图下的筛选条件处理 ******/
		// 快速过滤视图动态添加过滤字段——文本(textfield), 并设置默认过滤该字段含有"电脑"的业务单据数据
		FilterColumn textFilter = new FilterColumn("textfield");
		textFilter.setDefaultValue("电脑");
		args.addFilterColumn(textFilter);
	}


3. 针对需求场景2的实现过程。

	@Override
	public void filterContainerInit(FilterContainerInitArgs args) {
		super.filterContainerInit(args);
		
		/****** 常用过滤视图下的筛选条件处理 ******/
		// 展示常用过滤视图下的组织字段(org)的默认过滤值
		FilterColumn orgFilter = args.getFilterColumn("org.id");
		log.info("默认选中组织: " + orgFilter.getDefaultValues());
	}


4. 针对需求场景3的实现过程。

	@Override
	public void filterContainerInit(FilterContainerInitArgs args) {
		super.filterContainerInit(args);
		
		/****** 常用过滤视图下的筛选条件处理 ******/
		// 针对常用过滤视图下的创建时间字段(createtime), 设置默认过滤"上月"数据
		// 日期比较类型在 bos-entity-core-1.0.jar/FilterMetadata.xml 中定义
		FilterColumn createTimeFilter = args.getFilterColumn("createtime");
		createTimeFilter.setDefaultValue("92");
		
	}


5. 针对需求场景4的实现过程。

	@Override
	public void filterContainerInit(FilterContainerInitArgs args) {
		super.filterContainerInit(args);
		
		/****** 常用过滤视图下的筛选条件处理 ******/
		// 常用过滤视图动态添加过滤字段——创建人(creator.name), 并设置默认过滤"当前用户"的业务单据数据
		// 用户类型在 bos-entity-core-1.0.jar/FilterMetadata.xml 中定义
		CommonFilterColumn creatorFilter = new CommonFilterColumn("creator.name");
		// 设置标题
		creatorFilter.setCaption(new LocaleString("创建人(代码添加)"));
		// 设置默认值
		creatorFilter.setConstantDefaultValue("103");
		args.addFilterColumn(creatorFilter);
	}


6. 针对需求场景5的实现过程。

	@Override
	public void filterColumnSetFilter(SetFilterEvent evt) {
		super.filterColumnSetFilter(evt);
		// 获取所有过滤条件(不包括权限相关的一级插件设置的过滤)
		List<QFilter> filters = evt.getQFilters();
		// 获取过滤字段控件映射的实体字段名
		String fieldName = evt.getFieldName();
		if (StringUtils.equals(fieldName, "materielfield.name")) {
			// 常用过滤视图下的物料字段只展示名称包含"可乐"的数据
			evt.addCustomQFilter(new QFilter("name", QFilter.like, "%可乐%"));
		}
	}


7. 针对需求场景6的实现过程。

	@Override
	public void filterContainerInit(FilterContainerInitArgs args) {
		super.filterContainerInit(args);
		
		/****** 方案过滤视图下的筛选条件处理 ******/
		// 方案过滤视图动态添加过滤字段——单据状态(billstatus)
		SchemeFilterColumn statusFilter = new SchemeFilterColumn("billstatus");
		args.addFilterColumn(statusFilter);
	}


8. 针对需求场景7的实现过程。

	@Override
	public void filterContainerBeforeF7Select(BeforeFilterF7SelectEvent evt) {
		super.filterContainerBeforeF7Select(evt);
		String key = evt.getFieldName();
		if ("materielfield.name".equals(key)) {
			// 方案过滤视图, 在物料为条件配置过滤方案时, 只能选择名称包含"主机"的物料数据
			evt.addCustomQFilter(new QFilter("name", QFilter.like, "%主机%"));
		}
	}


四、效果图

没有注册插件时的运行期界面:

无插件效果图.png


无插件效果图2.png


无插件效果图3.png


需求场景1的实现效果图:

需求1效果图.png


需求场景3的实现效果图:

需求3效果图.png


需求场景4的实现效果图:

需求4效果图.png


需求场景5的实现效果图:

需求5效果图.png


需求场景6的实现效果图:

需求6效果图.png


需求场景7的实现效果图:

需求7效果图.png


五、开发环境版本

不限


六、注意事项

1. 在 bos-entity-core-1.0.jar/FilterMetadata.xml 中定义了等于类型、包括类型、为空类型、文本比较类型、数值比较类型、日期比较类型、用户类型、组织类型、多类别基础资料、字段等于类型、复选框类型、下拉列表为空类型、多选下拉列表类型。

2. 在实际业务开发中,并不只是处理过滤条件项就行了,往往还要处理在点击查询后列表的过滤条件,例如:在setFilter事件、或filterContainerAfterSearchClick事件中去处理过滤逻辑。关于单据列表动态添加一个过滤条件的案例,视频 复杂列表DEMO 有详细讲解,大家如有需要请自行观看视频或课件(视频下方的课件列表有PPT和源码)。

3. 本文附件中有本文样例的页面元数据和插件源码,大家如有需要可自行下载后导入到自己的开发环境查看。

4. 样例采购申请单列表添加采购组织字段的详细说明可参看java插件开发指南——标准单据列表插件——插件事件——filterContainerInit 事件的样例。该例在java插件开发指南与线上视频中的实现稍有差异,具体表现在:java插件开发指南中是在 filterContainerSearchClick 事件中去处理点击查询后的逻辑,而线上视频是在 filterContainerAfterSearchClick 事件中处理的,这个是因为平台升级添加了新功能所致。大家在做实际业务开发的时候选择合适的事件即可。


七、参考资料

开发平台

学习成长中心

插件开发—标准单据列表插件


赞 33