`
yang_ch
  • 浏览: 80534 次
社区版块
存档分类
最新评论

FoxBPM开源工作流集成系列(二)

阅读更多

先说个抱歉,原来准备自己写个例子,从头到尾介绍集成呢,但是最近工作太忙,没有时间从头到尾一起做,就把原来整理的演示示例的开发过程稍微整理下给大家用作参考。

 

本篇文正主要介绍演示示例中表单的集成,采用的Rest的集成方式,适用于中小型项目使用,大型项目还是建议详细研究后制定集成方案。

 

FoxBPM吸取了5.2开源的经验,对任务命令的前端集成方式做了封装,能让用户不做太多的修改即可方便的集成表单,当然这个是借助FoxBPM-rest包的。

下面介绍集成过程,介绍我分为两部分,一是表单前端集成,二是业务数据处理

 

表单前端集成

  1. pom.xml中添加foxbpm-rest的依赖
    <dependency>
    	<groupId>org.foxbpm</groupId>
    	<artifactId>foxbpm-rest</artifactId>
    	<version>6.0.1-SNAPSHOT</version>
    </dependency>
     
  2. 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> 
     
  3. 拷贝taskCommand文件夹到自己的web项目中,里面是任务命令用到的一些JS和html页面等
  4. 修改service路径,打开foxbpmframework.js,修改service路径,这个路径来自步骤2中配置的service地址,修改bpmFilePath,这个是taskCommand文件夹的路径
  5. 在自己的表单中添加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>
     
  6. 在需要显示按钮的区域加上dom容器 id为toolbar,如<div id="toolbar"></div>,这是告诉插件在哪里绘制按钮,当然这里也可以不是DIV,只要是dom容器就行
  7. 初始化按钮,我的代码如下:

 

$(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字符串
下面看expenseManager的代码
@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)了,我这里还没来得及改。

 

有问题可以随时留言,或者社区讨论。

 

分享到:
评论
3 楼 guocy 2015-11-30  
大哥,看到你这篇文章,就像看到了一盏指路的明灯,可惜结果svn文件是不完整的东西。

能不能更新一下svn呢!
2 楼 bh_nesta 2015-09-17  
6.0版本什么时候出稳定版啊?现在项目中使用6.0的,没问题吧?
1 楼 mupenghaha 2015-02-05  

相关推荐

    Java四大主流开源工作流引擎分析Shark,osworkflow,jbpm,jflow

    本文将深入分析四个主流的开源工作流引擎:Shark、osworkflow、jbpm和jflow。 首先,Shark是Enhydra项目的一部分,Enhydra是一个涵盖广泛的技术栈,包括J2EE应用服务器、对象/关系映射工具以及工作流引擎等。Shark...

    [JWFD开源工作流]JWFD开源工作流-设计器界面二次开发说明(添加工具栏图标)

    本篇主要聚焦于[JWFD开源工作流]的设计器界面的二次开发,特别是如何进行工具栏图标的添加。在深入探讨这个主题之前,我们首先需要理解工作流设计器的基本概念。 工作流设计器是工作流系统的核心组成部分,它允许...

    Java开源工作流引擎.pdf

    Java开源工作流引擎 Java开源工作流引擎是指使用Java语言开发的开源工作流引擎系统,这些系统可以帮助企业或组织自动化业务流程,提高工作效率和效率。以下是多种Java开源工作流引擎的简介: 1. Willow:Willow是...

    jeecg 开源免费版工作流

    Jeecg开源免费版工作流是一款基于Java平台的高效、灵活的企业级工作流管理系统,它集成了Activiti工作流引擎,为企业提供了强大的流程自动化能力。Jeecg致力于简化开发过程,提供快速构建业务系统的能力,同时也注重...

    Silverlight全开源工作流设计器

    在该开源项目中,开发者可以利用VS2012集成开发环境的强大学习资源和调试工具,结合.NET Framework 4.5的改进和新功能,如异步编程模型、Lambda表达式和动态类型等,来构建高效的工作流引擎。工作流设计器通常包括...

    开源工作流的比较和描述

    ### 开源工作流系统概述与对比 在当前信息化迅速发展的时代背景下,工作流技术作为企业自动化管理和业务流程处理的关键组成部分,对于提升组织运作效率、优化业务流程等方面具有重要作用。随着开源文化的兴起,...

    基于Flowable的低代码开源工作流引擎设计源码

    基于Flowable的低代码开源工作流引擎设计源码,该项目包含662个文件,主要文件类型有261个java源文件,229个javascript文件,以及70个css样式文件。此外,还包括59个svg图像文件,8个xml配置文件,以及8个sql数据库...

    flow, 在 go ( golang ) 中,一个小型的开源工作流引擎.zip

    flow, 在 go ( golang ) 中,一个小型的开源工作流引擎 状态flow 正逐步向发布,但还无法使用 ! flowflow 是一个小型开源的( Apache 2 -licensed ) 工作流引擎,它在。什么是 flow作为工作流引擎,flow 打算帮助...

    ccflow5 完整版 国内最有名的开源工作流

    《CCFlow5:国内领先的开源工作流系统详解》 CCFlow5,作为国内知名度最高的开源工作流管理系统,其在IT业界的地位不言而喻。它以其强大的功能、灵活的配置以及友好的用户界面,深受广大开发者和企业的喜爱。本文将...

    netbpm 开源工作流引擎

    **netbpm 开源工作流引擎** 工作流引擎是一种软件系统,它负责自动化业务流程,使得组织能够更高效地管理其日常操作。netbpm 是一个开源的工作流引擎,为开发者提供了一种灵活且可扩展的方式来实现复杂的工作流管理...

    ccflow开源工作流解析

    【ccflow开源工作流解析】 CCFlow是一款基于.NET平台的开源工作流引擎,它提供了强大的工作流设计和执行能力,适合于企业内部的各种流程管理需求。这个开源项目旨在帮助开发者快速构建灵活、可扩展的工作流管理系统...

    改造CCFOLW开源工作流

    综上所述,CCFOLW开源工作流改造是一个多层面、综合性的工程,涵盖工作流引擎优化、UI升级、数据管理改进、作业调度调整、代码重构、SDK更新、客户端与服务端性能优化以及服务集成和脚本更新等多个环节。每个环节都...

    JAVA源码开源工作流系统JWFDJAVA源码开源工作流系统JWFD

    JAVA源码开源工作流系统JWFDJAVA源码开源工作流系统JWFD

    imixs-workflow, 面向业务应用的开源工作流技术.zip

    imixs-workflow, 面向业务应用的开源工作流技术 imixs工作流imixs工作流是一种基于Java企业架构( JEE )的开源工作流引擎。 在imixs工作流项目中,为构建以灵活和健壮的框架为中心的工作流应用。 业务逻辑可以使用...

    SpringBoot集成Activiti完整工作流管理系统源码及SQL

    SpringBoot集成Activiti完整工作流管理系统源码及SQL 包含如下主要内容: 1、工作流完整案例(请假流程、请假会签流程Demo) 2、系统用户权限、工作流用户和用户组管理 3、支持在线流程模型定义、部署、导出。也可用...

    基于java的开源工作流系统 JWFD.zip

    在IT领域,基于Java的开源工作流系统是企业级应用中不可或缺的一部分,它们帮助企业自动化业务流程,提高效率并减少错误。"JWFD"可能是"Java Workflow Director"或类似的缩写,代表一个专为工作流管理设计的Java框架...

    .NET工作流源码架构(100%可用)

    .NET工作流源码架构是一种基于微软.NET框架的高级软件开发技术,用于构建可自定义、可扩展的工作流管理系统。此开源项目提供了100%可用的源代码,开发者可以直接使用或进行二次开发,以满足特定业务流程自动化的需求...

    java资源开源工作流系统JWFDjava资源开源工作流系统JWFD

    java资源开源工作流系统 JWFDjava资源开源工作流系统 JWFD提取方式是百度网盘分享地址

    基于若依开源框架集成钉钉与flowable(一体化人事流程系统)

    若依采用模块化设计,包括权限管理、内容管理、工作流等核心功能,支持前后端分离,提供丰富的API接口,便于开发者进行二次开发。它的特点是易于上手,代码结构清晰,提供了丰富的示例和文档,使得开发人员能够快速...

Global site tag (gtag.js) - Google Analytics