本文概述了在苍穹平台上搭建渠道协同系统时,遇到的数据隔离问题。系统通过插件实现数据过滤,但发现引出功能会绕过过滤条件引出所有数据。经分析,发现引出操作是按面板条件重新查询数据,而非列表勾选数据。通过将过滤条件追加到列表取数条件中解决了问题,并指出在数据获取前设置过滤条件的重要性。感谢了两位老师的支持。
背景
现在正在交付的项目是在苍穹平台上搭建渠道协同系统,其中涉及到大量的协同单据即厂家、经销商共同使用同一个单据,需要实现不同经销商之间、厂家负责不用经销商的人员之间数据需要隔离。
实现方式比较简单,创建一个模板单据,在列表上增加插件实现数据过滤,其他协同单据均从这个模板继承出来。
public void beforeBindData(EventObject e) {
super.beforeBindData(e);
//获取当前登陆用户信息
String userId = RequestContext.get().getUserId();
DynamicObject user = BusinessDataServiceHelper.loadSingle(userId, "bos_user");
//用户类型
String usertype = user.getString("usertype");
switch (usertype){
//根据用户类型、业务逻辑拼接过滤条件qFilter
default:
break;
}
BillList billList = this.getControl("billlistap");
FilterParameter queryFilterParameter = billList.getQueryFilterParameter();
queryFilterParameter.setFilter(qFilter);
}
OK,搞定,然后各种切换用户测试均显示正常。
状况
首先是有人反馈当列表中如果不勾选任何行,然后引出数据,系统会将所有数据全部引出,包括被插件过滤掉的数据。测试之后发现确实存在问题,计划干预引出,但是发现引出操作是无法增加插件的。无奈只要在单据列表插件中控制,如果没有选中行不允许引出。
今天又出现状况:当数据超出一页之后在左上角会有选择全部选项,用户一旦点击了选择全部,然后执行引出,虽然提示引出的数量是显示的数量,但是实际引出的是包含被插件筛选掉的数据。就是说虽然系统在列表中做了数据隔离,但是只要引出就可以看到被隔离的数据。
分析
经过测试发现规律:使用做了数据隔离的用户查询显示正常,勾选引出也是正常;但是如果不选择或者点击选择全部之后引出系统就会按照列表过滤面板上的条件重新查询数据引出,这样就调过了列表插件中追加的过滤条件。
比如某个用户查询到17条数据,
然后不勾选或者点击选择全部最后点击引出,系统会提示引出17条数据
点是之后,进入引出界面,实际执行的是212张单据的引出,而这212张单据就是通过过滤面板中的条件查询出的单据。
由此可以推断出当不选择或者全部选择时,引出功能并不是将列表中勾选的数据引出来,而是按照面板条件重新查询再将结果引出。
于是将列表插件中数据过滤代码调整到 setFilter(SetFilterEvent e) 中,用e.setCustomQFilters(filterls)将过滤条件追加上。经过测试,问题解决。
由此可见列表中干预数据最好的方式还是在获取数据之前将条件追加到列表取数条件中,在beforeBindData中处理此时数据包已经根据过滤条件筛选构建完成,虽然此时追加过滤条件可以调整界面显示,但是如果在此事件之前获取数据的话就会出现本应被过滤掉的数据依然被获取到。
在解决问题过程中得到了@伙伴产品赋能部-高俊 @吴锐雄 两位老师的大力支持,感谢两位老师!
推荐阅读