flowable動態(tài)創(chuàng)建多級流程模板實現(xiàn)demo
更新時間:2023年05月23日 11:15:21 作者:多喝灬丶燙水
這篇文章主要為大家介紹了flowable動態(tài)創(chuàng)建多級流程模板實現(xiàn)demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
flowable動態(tài)創(chuàng)建多級流程模板
引入Maven依賴
<dependency> <groupId>org.flowable</groupId> <artifactId>flowable-spring-boot-starter</artifactId> <version>6.6.0</version> </dependency>
動態(tài)創(chuàng)建流程節(jié)點工具類
/** * 動態(tài)創(chuàng)建流程節(jié)點 */ @Slf4j @Component @RequiredArgsConstructor public class FlowableBpmnHandler { /** * 創(chuàng)建開始節(jié)點信息 * * @return */ public static FlowElement createStartFlowElement(String id, String name) { StartEvent startEvent = new StartEvent(); startEvent.setId(id); startEvent.setName(name); return startEvent; } /** * 創(chuàng)建結束節(jié)點信息 * * @param id * @param name * @return */ public static FlowElement createEndFlowElement(String id, String name) { EndEvent endEvent = new EndEvent(); endEvent.setId(id); endEvent.setName(name); return endEvent; } /** * 循環(huán)創(chuàng)建普通任務節(jié)點信息 * * @param processEntity 流程實體 * @return */ public static List<UserTask> createCommonUserTask(ProcessEntity processEntity) { List<ProcessNode> processNodes = processEntity.getProcessNodeList(); List<UserTask> userTaskList = Lists.newLinkedList(); for (int i = 0; i < processNodes.size(); i++) { ProcessNode node = processNodes.get(i); node.setNodeId(UUIDHelper.randomUUID()); node.setNodeLevel(i + 1); UserTask userTask = new UserTask(); userTask.setId(TypeEnum.getProcessKey(processEntity.getType()) + "_task_" + node.getNodeId()); userTask.setCategory(String.valueOf(i + 1)); userTask.setDocumentation(i == processNodes.size() - 1 ? "true" : "false"); userTask.setName(node.getNodeName()); userTaskList.add(userTask); } return userTaskList; } /** * 創(chuàng)建排它網關節(jié)點 * * @return */ public static ExclusiveGateway createExclusiveGateway(Integer i) { ExclusiveGateway gateway = new ExclusiveGateway(); gateway.setName("getaway_name_" + i); gateway.setId("getaway_id_" + i); return gateway; } }
動態(tài)創(chuàng)建流程模板工具類
/** * 動態(tài)創(chuàng)建流程模板 * * @author ll * @date 2023/04/19 14:28 **/ @Slf4j @Component public class DynamicProcessDefinition { @Resource private RepositoryService repositoryService; public String createProcessDefinition(ProcessEntity processEntity) { //數(shù)據校驗:傳入的數(shù)據節(jié)點字段:流程配置id、節(jié)點id、節(jié)點順序、節(jié)點描述 List<ProcessNode> nodeList = processEntity.getProcessNodeList(); if (CollUtil.isEmpty(nodeList)) { throw new RuntimeException("流程節(jié)點不能少于一個,請配置發(fā)起人節(jié)點和至少一個審批節(jié)點"); } BpmnModel bpmnModel = new BpmnModel(); Process process = new Process(); bpmnModel.addProcess(process); // 流程標識 process.setId(TypeEnum.getProcessKey(processEntity.getType())); process.setName(TypeEnum.getProcessKey(processEntity.getType())); //開始事件 FlowElement startEvent = FlowableBpmnHandler.createStartFlowElement("start", "開始"); process.addFlowElement(startEvent); //結束事件--任務正常完成 FlowElement endEvent = FlowableBpmnHandler.createEndFlowElement("end", "結束"); process.addFlowElement(endEvent); //創(chuàng)建用戶節(jié)點任務 List<UserTask> userTaskList = FlowableBpmnHandler.createCommonUserTask(processEntity); //構建流程模板 buildProcessTemplate(process, startEvent, endEvent, userTaskList); //該流程的流程xml字符串 //BpmnXMLConverter bpmnXMLConverter = new BpmnXMLConverter(); //byte[] convertToXML = bpmnXMLConverter.convertToXML(bpmnModel); //String bytes = new String(convertToXML); //log.info("該流程的流程xml為:{}", bytes); // 創(chuàng)建一個新的部署 Deployment deploy = repositoryService.createDeployment().key(TypeEnum.getProcessKey(processEntity.getType())) .name(TypeEnum.getProcessKey(processEntity.getType())) .addBpmnModel(TypeEnum.getProcessKey(processEntity.getType()) + ".bpmn", bpmnModel) .deploy(); log.info("部署id:{}", deploy.getId()); return deploy.getId(); } /** * 構建流程模板 * * @param process * @param startEvent * @param endEvent * @param userTaskList * @return void * @author ll * @date 2023/04/24 08:53 */ private void buildProcessTemplate(Process process, FlowElement startEvent, FlowElement endEvent, List<UserTask> userTaskList) { for (int i = 0; i < userTaskList.size(); i++) { //用戶任務 UserTask userTask = userTaskList.get(i); process.addFlowElement(userTask); //創(chuàng)建排它網關節(jié)點 ExclusiveGateway exclusiveGateway = FlowableBpmnHandler.createExclusiveGateway(i); process.addFlowElement(exclusiveGateway); //開始事件到第一個節(jié)點 if (i == 0) { // 開始節(jié)點到第一級節(jié)點 SequenceFlow startSequenceFlow = new SequenceFlow(startEvent.getId(), userTask.getId()); process.addFlowElement(startSequenceFlow); } //用戶任務到網關節(jié)點 SequenceFlow sequenceFlow = new SequenceFlow(userTask.getId(), exclusiveGateway.getId()); sequenceFlow.setName(userTask.getName() + "_開始審批"); process.addFlowElement(sequenceFlow); //同意:取下一步用戶任務的節(jié)點id,可能為結束節(jié)點或者用戶任務節(jié)點 String nextUserTaskId = endEvent.getId(); if (userTaskList.size() - i > 1) { nextUserTaskId = userTaskList.get(i + 1).getId(); } SequenceFlow sequenceFlowAgree = new SequenceFlow(exclusiveGateway.getId(), nextUserTaskId); sequenceFlowAgree.setConditionExpression("${auditResult}"); sequenceFlowAgree.setName("同意"); process.addFlowElement(sequenceFlowAgree); //不同意:回退到上一步,取上一步的節(jié)點id String preUserTaskId = userTaskList.get(0).getId(); if (i != 0) { preUserTaskId = userTaskList.get(i - 1).getId(); } SequenceFlow sequenceFlowRefuse = new SequenceFlow(exclusiveGateway.getId(), preUserTaskId); sequenceFlowRefuse.setConditionExpression("${!auditResult}"); sequenceFlowRefuse.setName("拒絕"); process.addFlowElement(sequenceFlowRefuse); } } }
保存流程配置模板的接口
@Resource private DynamicProcessDefinition dynamicProcessDefinition; @RequestMapping("/save") public Result<String> save(@RequestBody ProcessEntity processEntity) { return dynamicProcessDefinition.createProcessDefinition(processEntity);; }
開啟流程接口
@RequestMapping("/start") public String start(@RequestBody AuditData auditData) { //業(yè)務自己定義key String businessKey = auditData.getBusinessKey(); //流程定義key String processKey = auditData.getType(); // 判斷是否啟動流程 boolean isStartProcess = null != runtimeService.createProcessInstanceQuery() .processDefinitionKey(processKey) .processInstanceBusinessKey(businessKey) .singleResult(); if (!isStartProcess) { //記錄開啟流程的用戶 HashMap<String, Object> variable = Maps.newHashMap(); //啟動流程 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processKey, businessKey, variable); log.info("啟動流程實例成功:processInstanceId={}", processInstance.getId()); } return !isStartProcess ? "流程啟動成功" : "流程啟動失敗"; }
以上就是flowable動態(tài)創(chuàng)建多級流程模板demo的詳細內容,更多關于flowable動態(tài)多級流程模板的資料請關注腳本之家其它相關文章!
相關文章
SpringBoot返回多種格式的數(shù)據的實現(xiàn)示例
本文主要介紹了SpringBoot返回多種格式的數(shù)據的實現(xiàn)示例,主要包括了FastJson,xml,pdf,excel,資源流,具有一定的參考價值,感興趣的可以了解一下2021-10-10Java語言實現(xiàn)非遞歸實現(xiàn)樹的前中后序遍歷總結
今天小編就為大家分享一篇關于Java語言實現(xiàn)非遞歸實現(xiàn)樹的前中后序遍歷總結,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-01-01RocketMQ整合SpringBoot實現(xiàn)生產級二次封裝
本文主要介紹了RocketMQ整合SpringBoot實現(xiàn)生產級二次封裝,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-06-06