先说个抱歉,原来准备自己写个例子,从头到尾介绍集成呢,但是最近工作太忙,没有时间从头到尾一起做,就把原来整理的演示示例的开发过程稍微整理下给大家用作参考。
本篇文正主要介绍演示示例中表单的集成,采用的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)了,我这里还没来得及改。
有问题可以随时留言,或者社区讨论。
相关推荐
笔者主持的开源工作流引擎AgileFlow就是基于ww2+spring+hibernate架构实现的。写到这里我想是不是它可以和struts2进行完美整合?! Jflow是从ccflow演化而来的国产工作流引擎,富有太多的业务场景设置。 Ccflow是...
JWFDv0.96 开源工作流系统-二次开发与API简易说明.doc JWFDv0.96 开源工作流系统-二次开发与API简易说明.doc
VS2012 + Framework4.5 + Silverlight5 写的全开源工作流设计器,里面是个完整的开源项目。
Java开源工作流引擎.pdf
Java开源工作流引擎snaker1.01,非maven版本
java开源工作流项目简介介绍了7种开源工作流项目,致力于集成分布式计算环境,脚本规范、引擎、编辑器一应俱,还比较了各种工作流项目之间的优点和缺点。。。
开源工作流的比较和描述 开源工作流的比较和描述开源工作流的比较和描述开源工作流的比较和描述
jeecg 开源免费版工作流案例,提供给广大用户使用。记得好评
flow, 在 go ( golang ) 中,一个小型的开源工作流引擎 状态flow 正逐步向发布,但还无法使用 ! flowflow 是一个小型开源的( Apache 2 -licensed ) 工作流引擎,它在。什么是 flow作为工作流引擎,flow 打算帮助...
包含表单引擎+流程引擎+权限控制,方便集成,配置灵活,功能强大
NetBpm是个开源的工作流引擎,NetBpm是个开源的工作流引擎,
activiti-5.15开源工作流 官方安装包
NULL 博文链接:https://comsci.iteye.com/blog/2145362
netbpm 开源工作流引擎
JAVA开源工作流,让你了解Java工作流
基于Flowable的低代码开源工作流引擎设计源码,该项目包含662个文件,主要文件类型有261个java源文件,229个javascript文件,以及70个css样式文件。此外,还包括59个svg图像文件,8个xml配置文件,以及8个sql数据库...
开源工作流ACTIVITI使用手册,快速学习activiti.
imixs-workflow, 面向业务应用的开源工作流技术 imixs工作流imixs工作流是一种基于Java企业架构( JEE )的开源工作流引擎。 在imixs工作流项目中,为构建以灵活和健壮的框架为中心的工作流应用。 业务逻辑可以使用...
Alfresco软件在2010年5月17日宣布Activiti业务流程管理(BPM)开源项目的正式启动,其首席架构师由业务流程管理BPM的专家 Tom Baeyens担任。 Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,...
超级有用。