获取上一个节点的状态标签¶
本文档内容来源于 http://doc.myapps.cn/docs/common-script/common-script-1f1a46o2qjtq3
脚本说明¶
该脚本用于获取流程中上一个节点的状态标签。在流程审批过程中,有时需要获取前一个节点的状态信息,用于业务逻辑判断或信息展示。
常见实现方式¶
方式1:通过审批历史查询¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
// 查询当前流程状态
var currentFlowSql = "select domainid,id,state_label ";
currentFlowSql += "from t_flowstatert ";
currentFlowSql += "where docid = '"+docId+"'";
var currentFlow = findBySQL(currentFlowSql);
if(currentFlow != null){
var currentStateLabel = currentFlow.getItemValueAsString("state_label");
// 查询审批历史,按处理时间倒序
var sql = "select domainid,state_label,processtime ";
sql += "from t_actorhis ";
sql += "where flowstatert_id = '"+currentFlow.getId()+"' ";
sql += "and state_label != '"+currentStateLabel+"' ";
sql += "order by processtime desc limit 1";
var previousNode = findBySQL(sql);
if(previousNode != null){
return previousNode.getItemValueAsString("state_label");
}
}
return null;
})();
方式2:通过流程节点顺序查询¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var currentStateLabel = doc.getStateLabel();
// 查询流程节点历史,按处理时间排序
var sql = "select domainid,state_label,processtime ";
sql += "from t_actorhis ";
sql += "where flowstatert_id in (select id from t_flowstatert where docid = '"+docId+"') ";
sql += "and state_label != '"+currentStateLabel+"' ";
sql += "order by processtime desc";
var history = queryBySQL(sql);
if(history != null && history.size() > 0){
// 获取第一条记录(上一个节点)
var previousNode = history.get(0);
return previousNode.getItemValueAsString("state_label");
}
return null;
})();
方式3:通过流程对象获取¶
(function(){
var doc = getCurrentDocument();
var flowProcess = getFlowProcess();
var flow = flowProcess.doViewByDocument(doc);
if(flow != null){
var currentStateLabel = doc.getStateLabel();
var nodes = flow.getNodes();
if(nodes != null && nodes.size() > 0){
var currentIndex = -1;
// 找到当前节点的索引
for(var i = 0; i < nodes.size(); i++){
var node = nodes.get(i);
if(node.getStateLabel() === currentStateLabel){
currentIndex = i;
break;
}
}
// 获取上一个节点
if(currentIndex > 0){
var previousNode = nodes.get(currentIndex - 1);
return previousNode.getStateLabel();
}
}
}
return null;
})();
方式4:获取上一个节点的完整信息¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var currentStateLabel = doc.getStateLabel();
// 查询审批历史
var sql = "select domainid,actor_name,state_label,attitude,processtime ";
sql += "from t_actorhis ";
sql += "where flowstatert_id in (select id from t_flowstatert where docid = '"+docId+"') ";
sql += "and state_label != '"+currentStateLabel+"' ";
sql += "order by processtime desc limit 1";
var previousNode = findBySQL(sql);
if(previousNode != null){
return {
stateLabel: previousNode.getItemValueAsString("state_label"),
actor: previousNode.getItemValueAsString("actor_name"),
attitude: previousNode.getItemValueAsString("attitude"),
processTime: format(previousNode.getItemValueAsDate("processtime"), "yyyy-MM-dd HH:mm:ss")
};
}
return null;
})();
扩展示例¶
示例1:获取上一个节点状态并设置到字段¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var currentStateLabel = doc.getStateLabel();
var sql = "select domainid,state_label ";
sql += "from t_actorhis ";
sql += "where flowstatert_id in (select id from t_flowstatert where docid = '"+docId+"') ";
sql += "and state_label != '"+currentStateLabel+"' ";
sql += "order by processtime desc limit 1";
var previousNode = findBySQL(sql);
if(previousNode != null){
var previousStateLabel = previousNode.getItemValueAsString("state_label");
doc.findItem("上一个节点").setValue(previousStateLabel);
return previousStateLabel;
}
return null;
})();
示例2:根据上一个节点状态执行不同逻辑¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var currentStateLabel = doc.getStateLabel();
var sql = "select domainid,state_label ";
sql += "from t_actorhis ";
sql += "where flowstatert_id in (select id from t_flowstatert where docid = '"+docId+"') ";
sql += "and state_label != '"+currentStateLabel+"' ";
sql += "order by processtime desc limit 1";
var previousNode = findBySQL(sql);
if(previousNode != null){
var previousStateLabel = previousNode.getItemValueAsString("state_label");
// 根据上一个节点状态执行不同逻辑
if(previousStateLabel.indexOf("部门") >= 0){
doc.findItem("处理方式").setValue("部门审批后");
}else if(previousStateLabel.indexOf("财务") >= 0){
doc.findItem("处理方式").setValue("财务审批后");
}else{
doc.findItem("处理方式").setValue("其他审批后");
}
return previousStateLabel;
}
return null;
})();
示例3:获取所有历史节点状态¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var currentStateLabel = doc.getStateLabel();
var sql = "select domainid,state_label,processtime ";
sql += "from t_actorhis ";
sql += "where flowstatert_id in (select id from t_flowstatert where docid = '"+docId+"') ";
sql += "order by processtime";
var history = queryBySQL(sql);
var stateLabels = [];
if(history != null && history.size() > 0){
for(var it = history.iterator(); it.hasNext(); ){
var h = it.next();
var stateLabel = h.getItemValueAsString("state_label");
if(!stateLabels.contains(stateLabel)){
stateLabels.push(stateLabel);
}
}
}
// 获取上一个节点(倒数第二个)
if(stateLabels.length >= 2){
return stateLabels[stateLabels.length - 2];
}else if(stateLabels.length == 1){
return stateLabels[0];
}
return null;
})();
示例4:获取上一个节点的审批人信息¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var currentStateLabel = doc.getStateLabel();
var sql = "select domainid,actor_name,state_label,attitude ";
sql += "from t_actorhis ";
sql += "where flowstatert_id in (select id from t_flowstatert where docid = '"+docId+"') ";
sql += "and state_label != '"+currentStateLabel+"' ";
sql += "order by processtime desc limit 1";
var previousNode = findBySQL(sql);
if(previousNode != null){
return {
stateLabel: previousNode.getItemValueAsString("state_label"),
actor: previousNode.getItemValueAsString("actor_name"),
attitude: previousNode.getItemValueAsString("attitude")
};
}
return null;
})();
示例5:判断是否为第一个节点¶
(function(){
var doc = getCurrentDocument();
var docId = doc.getId();
var currentStateLabel = doc.getStateLabel();
// 查询是否有上一个节点
var sql = "select domainid,state_label ";
sql += "from t_actorhis ";
sql += "where flowstatert_id in (select id from t_flowstatert where docid = '"+docId+"') ";
sql += "and state_label != '"+currentStateLabel+"' ";
sql += "order by processtime desc limit 1";
var previousNode = findBySQL(sql);
if(previousNode == null){
// 没有上一个节点,说明是第一个节点
return {
isFirstNode: true,
previousStateLabel: null,
message: "这是第一个节点"
};
}else{
return {
isFirstNode: false,
previousStateLabel: previousNode.getItemValueAsString("state_label"),
message: "上一个节点:" + previousNode.getItemValueAsString("state_label")
};
}
})();
关键函数说明¶
getCurrentDocument(): 获取当前文档对象doc.getStateLabel(): 获取当前节点的状态标签doc.getId(): 获取文档IDgetFlowProcess(): 获取流程处理对象flowProcess.doViewByDocument(doc): 根据文档获取流程对象queryBySQL(sql): 执行SQL查询findBySQL(sql): 执行SQL查询并返回第一条记录
系统表说明¶
- t_flowstatert: 流程状态运行时表,存储流程的运行时状态
- t_actorhis: 流程执行人历史表,存储审批历史记录,包含状态标签信息
状态标签说明¶
- 状态标签: 流程节点的显示名称,用于标识流程当前所在的节点
- 获取方式: 通过
doc.getStateLabel()或从t_actorhis表的state_label字段获取 - 节点顺序: 通过
processtime(处理时间)排序来确定节点顺序
注意事项¶
- ⚠️ 当前节点判断: 需要排除当前节点的状态标签,避免获取到当前节点
- ⚠️ 排序方式: 使用
processtime desc按处理时间倒序,获取最新的上一个节点 - ⚠️ 第一个节点: 如果是第一个节点,可能没有上一个节点,需要判断返回值
- ⚠️ 状态标签匹配: 状态标签需要完全匹配,注意大小写和空格
- 查询时注意字段名称的正确性
- 如果流程有多个分支,可能需要根据流程路径判断上一个节点
- 建议在需要获取上一个节点信息时使用,如条件判断、信息展示等
使用场景¶
- 根据上一个节点状态执行业务逻辑
- 显示上一个节点信息
- 流程节点状态判断
- 流程回退判断
- 流程信息展示
如需查看完整脚本代码,请访问源文档链接。