电脑桌面
添加蚂蚁七词文库到电脑桌面
安装后可以在桌面快捷访问

refreshNode事件

来源:金蝶云社区作者:金蝶2024-09-234

refreshNode事件

1 事件介绍

事件效果:单据存在分组字段时,系统默认会自动加载分组基础资料的数据作为分组树节点;

如果分组树节点的数据,不是来自于分组基础资料,则需要业务插件捕获此事件,自行构建分组树上的节点。


2 事件触发时机

系统开始加载、刷新分组树子节点时,触发此事件。


说明:

在展开节点、或者列表刷新时,均会重复触发本事件,需要避免重复添加子节点。


3 代码模板

package kd.bos.plugin.sample.bill.list.template;
 
import kd.bos.form.control.events.RefreshNodeEvent;
import kd.bos.list.plugin.AbstractTreeListPlugin;
 
public class RefreshNode extends AbstractTreeListPlugin {
 
    @Override
    public void refreshNode(RefreshNodeEvent e) {
         super.refreshNode(e);
         // TODO 在此添加业务逻辑
    }
}


4 参数说明

public class RefreshNodeEvent extends EventObject

  • public Object getSource():事件源;

  • public Object getNodeId():当前节点标识,需要加载此节点的子节点;

  • public void setChildNodes(List<TreeNode> childNodes):设置子节点。


5 应用示例

5.1 案例说明

1. 单据上有个字段"bizappid",存储了业务应用基础资料;

2. 单据列表上,需要以业务云、业务应用作为分组节点;

3. 用户点击业务应用时,按业务应用过滤列表;点击业务云时,需按此业务云下的全部业务应用过滤列表。


5.2 实现方案

1. 捕获refreshNode事件,刷新加载业务云、业务应用节点;

2. 因为业务云、业务应用数量有限,不使用节点懒加载;

3. 捕获buildTreeListFilter事件,根据点击的业务云、业务应用,生成列表过滤条件。


5.3 运行效果



5.4 实例代码

package kd.bos.plugin.sample.bill.list.bizcase;
 
import java.util.ArrayList;
import java.util.EventObject;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
 
import kd.bos.algo.DataSet;
import kd.bos.algo.Row;
import kd.bos.dataentity.utils.StringUtils;
import kd.bos.entity.tree.TreeNode;
import kd.bos.form.control.events.RefreshNodeEvent;
import kd.bos.list.events.BuildTreeListFilterEvent;
import kd.bos.list.plugin.AbstractTreeListPlugin;
import kd.bos.orm.ORM;
import kd.bos.orm.query.QCP;
import kd.bos.orm.query.QFilter;
 
public class RefreshNodeSample extends AbstractTreeListPlugin {
 
    /** 树形控件上方的按钮的主面板 */
    private static final String KEY_TREEBUTTONPANEL  = "flexpanel_treebtn"; 
    /** 业务应用字段标识 */
    private static final String KEY_BIZAPPID  = "bizappid";
   
    /**
     * 初始化树分组控件上的工具面板时,触发此事件
     * @remark
     * 插件在此事件,隐藏树工具面板
     */
    @Override
    public void initTreeToolbar(EventObject e) {
         super.initTreeToolbar(e);
         this.getView().setVisible(false, KEY_TREEBUTTONPANEL);
    }
 
    /**
     * 加载、刷新子节点事件
     * @remark
     * 默认情况下,系统会自动加载基础资料分组表格中的数据作为分组树节点;
     * 插件可以在此事件中,自行构建分组树上的节点;
     * 另外,在展开任意节点、或者是列表刷新时,均会触发本事件,需要避免重复添加子节点
     */
    @Override
    public void refreshNode(RefreshNodeEvent e) {
         super.refreshNode(e);
        
         // 取缓存的根节点
         TreeNode root = this.getTreeModel().getRoot();
        
         // 当前节点
         String currNodeId = (String)e.getNodeId();
         TreeNode currNode = root.getTreeNode(currNodeId, 10);
        
         // 判断当前节点下,是否已经缓存了子节点:如果有,无需重复加载
         if (currNode.getChildren() != null && !currNode.getChildren().isEmpty()){
             // 直接返回缓存的子节点
             e.setChildNodes(currNode.getChildren());
         }
         else {
             // 没有缓存子节点
             if (StringUtils.equals(currNodeId, root.getId())){
                  // 当前要刷新的是根节点:读取全部业务云、业务应用,生成节点返回
                  e.setChildNodes(this.loadAppNodes());
             }
             else {
                  // 当前要刷新非根节点
                  // 业务应用节点是一次性加载完毕的,没有采用懒加载;如果在缓存中没有找到其子节点,则说明其没有子节点
                  // TODO 如果采用了懒加载子节点方案,则需要在这里尝试加载子节点
                  e.setChildNodes(null);
             }
         }
    }
 
    /**
     * 基于当前选择的分组节点,生成单据列表过滤条件时触发
     * @remark
     * 插件可以在此插件中,略过系统内置的分组条件,自行生成分组过滤条件
     */
    @Override
    public void buildTreeListFilter(BuildTreeListFilterEvent e) {
         super.buildTreeListFilter(e);
        
         // 生成过滤条件
         QFilter filter = this.buildAppQFilter(KEY_BIZAPPID, (String)e.getNodeId());
         e.addQFilter(filter);
        
         e.setCancel(true);   // 略过系统内置的分组过滤条件
    }
   
    /************** 如下代码,用来加载、搜索业务应用清单  *****************/
   
    /**
     * 构造业务应用树节点返回
     */
    private List<TreeNode> loadAppNodes(){
        
         // 读取全部业务云
         Map<String, TreeNode> allNodes = new HashMap<>();
         List<TreeNode> cloudNode4 = getCloudData();
         for(TreeNode node: cloudNode4){
             allNodes.put(node.getId(), node);
         }
        
         // 读取全部应用
         List<TreeNode> appNode4 = getAppData();
         for(TreeNode node: appNode4){
             allNodes.put(node.getId(), node);
         }
        
         // 构建节点的父子关系
         for(TreeNode node : allNodes.values()){
             TreeNode parentNode = allNodes.get(node.getParentid());
             if (parentNode != null){
                  parentNode.addChild(node);
             }
         }
        
         return cloudNode4;
    }
   
    /**
     * 查询数据库,获取业务云数据,构造为树节点集合返回
     * @return
     */
    private List<TreeNode> getCloudData() {
         List<TreeNode> cloudNode = new ArrayList<TreeNode>();
 
         ORM orm = ORM.create();
         String fields = "id, number, name";
         String orderby = "seq asc";
         QFilter[] filters = new QFilter[] {};
        
         try(DataSet ds = orm.queryDataSet("bos_devportal_bizcloud", "bos_devportal_bizcloud", fields, filters, orderby)) {
             Iterator<Row> rows = ds.iterator();
             while (rows.hasNext()) {
                  Row row = rows.next();
                  TreeNode node = new TreeNode();
                  String nodeID = "cloud/" + row.getString("number");
                  node.setText(row.getString("name"));
                  node.setParentid("0");
                  node.setId(nodeID);
                  cloudNode.add(node);
             }
         }
         return cloudNode;
    }
 
    /**
     * 查询数据库,获取业务应用数据,构造为业务应用树节点集合返回
     * @return
     */
    private static List<TreeNode> ge

refreshNode事件

1 事件介绍事件效果:单据存在分组字段时,系统默认会自动加载分组基础资料的数据作为分组树节点;如果分组树节点的数据,不是来自于分组...
点击下载文档文档为doc格式

声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。

确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息
QQ群
  • 答案:my7c点击这里加入QQ群
支持邮箱
微信
  • 微信