动态设置多类别基础资料类型、过滤、设置默认值原创
金蝶云社区-技术支持与赋能部_ZH
技术支持与赋能部_ZH
5人赞赏了该文章 1127次浏览 未经作者许可,禁止转载编辑于2023年04月19日 16:22:30

关键词:多类别基础资料类型,多类别基础资料,过滤,动态设置

一、需求

1、某张单据需要判断不同用户登录,来决定该基础资料字段是什么基础资料类型或过滤没有权限查看的基础资料,并且可以直接设置默认值。

2、一些场景没办法提前判断需要预置的基础资料。且该基础资料字段同时可以展示多个基础资料类型。

二、思路与方案

2.1分析思路

同一个基础资料,运行时可以动态调整基础资料类型,需要用到多类别基础资料字段,多类别基础资料字段需要与多类别基础资料类型同时使用。

2.2实现方案

需求一:最简单的方式是,提前预置多类别基础资料类型的数据,然后通过条件过滤显示隐藏即可

需求二:因为无法判断需要预置的多类别基础资料类型的内容,所以需要通过插件动态生成新的基础资料类型

三、实现过程

3.1需求一

1、单据中创建多类别基础资料字段和基础资料类型字段

image.png

2、打开基础资料类型的属性:多类别基础资料类型进行设置,预置好要展示的基础资料类型

image.png

3、编写表单插件,在beforeBindData事件中执行多类别基础资料类型过滤显示的逻辑,并可设置默认值

public void beforeBindData(EventObject e) {
    super.beforeBindData(e);

    //动态过滤多类别基础资料下拉项
    ItemClassTypeEdit selectDimTypeFields = (ItemClassTypeEdit) this.getControl("lago_itemclasstypefield");
    ItemClassTypeProp prop = (ItemClassTypeProp) selectDimTypeFields.getProperty();
    List<ValueMapItem> comboItems = prop.getComboItems();

    Map<String,Object> params =  new HashMap<>();
    Map<String,Object> item =  new HashMap<>();
    List<List> combos = new ArrayList<>();


    //遍历多类别基础资料类型下拉项
    for(ValueMapItem vm : comboItems){
        String name = String.valueOf(vm.getName());
        String value = vm.getValue();
        //设置过滤条件
        if(name.equals("行政组织")){
            // 下拉选项  配置信息【值,名称,图标,是否显示】
            combos.add(Arrays.asList(value, vm.getName(), null, true));
        }else{
            combos.add(Arrays.asList(value, vm.getName(), null, false));//false 为不显示
        }

    }
    item.put("st", combos);
    params.put("item", item);
    this.getView().updateControlMetadata("lago_itemclasstypefield", params);
    
    //设置多类别基础资料、多类别基础资料类型默认值
    this.getModel().setValue("lago_itemclasstypefield", "bos_adminorg");
    DynamicObject[] users = BusinessDataServiceHelper.load("bos_adminorg", "id", null);
 
    this.getModel().setValue("lago_itemclassfield", users[0].get("id"));

}

3.2需求二

1、第一步与需求一相同,然后只需要随便预置一个基础资料类型即可,因为设计器默认需要给基础资料类型设置一个类型,否则无法提交保存

2、编写表单插件,在afterCreateNewData事件中执行,新增多类别基础资料类型的逻辑
public void afterCreateNewData(EventObject e) {
    super.afterCreateNewData(e);

   //动态设置新增多类别基础资料
    ItemClassTypeEdit selectDimTypeFields = (ItemClassTypeEdit) this.getControl("lago_itemclasstypefield");
   List<ComboItem> propertyItems = new ArrayList();
    List<String> baseEntityIds = new ArrayList<>();

    //创建新多类别基础资料类型项
    ComboItem comboItem = new ComboItem();
    comboItem.setId("bd_material");
    comboItem.setValue("bd_material");
    comboItem.setCaption(new LocaleString("物料"));
    propertyItems.add(comboItem);
    baseEntityIds.add("bd_material");
    
    //设置新的多类别基础资料类型
    selectDimTypeFields.setComboItems(propertyItems);
    ItemClassTypeProp prop = (ItemClassTypeProp) selectDimTypeFields.getProperty();
    MainEntityType mainEntityType = EntityMetadataCache.getDataEntityType("bd_material");
    prop.setItemType(mainEntityType);
    prop.setBaseEntityIds(baseEntityIds);

}

四、效果图

4.1需求一

image.png

image.png

4.2需求二

image.png

五、开发环境版本

V5.0.011

六、注意事项

修改前端下拉项属性时,需要注意,第二个参数名称需要是LocaleString类型,否则无法生效

combos.add(Arrays.asList("值", "名称", "图标", "是否显示"));

七、参考资料

开发平台

学习成长中心

八、源代码


赞 5