单据列表通过列表控制进行列隐藏,单据列表不查询隐藏列数据解决方案原创
金蝶云社区-cosmicstudio
cosmicstudio
34人赞赏了该文章 2987次浏览 未经作者许可,禁止转载编辑于2020年12月15日 18:04:28
  • 适用场景:

        主要解决了在用户正常使用时因为隐藏了某些列,但插件代码又需要使用到这些字段值导致页面数据异常,报错等情况;

        个性化列表控制存储位置:T_BAS_USERCONFIG

image.png


  • 解决方案

@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