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> gerefreshNode事件
1 事件介绍事件效果:单据存在分组字段时,系统默认会自动加载分组基础资料的数据作为分组树节点;如果分组树节点的数据,不是来自于分组...
点击下载文档文档为doc格式
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。
上一篇
已经是第一篇



