首先引入ACTIVITI工作流引擎,相关教程很多,这里便不再赘述。配置完成后,打开localhost:8002,默认进入首页,点击流程创建便可以在Web端进行流程绘制。
流程创建代码
@GetMapping("/create") public void create(HttpServletResponse response, String name, String key) throws IOException { logger.info("创建模型入参name:{},key:{}", name, key); Model model = repositoryService.newModel(); ObjectNode modelNode = objectMapper.createObjectNode(); modelNode.put(ModelDataJsonConstants.MODEL_NAME, name); modelNode.put(ModelDataJsonConstants.MODEL_DESCRIPTION, ""); modelNode.put(ModelDataJsonConstants.MODEL_REVISION, 1); model.setName(name); model.setKey(key); model.setMetaInfo(modelNode.toString()); repositoryService.saveModel(model); createObjectNode(model.getId()); response.sendRedirect("/editor?modelId=" + model.getId()); logger.info("创建模型结束,返回模型ID:{}", model.getId()); } /** * 创建模型时完善ModelEditorSource * * @param modelId */ @SuppressWarnings("deprecation") private void createObjectNode(String modelId) { logger.info("创建模型完善ModelEditorSource入参模型ID:{}", modelId); ObjectNode editorNode = objectMapper.createObjectNode(); editorNode.put("id", "canvas"); editorNode.put("resourceId", "canvas"); ObjectNode stencilSetNode = objectMapper.createObjectNode(); stencilSetNode.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#"); editorNode.put("stencilset", stencilSetNode); try { repositoryService.addModelEditorSource(modelId, editorNode.toString().getBytes("utf-8")); } catch (Exception e) { logger.info("创建模型时完善ModelEditorSource服务异常:{}", e); } logger.info("创建模型完善ModelEditorSource结束"); }
创建后需要发布将流程压入数据库才能启动和运行,运行时首先遍历流程节点,然后通过feign的方式调用API相关函数,通过路径查询到完整的API信息,然后调用API运行函数运行该API。
@ResponseBody @GetMapping("/publish") public Object publish(String modelId, HttpServletResponse response) { logger.info("流程部署入参modelId:{}", modelId); Map<String, String> map = new HashMap<String, String>(); try { Model modelData = repositoryService.getModel(modelId); byte[] bytes = repositoryService.getModelEditorSource(modelData.getId()); if (bytes == null) { logger.info("部署ID:{}的模型数据为空,请先设计流程并成功保存,再进行发布", modelId); map.put("code", "FAILURE"); return map; } JsonNode modelNode = new ObjectMapper().readTree(bytes); BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode); Deployment deployment = repositoryService.createDeployment() .name(modelData.getName()) .addBpmnModel(modelData.getKey() + ".bpmn20.xml", model) .deploy(); modelData.setDeploymentId(deployment.getId()); repositoryService.saveModel(modelData); map.put("code", "SUCCESS"); response.sendRedirect("/index"); } catch (Exception e) { logger.info("部署modelId:{}模型服务异常:{}", modelId, e); map.put("code", "FAILURE"); } logger.info("流程部署出参map:{}", map); return map; } @ResponseBody @GetMapping("/run") public void runProcessInstance(String modelName, HttpServletResponse response) throws IOException { if (modelName != null) { System.out.println("流程名字:" + modelName); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(modelName); System.out.println("流程id:" + processInstance.getProcessDefinitionId()); // System.out.println("当前活动id:"+processInstance.getActivityId()); // System.out.println("流程实例id:"+processInstance.getDeploymentId()); System.out.println("流程key:" + processInstance.getProcessDefinitionKey()); System.out.println("启动成功"); } else { System.out.println("启动失败"); } response.sendRedirect("/index"); } @ResponseBody @GetMapping("/complete/{modelName}") public CommonResult completeTaskAPI(@PathVariable String modelName) { List<Task> taskList = taskService.createTaskQuery() .processDefinitionKey(modelName) //流程Key .list(); Result r = new Result(); r.setNum(1); if (taskList.size() != 0) { for (Task task : taskList) { System.out.println(task.getId()+"id is"); TaskFormData userTaskFormData = formService.getTaskFormData(task.getId()); List<FormProperty> formProperties = userTaskFormData.getFormProperties(); int formSize = formProperties.size(); if (formSize == 0) {//说明没有参数 commonResult = CompeleteApiAPI(task.getName(), ""); stack.push(commonResult); taskService.complete(task.getId(),var); System.out.println("完成的任务id:" + task.getId()+"任务名字是"+task.getName()); } else { for (FormProperty formProperty : formProperties) { if (formProperty.getId() != null) { commonResult = CompeleteApiAPI(task.getName(), formProperty.getId()); stack.push(commonResult); taskService.complete(task.getId()); System.out.println("完成的任务id:" + task.getId()+"任务名字是"+task.getName()); } else { System.out.println("参数:" + formProperty.getId()); commonResult = CompeleteApiAPI(task.getName(), ""); stack.push(commonResult); taskService.complete(task.getId()); } } } } if (flag == true) { completeTaskAPI(modelName); return commonResult1; } else { System.out.println("出现异常!停止运行!"); return new CommonResult(404,"error",""); } } else { System.out.println("任务结束!"); System.out.println("任务:"+commonResult); return commonResult; } //API运行函数,远程调用API管理模块的相关函数 public boolean CompeleteApi(String apiName, String data) { CommonResult apiData = restTemplate.getForObject(ApiManagerUrl + "/findApiByName/" + apiName, CommonResult.class); System.out.println(apiData); if (apiData.getCode() == 200) { JSONObject jsonObject = new JSONObject(apiData.getData()); String servers = (String) jsonObject.get("servers"); String paths = (String) jsonObject.get("paths"); String url = "http://" + servers + paths; String method = (String) jsonObject.get("methods"); if (!data.equals("")) { // data != null if (method.equals("POST")) { result = ApiPost.interfaceUtil(url, data); } else { System.out.println("参数是:" + data); int url_flag = url.indexOf("{"); System.out.println(url.substring(0, url_flag)); result = ApiComplete.interfaceUtil(url.substring(0, url_flag) + data, ""); } } else { result = ApiComplete.interfaceUtil(url, ""); } modelAndView.addObject("resultSet",result); return true; } else { System.out.println("没有该api"); return false; } } @ResponseBody @GetMapping("/delete") public void deleteProcessInstance(String modelId) { System.out.println(modelId); if (modelId != null) { System.out.println("删除的id为" + modelId); repositoryService.deleteModel(modelId); } else { System.out.println("id为空,无法删除"); } }