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

文本概述: 用户在页面通过通用过滤控件配置币别基础资料的单据状态字段过滤条件并保存修改,业务单据选择币别时自动根据配置过滤F7列表数据。实现步骤包括创建单据页面存储过滤条件、注册插件绑定事件实现功能、新建业务单据注册插件根据配置过滤币别数据。提供实现代码、效果图、开发环境及注意事项。

关键词:通用过滤


一、需求

用户在某页面上,针对“币别”基础资料上的单据状态字段用 通用过滤控件 配置过滤条件,并可进行保存&修改。然后,在业务单据上的币别字段选择数据时,根据前述配置自动过滤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
8人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!