单据列表通过列表控制进行列隐藏,单据列表不查询隐藏列数据解决方案原创
34人赞赏了该文章
3,548次浏览
编辑于2020年12月15日 18:04:28
适用场景:
主要解决了在用户正常使用时因为隐藏了某些列,但插件代码又需要使用到这些字段值导致页面数据异常,报错等情况;
个性化列表控制存储位置:T_BAS_USERCONFIG
解决方案
@Override public void beforeBindData(EventObject e) { // 获取单据列表 BillList billList = this.getControl(AbstractListPlugin.BILLLISTID); // 获取单据列表列(有时可能获取不到数据,这里涉及到列表配置缓存以及用户是否有修改过表格配置[用户配置信息表:T_BAS_USERCONFIG]等不做展开) List<Map<String, Object>> list = billList.getListFieldsControlColumns(); // 是否是查找 Boolean isLookUp = billList.getContext() != null ? billList.getContext().isLookup() : false; // 是否是列表 Boolean isList = billList.getView().getFormShowParameter() instanceof ListShowParameter; for(Map<String, Object> map : list){ Integer visible = (Integer) map.get("visible"); // 判断列是否可见 Boolean userListColumnsVisible = ViewCommonUtil.getListColumnVisible(isList, isLookUp,visible); // 字段KEY String listFieldKey = (String)map.get("listFieldKey"); if(StringUtils.equals("follow_handler.name", listFieldKey) && !userListColumnsVisible){ // 通过视图继续恢复隐藏 billList.getView().setVisible(false,"follow_handler_name"); // 设置可见(这样子就会查询这一列的数据) map.put("visible",11); }else if(StringUtils.equals("limits_value", listFieldKey) && !userListColumnsVisible){ // 通过视图继续恢复隐藏 billList.getView().setVisible(false,"limits_value"); // 设置可见(这样子就会查询这一列的数据) map.put("visible",11); } } }
getListColumnVisible() 实现逻辑
public static boolean getListColumnVisible(boolean isList, boolean isLookUp, int visibleValue) { int mask; byte shift; if (!isList) { mask = 8; shift = 3; } else { mask = isLookUp ? 2 : 1; shift = 1; } int ret = visibleValue & mask; int bitVisibile = ret > shift ? ret >> shift : ret; return bitVisibile == 1; }
验证是否成功
@Overridepublic void beforePackageData(BeforePackageDataEvent e) { for (DynamicObject item : e.getPageData()) { // 不报错并能获取到值 DynamicObject follow_handler = item.getDynamicObject("lifecycle.follow_handler"); follow_handler.getString("name"); // 不报错并能获取到值 DynamicObject limits_value = item.getDynamicObject("lifecycle.limits_value"); } }
其它情况处理建议
当通过billList.getListFieldsControlColumns()获取不到列时,但是还是需要处理隐藏问题时可以这么做;
/** * 当用户配置信息不存在时(获取列表字段,设置可见获取值) * @param parentControl(初始调用:BillList) * @param plugin * @param isLookUp * @param isList */ private static void collectChildItems(Container parentControl,AbstractFormPlugin plugin,Boolean isLookUp,Boolean isList) { Iterator var3 = parentControl.getItems().iterator(); while(var3.hasNext()) { Control control = (Control)var3.next(); if (control instanceof IListColumn) { control.setView(parentControl.getView()); IListColumn listColumn = (IListColumn)control; String listFieldKey = listColumn.getListFieldKey(); int visible = listColumn.getVisible(); Boolean userListColumnsVisible = ViewCommonUtil.getListColumnVisible(isList, isLookUp,visible); BillList billList = plugin.getControl(AbstractListPlugin.BILLLISTID); if(StringUtils.equals("follow_handler.name", listFieldKey) && !userListColumnsVisible){ // 通过视图继续恢复隐藏 billList.getView().setVisible(false,"follow_handler_name"); // 设置可见(这样子就会查询这一列的数据) listColumn.setVisible(63); } else if(StringUtils.equals("limits_value", listFieldKey) && !userListColumnsVisible){ // 通过视图继续恢复隐藏 billList.getView().setVisible(false,"limits_value"); // 设置可见(这样子就会查询这一列的数据) listColumn.setVisible(63); } } else if (control instanceof Container) { control.setView(parentControl.getView()); if (control instanceof IListChild && parentControl instanceof BillList) { ((IListChild)control).setParent((BillList)parentControl); } collectChildItems((Container)control,plugin,isLookUp,isList); } } }
赞 34
34人点赞
还没有人点赞,快来当第一个点赞的人吧!
打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!