获取当前流程节点ID及名称¶
本文档内容来源于 http://doc.myapps.cn/docs/common-script/common-script-1f1a4j5qtfe65
脚本说明¶
该脚本用于获取当前流程节点的ID和名称。在流程审批过程中,经常需要获取当前所在节点的信息,用于业务逻辑判断或信息展示。
常见实现方式¶
方式1:通过文档状态标签获取¶
(function(){
var doc = getCurrentDocument();
var stateLabel = doc.getStateLabel(); // 节点名称
var state = doc.getState(); // 节点状态
// 通过状态标签查询节点ID
var sql = "select domainid,id,node_name ";
sql += "from t_flow_node ";
sql += "where node_name = '"+stateLabel+"' ";
sql += "and flow_id = (select flow_id from t_flowstatert where docid = '"+doc.getId()+"')";
var node = findBySQL(sql);
if(node != null){
return {
nodeId: node.getId(),
nodeName: node.getItemValueAsString("node_name")
};
}
return {
nodeId: "",
nodeName: stateLabel
};
})();
方式2:通过流程状态表获取¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
// 查询当前流程状态
var sql = "select domainid,fs.id,fs.current_node_id,fs.current_node_name ";
sql += "from t_flowstatert fs ";
sql += "where fs.docid = '"+docId+"'";
var flowState = findBySQL(sql);
if(flowState != null){
return {
nodeId: flowState.getItemValueAsString("current_node_id"),
nodeName: flowState.getItemValueAsString("current_node_name")
};
}
return null;
})();
方式3:通过流程对象获取¶
(function(){
var doc = getCurrentDocument();
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
var currentNode = flow.getCurrentNode();
if(currentNode != null){
return {
nodeId: currentNode.getId(),
nodeName: currentNode.getName()
};
}
}
return null;
})();
方式4:通过文档状态获取¶
(function(){
var doc = getCurrentDocument();
var stateLabel = doc.getStateLabel();
var state = doc.getState();
// 通过状态查询节点
var sql = "select domainid,n.id,n.node_name ";
sql += "from t_flow_node n ";
sql += "inner join t_flowstatert fs on n.flow_id = fs.flow_id ";
sql += "where fs.docid = '"+doc.getId()+"' ";
sql += "and n.node_name = '"+stateLabel+"'";
var node = findBySQL(sql);
if(node != null){
return {
nodeId: node.getId(),
nodeName: node.getItemValueAsString("node_name"),
state: state,
stateLabel: stateLabel
};
}
return {
nodeId: "",
nodeName: stateLabel,
state: state,
stateLabel: stateLabel
};
})();
扩展示例¶
示例1:获取节点信息并设置到字段¶
(function(){
var doc = getCurrentDocument();
var stateLabel = doc.getStateLabel();
var sql = "select domainid,n.id,n.node_name ";
sql += "from t_flow_node n ";
sql += "inner join t_flowstatert fs on n.flow_id = fs.flow_id ";
sql += "where fs.docid = '"+doc.getId()+"' ";
sql += "and n.node_name = '"+stateLabel+"'";
var node = findBySQL(sql);
if(node != null){
var nodeId = node.getId();
var nodeName = node.getItemValueAsString("node_name");
// 设置到字段
doc.findItem("当前节点ID").setValue(nodeId);
doc.findItem("当前节点名称").setValue(nodeName);
return nodeName;
}else{
// 如果没有找到节点,使用状态标签
doc.findItem("当前节点名称").setValue(stateLabel);
return stateLabel;
}
})();
示例2:获取节点信息及流程信息¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var sql = "select domainid,fs.id,fs.flow_id,fs.current_node_id,fs.current_node_name, ";
sql += "f.flow_name ";
sql += "from t_flowstatert fs ";
sql += "inner join t_flow f on fs.flow_id = f.id ";
sql += "where fs.docid = '"+docId+"'";
var flowState = findBySQL(sql);
if(flowState != null){
return {
nodeId: flowState.getItemValueAsString("current_node_id"),
nodeName: flowState.getItemValueAsString("current_node_name"),
flowId: flowState.getItemValueAsString("flow_id"),
flowName: flowState.getItemValueAsString("flow_name")
};
}
return null;
})();
示例3:根据节点名称执行不同逻辑¶
(function(){
var doc = getCurrentDocument();
var stateLabel = doc.getStateLabel();
var sql = "select domainid,n.id,n.node_name,n.node_type ";
sql += "from t_flow_node n ";
sql += "inner join t_flowstatert fs on n.flow_id = fs.flow_id ";
sql += "where fs.docid = '"+doc.getId()+"' ";
sql += "and n.node_name = '"+stateLabel+"'";
var node = findBySQL(sql);
if(node != null){
var nodeName = node.getItemValueAsString("node_name");
var nodeType = node.getItemValueAsString("node_type");
// 根据节点名称执行不同逻辑
if(nodeName.indexOf("部门") >= 0){
doc.findItem("处理方式").setValue("部门审批");
}else if(nodeName.indexOf("财务") >= 0){
doc.findItem("处理方式").setValue("财务审批");
}else if(nodeName.indexOf("总经理") >= 0){
doc.findItem("处理方式").setValue("总经理审批");
}
return {
nodeId: node.getId(),
nodeName: nodeName,
nodeType: nodeType
};
}
return null;
})();
示例4:获取节点信息及审批人信息¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
// 获取节点信息
var sql = "select domainid,fs.id,fs.current_node_id,fs.current_node_name ";
sql += "from t_flowstatert fs ";
sql += "where fs.docid = '"+docId+"'";
var flowState = findBySQL(sql);
if(flowState != null){
var nodeId = flowState.getItemValueAsString("current_node_id");
var nodeName = flowState.getItemValueAsString("current_node_name");
var flowStateId = flowState.getId();
// 获取当前节点审批人
var actorSql = "select domainid,actor_name ";
actorSql += "from t_actor ";
actorSql += "where flowstatert_id = '"+flowStateId+"' ";
actorSql += "and state = 0";
var actors = queryBySQL(actorSql);
var actorList = [];
if(actors != null && actors.size() > 0){
for(var it = actors.iterator(); it.hasNext(); ){
var actor = it.next();
actorList.push(actor.getItemValueAsString("actor_name"));
}
}
return {
nodeId: nodeId,
nodeName: nodeName,
actors: actorList
};
}
return null;
})();
示例5:格式化显示节点信息¶
(function(){
var doc = getCurrentDocument();
var stateLabel = doc.getStateLabel();
var sql = "select domainid,n.id,n.node_name ";
sql += "from t_flow_node n ";
sql += "inner join t_flowstatert fs on n.flow_id = fs.flow_id ";
sql += "where fs.docid = '"+doc.getId()+"' ";
sql += "and n.node_name = '"+stateLabel+"'";
var node = findBySQL(sql);
if(node != null){
var nodeId = node.getId();
var nodeName = node.getItemValueAsString("node_name");
return "当前节点:" + nodeName + "(ID:" + nodeId + ")";
}else{
return "当前节点:" + stateLabel;
}
})();
关键函数说明¶
getCurrentDocument(): 获取当前文档对象doc.getStateLabel(): 获取当前节点的状态标签(节点名称)doc.getState(): 获取当前节点的状态doc.getId(): 获取文档IDgetFlowProcess(): 获取流程处理对象flowProcess.doViewByDocument(doc): 根据文档获取流程对象flow.getCurrentNode(): 获取当前节点对象node.getId(): 获取节点IDnode.getName(): 获取节点名称
系统表说明¶
- t_flowstatert: 流程状态运行时表,存储流程的运行时状态
current_node_id: 当前节点IDcurrent_node_name: 当前节点名称- t_flow_node: 流程节点表,存储流程节点信息
id: 节点IDnode_name: 节点名称node_type: 节点类型- t_flow: 流程表,存储流程基本信息
节点信息说明¶
- 节点ID: 流程节点的唯一标识
- 节点名称: 流程节点的显示名称(状态标签)
- 节点状态: 节点的状态值
- 状态标签: 通过
doc.getStateLabel()获取,通常是节点名称
注意事项¶
- ⚠️ 状态标签:
doc.getStateLabel()返回的是节点名称,可以直接使用 - ⚠️ 节点ID查询: 需要通过节点名称查询节点ID,注意节点名称的匹配
- ⚠️ 流程关联: 查询节点时需要关联流程ID,确保查询到正确的节点
- ⚠️ 空值判断: 节点可能不存在,需要判断返回值
- 不同版本的API可能有所不同
- 查询时注意字段名称的正确性
- 节点名称可能包含特殊字符,需要注意SQL转义
使用场景¶
- 显示当前节点信息
- 根据节点执行业务逻辑
- 节点权限判断
- 节点信息记录
- 流程信息展示
如需查看完整脚本代码,请访问源文档链接。