本文详细描述了针对单据列表进行过滤控件的自定义需求实现过程,包括动态添加过滤字段、设置默认过滤值等场景。通过重写filterContainerInit等插件事件的方法,实现了如文本字段含“电脑”的快速过滤、常用视图中组织字段的默认展示、创建时间字段默认过滤上月数据、创建人字段默认过滤为当前用户等功能。同时,展示了如何对物料字段和单据状态进行特定条件的过滤,并提供了详细的代码实现和注意事项,以及相关的开发环境和参考资料信息。
关键词:单据列表、过滤控件
一、需求
1. 快速过滤视图动态添加过滤字段——文本(textfield), 并设置默认过滤该字段含有"电脑"的业务单据数据
2. 展示常用过滤视图下的组织字段(org)的默认过滤值
3. 针对常用过滤视图下的创建时间字段(createtime), 设置默认过滤"上月"数据
4. 常用过滤视图动态添加过滤字段——创建人(creator.name), 并设置默认过滤"当前用户"的业务单据数据
5. 常用过滤视图下的物料字段只展示名称包含"可乐"的数据
6. 方案过滤视图动态添加过滤字段——单据状态(billstatus)
7. 方案过滤视图, 在物料为条件配置过滤方案时, 只能选择名称包含"主机"的物料数据
二、思路与方案
单据列表插件中提供 filterContainerInit、filterColumnSetFilter、filterContainerBeforeF7Select事件可进行处理。
三、实现过程
1. 新建单据,其单据设计器界面 & 列表设计器界面分别如下图所示。
单据设计器:
单据列表设计器:
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, "%主机%")); } }
四、效果图
没有注册插件时的运行期界面:
需求场景1的实现效果图:
需求场景3的实现效果图:
需求场景4的实现效果图:
需求场景5的实现效果图:
需求场景6的实现效果图:
需求场景7的实现效果图:
五、开发环境版本
不限
六、注意事项
1. 在 bos-entity-core-1.0.jar/FilterMetadata.xml 中定义了等于类型、包括类型、为空类型、文本比较类型、数值比较类型、日期比较类型、用户类型、组织类型、多类别基础资料、字段等于类型、复选框类型、下拉列表为空类型、多选下拉列表类型。
2. 在实际业务开发中,并不只是处理过滤条件项就行了,往往还要处理在点击查询后列表的过滤条件,例如:在setFilter事件、或filterContainerAfterSearchClick事件中去处理过滤逻辑。关于单据列表动态添加一个过滤条件的案例,视频 复杂列表DEMO 有详细讲解,大家如有需要请自行观看视频或课件(视频下方的课件列表有PPT和源码)。
3. 本文附件中有本文样例的页面元数据和插件源码,大家如有需要可自行下载后导入到自己的开发环境查看。
4. 样例采购申请单列表添加采购组织字段的详细说明可参看java插件开发指南——标准单据列表插件——插件事件——filterContainerInit 事件的样例。该例在java插件开发指南与线上视频中的实现稍有差异,具体表现在:java插件开发指南中是在 filterContainerSearchClick 事件中去处理点击查询后的逻辑,而线上视频是在 filterContainerAfterSearchClick 事件中处理的,这个是因为平台升级添加了新功能所致。大家在做实际业务开发的时候选择合适的事件即可。
七、参考资料
苍穹PC端单据列表的过滤控件开发的样例.zip(20.86KB)