flowable画图教程_Flowable 快速入门教程:任务驳回与回退

/**

* 流程引擎工具类封装

* @author: linjinp

* @create: 2019-12-24 13:51

**/

public class FlowableUtils {

public static final Logger logger = LogManager.getLogger(FlowableUtils.class);

/**

* 根据节点,获取入口连线

* @param source

* @return

*/

public static List getElementIncomingFlows(FlowElement source) {

List sequenceFlows = null;

if (source instanceof Task) {

sequenceFlows = ((Task) source).getIncomingFlows();

} else if (source instanceof Gateway) {

sequenceFlows = ((Gateway) source).getIncomingFlows();

} else if (source instanceof SubProcess) {

sequenceFlows = ((SubProcess) source).getIncomingFlows();

} else if (source instanceof StartEvent) {

sequenceFlows = ((StartEvent) source).getIncomingFlows();

} else if (source instanceof EndEvent) {

sequenceFlows = ((EndEvent) source).getIncomingFlows();

}

return sequenceFlows;

}

/**

* 根据节点,获取出口连线

* @param source

* @return

*/

public static List getElementOutgoingFlows(FlowElement source) {

List sequenceFlows = null;

if (source instanceof Task) {

sequenceFlows = ((Task) source).getOutgoingFlows();

} else if (source instanceof Gateway) {

sequenceFlows = ((Gateway) source).getOutgoingFlows();

} else if (source instanceof SubProcess) {

sequenceFlows = ((SubProcess) source).getOutgoingFlows();

} else if (source instanceof StartEvent) {

sequenceFlows = ((StartEvent) source).getOutgoingFlows();

} else if (source instanceof EndEvent) {

sequenceFlows = ((EndEvent) source).getOutgoingFlows();

}

return sequenceFlows;

}

/**

* 获取全部节点列表,包含子流程节点

* @param flowElements

* @param allElements

* @return

*/

public static Collection getAllElements(Collection flowElements, Collection allElements) {

allElements = allElements == null ? new ArrayList<>() : allElements;

for (FlowElement flowElement : flowElements) {

allElements.add(flowElement);

if (flowElement instanceof SubProcess) {

// 继续深入子流程,进一步获取子流程

allElements = FlowableUtils.getAllElements(((SubProcess) flowElement).getFlowElements(), allElements);

}

}

return allElements;

}

/**

* 迭代获取父级任务节点列表,向前找

* @param source 起始节点

* @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复

* @param userTaskList 已找到的用户任务节点

* @return

*/

public static List iteratorFindParentUserTasks(FlowElement source, Set hasSequenceFlow, List userTaskList) {

userTaskList = userTaskList == null ? new ArrayList<>() : userTaskList;

hasSequenceFlow = hasSequenceFlow == null ? new HashSet<>() : hasSequenceFlow;

// 如果该节点为开始节点,且存在上级子节点,则顺着上级子节点继续迭代

if (source instanceof StartEvent && source.getSubProcess() != null) {

userTaskList = iteratorFindParentUserTasks(source.getSubProcess(), hasSequenceFlow, userTaskList);

}

// 根据类型,获取入口连线

List sequenceFlows = getElementIncomingFlows(source);

if (sequenceFlows != null) {

// 循环找到目标元素

for (SequenceFlow sequenceFlow: sequenceFlows) {

// 如果发现连线重复,说明循环了,跳过这个循环

if (hasSequenceFlow.contains(sequenceFlow.getId())) {

continue;

}

// 添加已经走过的连线

hasSequenceFlow.add(sequenceFlow.getId());

// 类型为用户节点,则新增父级节点

if (sequenceFlow.getSourceFlowElement() instanceof UserTask) {

userTaskList.add((UserTask) sequenceFlow.getSourceFlowElement());

continue;

}

// 类型为子流程,则添加子流程开始节点出口处相连的节点

if (sequenceFlow.getSourceFlowElement() instanceof SubProcess) {

// 获取子流程用户任务节点

List childUserTaskList = findChildProcessUserTasks((StartEvent) ((SubProcess) sequenceFlow.getSourceFlowElement()).getFlowElements().toArray()[0], null, null);

// 如果找到节点,则说明该线路找到节点,不继续向下找,反之继续

if (childUserTaskList != null && childUserTaskList.size() > 0) {

userTaskList.addAll(childUserTaskList);

continue;

}

}

// 继续迭代

userTaskList = iteratorFindParentUserTasks(sequenceFlow.getSourceFlowElement(), hasSequenceFlow, userTaskList);

}

}

return userTaskList;

}

/**

* 根据正在运行的任务节点,迭代获取子级任务节点列表,向后找

* @param source 起始节点

* @param runTaskKeyList 正在运行的任务 Key,用于校验任务节点是否是正在运行的节点

* @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复

* @param userTaskL

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值