先说个抱歉,原来准备自己写个例子,从头到尾介绍集成呢,但是最近工作太忙,没有时间从头到尾一起做,就把原来整理的演示示例的开发过程稍微整理下给大家用作参考。
本篇文正主要介绍演示示例中表单的集成,采用的Rest的集成方式,适用于中小型项目使用,大型项目还是建议详细研究后制定集成方案。
FoxBPM吸取了5.2开源的经验,对任务命令的前端集成方式做了封装,能让用户不做太多的修改即可方便的集成表单,当然这个是借助FoxBPM-rest包的。
下面介绍集成过程,介绍我分为两部分,一是表单前端集成,二是业务数据处理
表单前端集成
- pom.xml中添加foxbpm-rest的依赖
<dependency> <groupId>org.foxbpm</groupId> <artifactId>foxbpm-rest</artifactId> <version>6.0.1-SNAPSHOT</version> </dependency>
- web.xml中添加rest服务配置
<listener> <listener-class>org.foxbpm.rest.common.listener.FoxBpmRestServletContextListener</listener-class> </listener> <!-- Restlet adapter --> <servlet> <servlet-name>RestletServlet</servlet-name> <servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class> <init-param> <!-- Application class name --> <param-name>org.restlet.application</param-name> <param-value>org.foxbpm.rest.service.application.FoxbpmRestApplication</param-value> </init-param> </servlet> <!-- Catch all requests --> <servlet-mapping> <servlet-name>RestletServlet</servlet-name> <url-pattern>/service/*</url-pattern> </servlet-mapping>
- 拷贝taskCommand文件夹到自己的web项目中,里面是任务命令用到的一些JS和html页面等
- 修改service路径,打开foxbpmframework.js,修改service路径,这个路径来自步骤2中配置的service地址,修改bpmFilePath,这个是taskCommand文件夹的路径
- 在自己的表单中添加JS引用,一共3个js,主意相对路径
<script type="text/javascript" src="../taskCommand/js/foxbpmframework.js"></script> <script type="text/javascript" src="../taskCommand/js/flowCommandCompenent.js"></script> <script type="text/javascript" src="../taskCommand/js/flowCommandHandler.js"></script>
- 在需要显示按钮的区域加上dom容器 id为toolbar,如<div id="toolbar"></div>,这是告诉插件在哪里绘制按钮,当然这里也可以不是DIV,只要是dom容器就行
- 初始化按钮,我的代码如下:
$(document).ready(function() { var _getBizKey = function() { return $("#expenseId").val(); }; var _getTaskComment = function() { return ""; }; var _flowCommit = function(flowInfo) { if (confirm("确定要提交吗?")) { $("#flowCommandInfo").val(JSON.stringify(flowInfo)); $("#form1").submit(); } return false; }; var flowconfig = { getBizKey : _getBizKey, getTaskComment : _getTaskComment, flowCommit : _flowCommit }; var flowCommandCompenent = new Foxbpm.FlowCommandCompenent(flowconfig); flowCommandCompenent.init(); });
代码解释:
- getBizKey():了解fixflow或activiti的用户都应该知道,流程引擎在运转中,只会记录业务数据的关联键(一般是主键),然后通过关联键打开表单,或者找到其他业务数据,在这个报销单例子中,我用主键报销单号作为关联键,所以直接 return $("#expenseId").val();
- getTaskComment():这个方法是获取处理意见,不用多解释,放个文本框让审批者填写处理意见。
- flowCommit(flowInfo):这个是表单的提交动作,flowInfo是foxbpm封装的处理任务需要的参数,这个参数只需要原封不动的交给引擎就可以驱动引擎运转,这个一会我会在业务数据处理部分解释。所以这里,我放了个<input type="hidden" name="flowInfo" id="flowInfo"/>存储这个json字符串,跟随表单一起提交到后台。然后就是$("#form1").submit()触发表单提交。
这时候访问表单,传相应参数就应该能看到效果了如:http://localhost:8080/test/form.html?processDefinitionKey=ProcessTest_ych,就能看到相应的按钮,并能触发相应的事件。
业务数据处理
直接上Controller代码
public void applyExpense(HttpServletResponse response, @ModelAttribute ExpenseEntity expenseEntity, @RequestParam String flowCommandInfo) throws IOException { expenseManager.applyNewExpense(expenseEntity, flowCommandInfo); }
- expenseEntity是报销单实体,用的spring的pojo映射
- flowCommandInfo就是刚才js中flowCommit(flowInfo)中的json字符串
@Transactional public void applyNewExpense(ExpenseEntity expenseEntity,String flowCommandInfo){ expenseDao.saveExpenseEntity(expenseEntity); if(StringUtil.isEmpty(flowCommandInfo)){ throw new RuntimeException("流程命令参数确实,请检查请求参数"); } //调用api执行任务命令 workFlowService.executeTaskCommandJson(flowCommandInfo); }
- 这层也很简单,调用实体DAO层保存报销单实体,然后将flowCommandInfo的json传交给引擎处理
然后看workFlowService代码,这个是我对foxbpm任务命令api做的一个封装,代码如下(可以直接拷过去用),
public void executeTaskCommandJson(String taskCommandJson) { ObjectMapper objectMapper = new ObjectMapper(); JsonNode params = null; try { params = objectMapper.readTree(taskCommandJson); } catch (Exception e) { throw new FoxBPMException("任务命令参数格式不正确",e); } JsonNode taskIdNode = params.get("taskId"); JsonNode commandIdNode = params.get("commandId"); JsonNode processDefinitionKeyNode = params.get("processDefinitionKey"); JsonNode businessKeyNode = params.get("bizKey"); JsonNode taskCommentNode = params.get("taskComment"); // 参数校验 // 命令类型 JsonNode commandTypeNode = params.get("commandType"); JsonNode commandParamsNode = params.get("commandParams"); if (commandTypeNode == null) { throw new FoxBPMException("commandType is null !"); } // 命令Id if (commandIdNode == null) { throw new FoxBPMException("commandId is null !"); } ExpandTaskCommand expandTaskCommand = new ExpandTaskCommand(); expandTaskCommand.setCommandType(commandTypeNode.getTextValue()); // 设置命令的id,需和节点上配置的按钮编号对应,会执行按钮中的脚本。 expandTaskCommand.setTaskCommandId(commandIdNode.getTextValue()); if(taskCommentNode != null){ expandTaskCommand.setTaskComment(taskCommentNode.getTextValue()); } //设置任务命令参数 Map<String,Object> taskParams = new HashMap<String, Object>(); if(commandParamsNode != null){ Iterator<String> it = commandParamsNode.getFieldNames(); while(it.hasNext()){ String tmp = it.next(); taskParams.put(tmp, commandParamsNode.get(tmp).getTextValue()); } } expandTaskCommand.setParamMap(taskParams); if (taskIdNode != null && StringUtil.isNotEmpty(taskIdNode.getTextValue())) { expandTaskCommand.setTaskId(taskIdNode.getTextValue()); } else { String userId = Authentication.getAuthenticatedUserId(); expandTaskCommand.setInitiator(userId); if(businessKeyNode == null){ throw new FoxBPMException("启动流程时关联键不能为null",""); } if(processDefinitionKeyNode == null){ throw new FoxBPMException("启动流程时流程Key不能为null",""); } expandTaskCommand.setBusinessKey(businessKeyNode.getTextValue()); expandTaskCommand.setProcessDefinitionKey(processDefinitionKeyNode.getTextValue()); } taskService.expandTaskComplete(expandTaskCommand, null); }
到这里,业务数据的整合也结束,是不是以前5.2版本中的耦合都被解开了,代码看上去也比较轻松了。
后面我会将workFlowService的方法重载下,可以传变量,这样就可以很方便的传递流程变量了。
仔细看上面的介绍,这次的集成遵循了高内聚,低耦合的原则,尽量少的侵入业务系统的代码。
时间问题,代码和master版本代码稍微 有点冲突,master版本目前将整个表单数据都传递给executTaskComamnd(String formInfo)了,我这里还没来得及改。
有问题可以随时留言,或者社区讨论。
相关推荐
本文将深入分析四个主流的开源工作流引擎:Shark、osworkflow、jbpm和jflow。 首先,Shark是Enhydra项目的一部分,Enhydra是一个涵盖广泛的技术栈,包括J2EE应用服务器、对象/关系映射工具以及工作流引擎等。Shark...
本篇主要聚焦于[JWFD开源工作流]的设计器界面的二次开发,特别是如何进行工具栏图标的添加。在深入探讨这个主题之前,我们首先需要理解工作流设计器的基本概念。 工作流设计器是工作流系统的核心组成部分,它允许...
Java开源工作流引擎 Java开源工作流引擎是指使用Java语言开发的开源工作流引擎系统,这些系统可以帮助企业或组织自动化业务流程,提高工作效率和效率。以下是多种Java开源工作流引擎的简介: 1. Willow:Willow是...
Jeecg开源免费版工作流是一款基于Java平台的高效、灵活的企业级工作流管理系统,它集成了Activiti工作流引擎,为企业提供了强大的流程自动化能力。Jeecg致力于简化开发过程,提供快速构建业务系统的能力,同时也注重...
在该开源项目中,开发者可以利用VS2012集成开发环境的强大学习资源和调试工具,结合.NET Framework 4.5的改进和新功能,如异步编程模型、Lambda表达式和动态类型等,来构建高效的工作流引擎。工作流设计器通常包括...
Java开源工作流项目是开发企业级应用的重要工具,它们提供了自动化业务流程的框架,使得复杂的业务逻辑得以有序、高效地执行。以下是对标题和描述中提及的7种开源工作流项目的详细解读,以及它们在分布式计算环境中...
### 开源工作流系统概述与对比 在当前信息化迅速发展的时代背景下,工作流技术作为企业自动化管理和业务流程处理的关键组成部分,对于提升组织运作效率、优化业务流程等方面具有重要作用。随着开源文化的兴起,...
基于Flowable的低代码开源工作流引擎设计源码,该项目包含662个文件,主要文件类型有261个java源文件,229个javascript文件,以及70个css样式文件。此外,还包括59个svg图像文件,8个xml配置文件,以及8个sql数据库...
flow, 在 go ( golang ) 中,一个小型的开源工作流引擎 状态flow 正逐步向发布,但还无法使用 ! flowflow 是一个小型开源的( Apache 2 -licensed ) 工作流引擎,它在。什么是 flow作为工作流引擎,flow 打算帮助...
本项目是基于Javascript的闲鹿工作流开源工作流管理系统设计源码...该项目是基于RuoYi 4.x、Activiti 6.x、Spring Boot 2.x和Thymeleaf 3.x的开源工作流管理系统,旨在为用户提供一个高效、便捷的工作流管理解决方案。
开源工作流系统 JWFD 是一个基于开放源代码的流程自动化解决方案,旨在帮助企业或组织实现高效、灵活的工作流程管理。在当今数字化转型的时代,工作流系统的应用越来越广泛,它能够优化业务流程,提高工作效率,减少...
《CCFlow5:国内领先的开源工作流系统详解》 CCFlow5,作为国内知名度最高的开源工作流管理系统,其在IT业界的地位不言而喻。它以其强大的功能、灵活的配置以及友好的用户界面,深受广大开发者和企业的喜爱。本文将...
**netbpm 开源工作流引擎** 工作流引擎是一种软件系统,它负责自动化业务流程,使得组织能够更高效地管理其日常操作。netbpm 是一个开源的工作流引擎,为开发者提供了一种灵活且可扩展的方式来实现复杂的工作流管理...
Activiti 是一个强大的、开源的工作流引擎,专为企业的业务流程自动化而设计。在5.15版本中,它提供了一系列先进的特性和功能,帮助企业更有效地管理其业务流程。这个官方安装包包含了所有必要的组件,使得用户能够...
而Flowable是一款开源的工作流和业务流程管理系统,其特点是灵活、可扩展且易于使用,特别适合与Java应用程序集成。 集成Spring Cloud和Flowable的第一步是引入相关依赖。在`pom.xml`文件中,我们需要添加Spring ...
### 开源工作流的比较研究 #### 摘要与背景 本文档提供了一项针对三种主流开源工作流管理系统——jBPM、OpenWFE和Enhydra Shark——的模式评估研究。随着开源软件在业务流程管理(BPM)领域的日益成熟与普及,对...
开源工作流系统CCFOLW是一个用于自动化业务流程的软件框架,它允许开发者根据特定需求定制和部署工作流。在本篇文章中,我们将深入探讨CCFOLW的核心特性、架构以及如何利用其提供的组件来构建高效的工作流解决方案。...
《CCFOLW开源工作流改造详解》 在IT领域,工作流系统是企业信息化建设中的重要组成部分,它帮助企业实现业务流程的自动化管理,提高工作效率。CCFOLW作为一个开源的工作流框架,因其灵活可定制的特点,受到了许多...