如何实现Activiti的分支条件的自定义配置

2024-11-19 09:39:12
推荐回答(2个)
回答(1):

一、Activiti的流程分支条件的局限

Activiti的流程分支条件目前是采用脚本判断方式,并且需要在流程定义中进行分支条件的设定,如下图所示:

${input == 1} ${input == 2} ${input == 3}

从上面的定义可以看到,流程的分支条件存在以下两个致命的局限性:

1.分支条件需要在流程定义(XML)中设定,这要求流程定义必须由开发人员来设计及编写

2.分支条件比较简单,一般为boolean表达式,表达式里的为单变量的判断处理。

以上两个局限性限制了流程的分支判断处理必须由开发人员来设定,而国内的大部分的流程应用都要求是普通的业务人员即可处理,或者是由有一定计算机基础的人员来设置处理。这要求我们对流程的条件设置提出了更高的要求,上一节我们通过修改Activiti的流程定义的XML中的分支条件表达式,同时刷新流程定义的引擎缓存,如下的代码就是基于这种方式:

JsonNode jsonObject=objectMapper.readTree(configJson); JsonNode configsNode=jsonObject.get("configs"); BpmSolution bpmSolution=bpmSolutionManager.get(solId); BpmDef bpmDef=bpmDefManager.getLatestBpmByKey(bpmSolution.getDefKey(), ContextUtil.getCurrentTenantId()); ActProcessDef processDef=actRepService.getProcessDef(bpmDef.getActDefId()); String processDefXml=actRepService.getBpmnXmlByDeployId(bpmDef.getActDepId()); System.out.println("xml:"+processDefXml); ActNodeDef sourceNode=processDef.getNodesMap().get(nodeId); ByteArrayInputStream is=new ByteArrayInputStream(processDefXml.getBytes());

if(configsNode!=null){ //取得分支条件列表 JsonNode configs=configsNode.get("conditions"); if(configs!=null){ Iterator it=configs.elements(); while(it.hasNext()){ ObjectNode config=(ObjectNode)it.next(); String tmpNodeId=config.get("nodeId").textValue(); String tmpCondition=config.get("condition").textValue(); Element seqFlow=(Element)rootEl.selectSingleNode("/bpm:definitions/bpm:process/bpm:sequenceFlow[@sourceRef='" +sourceNode.getNodeId()+"' and @targetRef='"+tmpNodeId+"']"); if(seqFlow==null) continue; Element conditionExpress=(Element)seqFlow.selectSingleNode("bpm:conditionExpression"); if(conditionExpress==null){ conditionExpress=seqFlow.addElement("conditionExpression"); conditionExpress.addAttribute("xsi:type", "tFormalExpression"); }else{ conditionExpress.clearContent(); } conditionExpress.addCDATA(tmpCondition); } } } //修改流程定义的XML,并且清空该流程定义的缓存 actRepService.doModifyXmlAndClearCache(bpmDef.getActDefId(),bpmDef.getActDepId(), doc.asXML());

回答(2):

ProcessInstancepi=runtimeService.createProcessInstanceQuery()//.processInstanceId(processInstanceId)//使用流程实例ID查询.singleResult();if(pi==null){return"流程结束";}else{return"未结束";}