/** * 递归查询经过指定节点的父令牌 * * @param token * @param nodeId * @return */ private TokenEntity getParentTokenByNodeId(TokenEntity token, String nodeId) { if (token == null) { return null; } TaskQuery taskQuery = new TaskQueryImpl(Context.getCommandContext()); long taskCount = taskQuery.tokenId(token.getId()).nodeId(nodeId).count(); if (taskCount != 0) { return token; } else { return getParentTokenByNodeId((TokenEntity) token.getParent(), nodeId); } }
/** 结束任务,并驱动流程向下运转。 指定需要去的节点和指定节点的任务处理者 */ public void complete(KernelFlowNodeImpl toFlowNode, String assignee) { /** 设置任务结束状态 */ end(); /** 正常处理任务不能处理已经暂停的任务 */ if (this.isSuspended) { throw ExceptionUtil.getException("10303001"); } /** 获取令牌 */ if (tokenId != null) { TokenEntity token = null; token = getToken(); if (toFlowNode != null) { // 如果指定了目标节点,则首先判断本令牌是否走过该节点 // 如果走过该节点(taskCount != 0)则正常退回 // 如果未走过该节点,则递归查询父令牌是否经过,如果父令牌走过,则结束父令牌的child,并推动父令牌退回,如果父令牌也未走过,则抛出异常 String nodeId = toFlowNode.getId(); TaskQuery taskQuery = new TaskQueryImpl(Context.getCommandContext()); long taskCount = taskQuery.tokenId(tokenId).nodeId(nodeId).count(); if (taskCount == 0) { token = getParentTokenByNodeId((TokenEntity) token.getParent(), toFlowNode.getId()); if (token == null) { throw ExceptionUtil.getException("10303002"); } token.terminationChildToken(); } token.setToFlowNode(toFlowNode); } /** 移除令牌上注册任务 */ token.removeTask(this); if (StringUtil.isNotEmpty(assignee)) { token.setTaskAssignee(assignee); } /** 驱动令牌向下 */ token.signal(); } else { log.warn("任务:" + id + "没有令牌号,仅做结束任务处理,不驱动流程向下。"); } }