如何利用通用过滤控件维护过滤条件并实现F7列表数据的自动过滤原创
金蝶云社区-聚宝彭
聚宝彭
8人赞赏了该文章 4988次浏览 未经作者许可,禁止转载编辑于2022年04月15日 18:47:37

关键词:通用过滤


一、需求

用户在某页面上,针对“币别”基础资料上的单据状态字段用 通用过滤控件 配置过滤条件,并可进行保存&修改。然后,在业务单据上的币别字段选择数据时,根据前述配置自动过滤F7列表数据。


二、思路与方案

1. 因需存储用户自行配置的过滤条件,故采用单据模板创建页面,并放置“通用过滤”控件。且考虑到通用过滤控件在数据表并没有字段存储数据。因此,我们在界面上预置一个“文本”字段用于存储用户配置的过滤条件,并将其父容器节点“可见性”属性中的“初始可见”去掉。

2. 在上一步创建的界面中注册插件,绑定事件 beforeBindData,把通用过滤控件与币别元数据进行绑定。

3. 在第 1 步创建的页面上捕获 afterBindData 事件,将已配置好的条件内容,绑定到通用过滤控件。

4. 业务单据的插件中,捕获 beforeF7Select 事件,解析通用过滤控件配置的过滤条件并添加到币别F7列表中。


三、实现过程

1. 新建单据页面(通用过滤样例单据/kdec_filtergrid_bill),基于通用过滤控件维护币别的过滤条件。

通用过滤单据.png


2. 在第 1 步开发的页面上注册插件实现功能:通用过滤控件的条件存储 & 展示。

	@Override
	public void preOpenForm(PreOpenFormEventArgs e) {
		BillShowParameter parameter = (BillShowParameter) e.getFormShowParameter();
		String entityName = parameter.getFormId();
		// 读取之前配置好的过滤条件, 保证数据表中始终只有一条记录配置过滤条件
		String selectProperties = "id, billno, billstatus, kdec_filter, creator, modifier, auditor, createtime, modifytime, auditdate";
		DynamicObject[] filterBills = BusinessDataServiceHelper.load(entityName, selectProperties, null);
		if (filterBills != null && filterBills.length > 0) {
			parameter.setPkId(filterBills[0].getPkValue());
		}
		super.preOpenForm(e);
	}
	
	/**
	 * 开始刷新前端字段、控件的值之前,触发此事件
	 * 在此事件调整后台控件及其属性,间接控制字段、控件的值、状态
	 * @remark
	 * 修改过滤条件表格控件的属性,与币别绑定,以便系统把币别的字段,绑定到过滤表格中
	 */
	@Override
	public void beforeBindData(EventObject e) {
		FilterGrid filterGrid = getView().getControl(KEY_FILTERGRID);
		// 设置通用过滤控件,全部字段信息
		// 绑定业务对象,必须在beforeBindData之前的事件中调用
		filterGrid.setEntityNumber(FORMID_CURRENCY);
		// 动态设置当前可选的字段(例如调整了实体后,需动态筛选实体下的字段)
		List<String> keys = new ArrayList<String>();
		keys.add("number");
		keys.add("status");
		keys.add("enable");
		filterGrid.setFilterFieldKeys(keys);
		super.beforeBindData(e);
	}
	
	/**
	 * 前端字段、控件的值,绑定完毕之后,触发此事件
	 * 在此事件,直接设置字段、控件的值、状态
	 * @remark
	 * 把之前设置的条件内容,绑定到过滤表格,以便用户看到已设置的条件内容
	 */
	@Override
	public void afterBindData(EventObject e) {
		// 读取已配置的条件, 把过滤条件字符串反序列化为FilterCondition对象
		Object filterObj = getModel().getValue(KEY_FILTER);
		FilterCondition filterCondition = null;
		if (!StringUtils.isBlank(filterObj)) {
			filterCondition = SerializationUtils.fromJsonString(filterObj.toString(), FilterCondition.class);
		}
		if (filterCondition != null){
			FilterGrid filterGrid = getView().getControl(KEY_FILTERGRID);
			filterGrid.SetValue(filterCondition);
		}
		super.afterBindData(e);
	}
	
	/**
	 * @remark
	 * 获取用户已经设置好的过滤条件,序列化为字符串并保存
	 */
	@Override
	public void beforeDoOperation(BeforeDoOperationEventArgs evt) {
		FormOperate oprate = (FormOperate) evt.getSource();
		String operationKey = oprate.getOperateKey();
		if (StringUtils.equalsIgnoreCase("save", operationKey)) {
			// 点击了确定按钮,把通用过滤中的内容,序列化为字符串,返回给父界面
			FilterCondition filterCondition = this.getFilter();
			this.saveFilterToText(filterCondition);
		}
		super.beforeDoOperation(evt);
	}
	
	/**
	 * 获取过滤条件表格中配置好的条件
	 * @return
	 */
	private FilterCondition getFilter() {
		FilterGrid filterGrid = getView().getControl(KEY_FILTERGRID);
		FilterGridState filterGridState = filterGrid.getFilterGridState();
		FilterCondition condition = filterGridState.getFilterCondition();
		return condition;
	}
	
	/**
	 * 把条件对象,序列化为字符串,保存下来
	 * @param filterCondition
	 * @return
	 */
	private String saveFilterToText(FilterCondition filterCondition) {
		// 把条件内容序列化为字符串,以便存储
		String filter = null;
		// 序列化
		if (filterCondition != null) {
			filter = SerializationUtils.toJsonString(filterCondition);
		}
		getModel().setValue(KEY_FILTER, filter);
		getModel().setValue("billno", "filtergrid-demo1-001");
		return filter;
	}



3. 新建业务单据界面,为简化需求,其中只放置一个币别字段。在选择币别数据的时候,系统自动加载第 1 步中配置的过滤条件去过滤数据。

业务单据.png


4. 在第 3 步创建的业务单据上注册插件实现功能:币别字段F7选择数据时,以第 1 步页面上配置的过滤条件去过滤数据。

	@Override
	public void registerListener(EventObject e) {
		BasedataEdit basedataEdit = getView().getControl("kdec_currency");
		basedataEdit.addBeforeF7SelectListener(this);
		super.registerListener(e);
	}

	@Override
	public void beforeF7Select(BeforeF7SelectEvent evt) {
		Control control = (Control) evt.getSource();
		if (StringUtils.equalsIgnoreCase("kdec_currency", control.getKey())) {
			// 读取之前配置好的过滤条件
			String selectProperties = "id, kdec_filter";
			DynamicObject[] filterBills = BusinessDataServiceHelper.load("kdec_filtergrid_bill", selectProperties, null);
			String filterStr = null;
			if (filterBills != null && filterBills.length > 0) {
				filterStr = filterBills[0].getString("kdec_filter");
			}
			// 把过滤条件字符串,反序列化为FilterCondition对象
			FilterCondition condition = StringUtils.isEmpty(filterStr) ? null : SerializationUtils.fromJsonString(filterStr, FilterCondition.class);
			if (condition != null) {
				MainEntityType entityType = MetadataServiceHelper.getDataEntityType("bd_currency");
				FilterBuilder filterBuilder = new FilterBuilder(entityType, condition);
				filterBuilder.buildFilter();
				List<QFilter> qFilters = filterBuilder.getQFilters();
				// 设置列表过滤条件
				ListShowParameter showParameter = (ListShowParameter) evt.getFormShowParameter();
				showParameter.getListFilterParameter().setQFilters(qFilters);
				logger.info("币别F7列表过滤条件:" + showParameter.getListFilterParameter().getQFilters());
			}
		}
	}


四、效果图

通过通用过滤条件维护币别过滤条件

通用过滤效果图.png


币别F7列表界面根据通用过滤控件配置的条件过滤数据

F7过滤效果图.png


五、开发环境版本

不限


六、注意事项

1. 如涉及业务数据存储,请使用平台预置的单据模板/基础资料模板设计页面,且尽量不要使用空白模板页面!如模板页面中存在业务中不需要使用的字段,将其“字段名”属性置空,即不会在数据表中创建相应的字段。

2. 如页面上存在不需要展示的字段,将其(或父容器节点)“可见性”中的“初始可见”去掉即可,不建议开启“隐藏元素”属性。


七、参考资料

开发平台

学习成长中心

通用过滤控件插件添加基础资料FilterFieldKeys

通用过滤控件优化——支持宽度自适应



赞 8