skipNodes = new HashSet<>();
/** 用户语言 */
private Object userLang = "ZH";
/**
* 引擎启动后,选出工作流中第一个审批节点上的候选人列表
*/
public void findFirstNode() {
// 新发起的流程,会先确认节点列表是否存在
if (flowNodes.size() == 0)
throw new FailedException(FlowUtil.NODE_IS_EMPTY);
/**
* 选出第一个节点的处理过程,默认第一个节点是“串行”节点
*/
pickWorkNode(flowNodes.get(0), FlowUtil.STYLE_SERIAL);
}
/**
* 根据当前节点5种类型分别处理,直到递归找到第一个普通节点
*
* 0.普通 1.串行(子流程) 2.条件 3.会签 5.并行
*
* 当前节点全部信息:
* nodeComp,nodeNo,nodeFlowNo,nodeName,nodeParent,nodeStyle,nodeTier
* ,nodeType,nodeStep,nodeRules,nodeEvent,taskComp,taskId,taskFlowNo
* ,workComp,workTaskId,workNodeNo,workState,workComment
* ,workESign,workUpdate,workIdx..
*/
private void pickWorkNode(Map theNode, String pStyle) {
// 审批节点会根据当前节点类型去分别处理
String style = theNode.get(Node.STYLE);
// 当前节点是普通节点=“0”时,选出所有候选人列表
if (FlowUtil.STYLE_NORMAL.equals(style)) {
// 这里先设置审批状态为“就绪”=“0”,并缓存当前“审批中”的节点
addWorkNode(theNode, FlowUtil.STATE_READY);
/**
* 选出当前节点审批候选人列表(这里也可能是“死胡同”)
*/
pickCandidates(theNode, pStyle);
return;
}
// 当前节点不是普通节点时,暂时置为“处理中”=“1”
addWorkNode(theNode, FlowUtil.STATE_WAITING);
// 再获取下一级所有子节点
List