需求:工作流引擎snaker,不可以返回完成全流程图,通过表达式计算出一条可执行的子流程。
分析:直接返回完整流程图比较简单,直接获取List<NodeMode>返回即可,当前需要返回一条可执行的子流程,开始头疼。流程预览并非流程提交,不可以通过任务executeaske()方法获取条件decisionMode下outputs下enabled=true条件节点。前端提供参数orderId。
开发过程
@Autowired private SnakerEngine facets;
1、获取流程实例order
Order order = facets.query().getOrder(orderId);
2、获取表单参数
Map<String, Object> argsMap = (Map<String, Object>) JSON.parse(order.getVariable());
3、获取所有节点
ProcessModel processModel = facets.process().getProcessById(order.getProcessId()).getModel(); List<NodeModel> nodeModels = processModel.getNodes();
4、迭代获取流程节点的properties详情
Process process = facets.process().getProcessById(order.getProcessId()); FlowWebDto flowWebDto = this.getProcessById(order.getProcessId()); ProcessData processData = flowWebDto.getProcessData(); Map<String, ProcessData> processDataMap = new HashMap<>(); // 递归获取每个流程节点的properties ProcessData.getRecursiveProperties(processData, processDataMap);
5、创建执行器
Execution execution = new Execution(facets,process,order, (Map)argsMap);
6、获取表达式对象
Expression expression = (Expression) ServiceContext.getContext().find(Expression.class);
7、获取所有的条件判断节点
List<DecisionModel> decisionModel = SnakerHelper.getDecisionModel(nodeModels);
8、执行条件表达进行判断
for(int i=0;i<decisionModel.size();i++){ Iterator i$ = decisionModel.get(0).getOutputs().iterator(); while(i$.hasNext()) { TransitionModel tm = (TransitionModel)i$.next(); String expr = tm.getExpr(); if (StringHelper.isNotEmpty(expr) && (Boolean)expression.eval(Bo