工作流框架Activiti常用功能初探

Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,诸如互操作性和云架构,提供技术实现。

BPMN是由BPMI(The Business Process Management Initiative)开发了一套标准叫业务流程建模符号(BPMN - Business Process Modeling Notation)BPMN定义了一个业务流程图(Business Process Diagram),该业务流程图基于一个流程图(flowcharting),该流程图被设计用于创建业务流程操作的图形化模型。而一个业务流程模型(Business Process Model),指一个由的图形对象(graphical objects)组成的网状图,图形对象包括活动(acticities)和用于定义这些活动执行顺序的流程控制器(flow controls)。

以下是对Activiti框架几个常用功能的测试。

环境:mysql,eclipse,jdk1.7,activiti5.13

首先将Activiti相关的JAR包导入到项目中,由于JAR众多,这里就不列举了。主要记录代码部分。

1.在eclipse中安装Activiti插件

Help -> InstallNew Software,在如下Install界面板中,点击Add按钮

然后在Name和Location中分别填入如下内容:

Name: Activiti BPMN 2.0 designer

Location: http://activiti.org/designer/update/

然后一直下一步、下一步安装,根据提示重启eclipse


重启后,再打开菜单Windows->Preferences->Activiti->Save下流程流程图片的生成方式



2.配置log4j,让其打印出sql语句

在项目根目录下创建log4j.properties文件,在此文件中输入以下配置信息
### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.err
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:\mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=debug, stdout

3.activiti-context.xml配置activiti

在项目根目录创建 activiti-context.xml文件,在其中配置如下内容
其中的activitiStudy为数据库名,须自己提前创建好。
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
						http://www.springframework.org/schema/beans/spring-beans.xsd
						http://www.springframework.org/schema/context 
						http://www.springframework.org/schema/context/spring-context-2.5.xsd
						http://www.springframework.org/schema/tx 
						http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
	<!-- 配置流程引擎配置对象 -->
	<bean id="processEngineConfiguration"
		class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
		<property name="jdbcDriver" value="com.mysql.jdbc.Driver" />
		<property name="jdbcUrl" value="jdbc:mysql:///activitiStudy?useUnicode=true&characterEncoding=UTF-8"/>
		<property name="jdbcUsername" value="root" />
		<property name="jdbcPassword" value="root" />
		<property name="databaseSchemaUpdate" value="true" />
	</bean>

	<!-- 配置一个流程引擎工厂bean,用于创建流程引擎对象 -->
	<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
		<!-- 通过set方法注入流程引擎配置对象 -->
		<property name="processEngineConfiguration" ref="processEngineConfiguration" />
	</bean>
</beans>

4.画流程图

在项目中,在项目根目录下,点击new->other->选择Activiti下的Activiti Diagram新建一个流程图。

在其中画如下图示

并设好相关属性



5.Activiti测试代码

import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.DeploymentBuilder;
import org.activiti.engine.repository.DeploymentQuery;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.runtime.ProcessInstanceQuery;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.apache.commons.io.FileUtils;
import org.junit.Test;

/**
 * 使用Activiti框架的API操作流程
 * 
 * @author PuHaiyang
 * @createTime 2016年6月28日 下午4:50:39
 * @email 761396462@qq.com
 * @function Activiti基本功能测试
 *
 */
public class MyActivitiAPITest {
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

	@Test
	public void deployActiviti() {
		// 如果之前没有创建activiti相关的表,调用它会自动创建,由activiti-context.xml文件内容创建
		DeploymentBuilder deploymentBuilder = processEngine.getRepositoryService().createDeployment();
		deploymentBuilder.addClasspathResource("MyTest.bpmn");
		deploymentBuilder.addClasspathResource("MyTest.png");
		deploymentBuilder.name("i_am_name");
		Deployment deploy = deploymentBuilder.deploy();
		System.out.println(deploy.getId());
		// 部署信息表 insert into ACT_RE_DEPLOYMENT(ID_, NAME_, CATEGORY_,
		// DEPLOY_TIME_) values(?, ?, ?, ?)
		// 二进制数据表,bpmn文件插入 insert into ACT_GE_BYTEARRAY(ID_, REV_, NAME_,
		// BYTES_, DEPLOYMENT_ID_, GENERATED_) values (?, 1, ?, ?, ?, ?)
		// 二进制数据表,png文件插入 insert into ACT_GE_BYTEARRAY(ID_, REV_, NAME_, BYTES_,
		// DEPLOYMENT_ID_, GENERATED_) values (?, 1, ?, ?, ?, ?)
		// 流程定义数据表 insert into ACT_RE_PROCDEF(ID_, REV_, CATEGORY_, NAME_, KEY_,
		// VERSION_, DEPLOYMENT_ID_, RESOURCE_NAME_, DGRM_RESOURCE_NAME_,
		// DESCRIPTION_, HAS_START_FORM_KEY_, SUSPENSION_STATE_) values (?, 1,
		// ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
	}

	/**
	 * 查询部署列表
	 */
	@Test
	public void queryDeployment() {
		DeploymentQuery deploymentQuery = processEngine.getRepositoryService().createDeploymentQuery();
		List<Deployment> list = deploymentQuery.list();
		for (Deployment deployment : list) {
			String id = deployment.getId();
			System.out.println(id);
		}
	}

	/**
	 * 删除部署信息
	 */
	@Test
	public void deleteDeployment() {
		String deploymentId = "1";
		// 第二个参数代表级联操作
		processEngine.getRepositoryService().deleteDeployment(deploymentId, true);
		// 删除所有相关的activiti信息
	}

	/**
	 * 查询一次部署对应的流程定义文件名称和对应的输入流(bpmn png)
	 * 
	 * @throws Exception
	 */
	@Test
	public void queryDeploymentResource() throws Exception {
		String deploymentId = "101";
		List<String> names = processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId);
		for (String name : names) {
			System.out.println(name);
			InputStream in = processEngine.getRepositoryService().getResourceAsStream(deploymentId, name);
			// 将文件保存到本地磁盘
			// FileUtils来自commons-io-xxx.jar
			FileUtils.copyInputStreamToFile(in, new File("d:\\" + name));
			in.close();
		}
	}

	/**
	 * 获得流程表中流程图
	 * 
	 * @throws Exception
	 */
	@Test
	public void getProcessDiagream() throws Exception {
		String processDefinitionId = "myProcess:1:104";
		InputStream pngInputStream = processEngine.getRepositoryService().getProcessDiagram(processDefinitionId);
		FileUtils.copyInputStreamToFile(pngInputStream, new File("d:\\my.png"));
	}

	/**
	 * 启动流程实例 <br>
	 * 方式一:根据流程定义的id启动 <br>
	 * 方式二:根据流程定义的key启动(自动选择最新版本的流程定义启动流程实例)
	 */
	@Test
	public void startProcess() {
		/*
		 * 方式一:根据流程定义的id启动 String processDefinitionId = "myProcess:1:104";
		 * ProcessInstance processInstance =
		 * processEngine.getRuntimeService().startProcessInstanceById
		 * (processDefinitionId ); System.out.println(processInstance.getId());
		 */

		// 方式二:根据流程定义的key启动(自动选择最新版本的流程定义启动流程实例)
		String processDefinitionKey = "myProcess";
		ProcessInstance processInstance = processEngine.getRuntimeService()
				.startProcessInstanceByKey(processDefinitionKey);
		System.out.println(processInstance.getId());
		// 调用SQL语句如下
		// 1 ACT_RU_EXECUTION 运行时流程执行实例表
		// insert into ACT_RU_EXECUTION (ID_, REV_, PROC_INST_ID_,
		// BUSINESS_KEY_, PROC_DEF_ID_, ACT_ID_, IS_ACTIVE_, IS_CONCURRENT_,
		// IS_SCOPE_,IS_EVENT_SCOPE_, PARENT_ID_, SUPER_EXEC_,
		// SUSPENSION_STATE_, CACHED_ENT_STATE_) values ( ?, 1, ?, ?, ?, ?, ?,
		// ?, ?, ?, ?, ?, ?, ? )

		// 2 ACT_HI_PROCINST 历史流程实例表
		// insert into ACT_HI_PROCINST ( ID_, PROC_INST_ID_, BUSINESS_KEY_,
		// PROC_DEF_ID_, START_TIME_, END_TIME_, DURATION_, START_USER_ID_,
		// START_ACT_ID_, END_ACT_ID_, SUPER_PROCESS_INSTANCE_ID_,
		// DELETE_REASON_ ) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )

		// 3 ACT_HI_ACTINST 历史节点表
		// insert into ACT_HI_ACTINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_,
		// EXECUTION_ID_, ACT_ID_, TASK_ID_, CALL_PROC_INST_ID_, ACT_NAME_,
		// ACT_TYPE_, ASSIGNEE_, START_TIME_, END_TIME_, DURATION_ ) values ( ?,
		// ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )

		// 4 ACT_HI_ACTINST 历史节点表
		// insert into ACT_HI_ACTINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_,
		// EXECUTION_ID_, ACT_ID_, TASK_ID_, CALL_PROC_INST_ID_, ACT_NAME_,
		// ACT_TYPE_, ASSIGNEE_, START_TIME_, END_TIME_, DURATION_ ) values ( ?,
		// ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )

		// 5 ACT_RU_TASK 运行时任务节点表
		// insert into ACT_RU_TASK (ID_, REV_, NAME_, PARENT_TASK_ID_,
		// DESCRIPTION_, PRIORITY_, CREATE_TIME_, OWNER_, ASSIGNEE_,
		// DELEGATION_, EXECUTION_ID_, PROC_INST_ID_, PROC_DEF_ID_,
		// TASK_DEF_KEY_, DUE_DATE_, SUSPENSION_STATE_) values (?, 1, ?, ?, ?,
		// ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )

		// 6 ACT_HI_TASKINST 历史任务实例表
		// insert into ACT_HI_TASKINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_,
		// EXECUTION_ID_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, OWNER_,
		// ASSIGNEE_, START_TIME_, CLAIM_TIME_, END_TIME_, DURATION_,
		// DELETE_REASON_, TASK_DEF_KEY_, FORM_KEY_, PRIORITY_, DUE_DATE_ )
		// values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )

		// 7 ACT_RU_IDENTITYLINK 运行时流程人员表,主要存储任务节点与参与者的相关信息
		// insert into ACT_RU_IDENTITYLINK (ID_, REV_, TYPE_, USER_ID_,
		// GROUP_ID_, TASK_ID_, PROC_INST_ID_, PROC_DEF_ID_) values (?, 1, ?, ?,
		// ?, ?, ?, ?)

		// 8 ACT_HI_IDENTITYLINK 历史流程人员表
		// insert into ACT_HI_IDENTITYLINK (ID_, TYPE_, USER_ID_, GROUP_ID_,
		// TASK_ID_, PROC_INST_ID_) values (?, ?, ?, ?, ?, ?)

	}

	/**
	 * 查询流程实例列表,查询act_ru_execution表
	 */
	@Test
	public void queryRuntimeProcess() {
		// 流程实例查询对象,查询act_ru_execution表
		ProcessInstanceQuery query = processEngine.getRuntimeService().createProcessInstanceQuery();
		query.processDefinitionKey("myProcess");
		query.orderByProcessInstanceId().desc();
		query.listPage(0, 2);
		List<ProcessInstance> list = query.list();
		for (ProcessInstance pi : list) {
			System.out.println(pi.getId() + " " + pi.getActivityId());
		}
	}

	/**
	 * 不通过<br>
	 * 删除流程实例
	 */
	@Test
	public void deleteProcess() {
		String processInstanceId = "201";
		processEngine.getRuntimeService().deleteProcessInstance(processInstanceId, "不准逃课!");

		// 执行删除部分SQL如下
		// 1 ACT_RU_TASK 运行时任务节点表
		// delete from ACT_RU_TASK where ID_ = ? and REV_ = ?

		// 2 ACT_RU_IDENTITYLINK 运行时流程人员表,主要存储任务节点与参与者的相关信息
		// delete from ACT_RU_IDENTITYLINK where ID_ = ?

		// 3 ACT_RU_EXECUTION 运行时流程执行实例表
		// delete from ACT_RU_EXECUTION where ID_ = ? and REV_ = ?

		// 执行更新部分SQL如下
		// 1 ACT_HI_PROCINST 历史流程实例表
		// update ACT_HI_PROCINST set PROC_DEF_ID_ = ?, START_TIME_ = ?,
		// END_TIME_ = ?, DURATION_ = ?, END_ACT_ID_ = ?, DELETE_REASON_ = ?
		// where ID_ = ?

		// 2 ACT_HI_ACTINST 历史节点表
		// update ACT_HI_ACTINST set EXECUTION_ID_ = ?, ASSIGNEE_ = ?, END_TIME_
		// = ?, DURATION_ = ? where ID_ = ?

		// 3 ACT_HI_TASKINST 历史任务实例表
		// update ACT_HI_TASKINST set EXECUTION_ID_ = ?, NAME_ = ?,
		// PARENT_TASK_ID_ = ?, DESCRIPTION_ = ?, OWNER_ = ?, ASSIGNEE_ = ?,
		// CLAIM_TIME_ = ?, END_TIME_ = ?, DURATION_ = ?, DELETE_REASON_ = ?,
		// TASK_DEF_KEY_ = ?, FORM_KEY_ = ?, PRIORITY_ = ?, DUE_DATE_ = ? where
		// ID_ = ?
	}

	/**
	 * 查询任务
	 */
	@Test
	public void queryTask() {
		// 任务查询对象,查询act_ru_task表
		TaskQuery query = processEngine.getTaskService().createTaskQuery();
		String assignee = "班主任";
		query.taskAssignee(assignee);
		query.orderByTaskCreateTime().desc();
		List<Task> list = query.list();
		for (Task task : list) {
			System.out.println(task.getId());
		}
		// 执行sql如下
		// 1 ACT_GE_PROPERTY 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录,
		// select * from ACT_GE_PROPERTY where NAME_ = ?

		// 2 ACT_RU_TASK 运行时任务节点表
		// select distinct RES.* from ACT_RU_TASK RES WHERE RES.ASSIGNEE_ = ?
		// order by RES.CREATE_TIME_ desc LIMIT ? OFFSET ?
	}

	/**
	 * 处理任务
	 */
	@Test
	public void completeTask() {
		String taskId = "304";
		processEngine.getTaskService().complete(taskId);

		// 执行的主要SQL如下
		// 1 ACT_GE_PROPERTY 属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录
		// update ACT_GE_PROPERTY SET REV_ = ?, VALUE_ = ? where NAME_ = ? and
		// REV_ = ?

		// 2 ACT_HI_ACTINST 历史节点表
		// insert into ACT_HI_ACTINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_,
		// EXECUTION_ID_, ACT_ID_, TASK_ID_, CALL_PROC_INST_ID_, ACT_NAME_,
		// ACT_TYPE_, ASSIGNEE_, START_TIME_, END_TIME_, DURATION_ ) values ( ?,
		// ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )

		// 3 ACT_RU_TASK 运行时任务节点表
		// insert into ACT_RU_TASK (ID_, REV_, NAME_, PARENT_TASK_ID_,
		// DESCRIPTION_, PRIORITY_, CREATE_TIME_, OWNER_, ASSIGNEE_,
		// DELEGATION_, EXECUTION_ID_, PROC_INST_ID_, PROC_DEF_ID_,
		// TASK_DEF_KEY_, DUE_DATE_, SUSPENSION_STATE_) values (?, 1, ?, ?, ?,
		// ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )

		// 4 ACT_HI_TASKINST 历史任务实例表
		// insert into ACT_HI_TASKINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_,
		// EXECUTION_ID_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, OWNER_,
		// ASSIGNEE_, START_TIME_, CLAIM_TIME_, END_TIME_, DURATION_,
		// DELETE_REASON_, TASK_DEF_KEY_, FORM_KEY_, PRIORITY_, DUE_DATE_ )
		// values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )

		// 5 ACT_RU_IDENTITYLINK 运行时流程人员表,主要存储任务节点与参与者的相关信息
		// insert into ACT_RU_IDENTITYLINK (ID_, REV_, TYPE_, USER_ID_,
		// GROUP_ID_, TASK_ID_, PROC_INST_ID_, PROC_DEF_ID_) values (?, 1, ?, ?,
		// ?, ?, ?, ?)

		// 6 ACT_HI_IDENTITYLINK 历史流程人员表
		// insert into ACT_HI_IDENTITYLINK (ID_, TYPE_, USER_ID_, GROUP_ID_,
		// TASK_ID_, PROC_INST_ID_) values (?, ?, ?, ?, ?, ?)

		// 7 ACT_HI_TASKINST 历史任务实例表
		// update ACT_HI_TASKINST set EXECUTION_ID_ = ?, NAME_ = ?,
		// PARENT_TASK_ID_ = ?, DESCRIPTION_ = ?, OWNER_ = ?, ASSIGNEE_ = ?,
		// CLAIM_TIME_ = ?, END_TIME_ = ?, DURATION_ = ?, DELETE_REASON_ = ?,
		// TASK_DEF_KEY_ = ?, FORM_KEY_ = ?, PRIORITY_ = ?, DUE_DATE_ = ? where
		// ID_ = ?

		// 8 ACT_RU_EXECUTION 运行时流程执行实例表
		// update ACT_RU_EXECUTION set REV_ = ?, PROC_DEF_ID_ = ?, ACT_ID_ = ?,
		// IS_ACTIVE_ = ?, IS_CONCURRENT_ = ?, IS_SCOPE_ = ?, IS_EVENT_SCOPE_ =
		// ?, PARENT_ID_ = ?, SUPER_EXEC_ = ?, SUSPENSION_STATE_ = ?,
		// CACHED_ENT_STATE_ = ? where ID_ = ? and REV_ = ?

		// 9 ACT_HI_ACTINST 历史节点表
		// update ACT_HI_ACTINST set EXECUTION_ID_ = ?, ASSIGNEE_ = ?, END_TIME_
		// = ?, DURATION_ = ? where ID_ = ?

		// 10 ACT_RU_TASK 运行时任务节点表
		// delete from ACT_RU_TASK where ID_ = ? and REV_ = ?

	}

	/**
	 * 直接将流程向下执行一步
	 */
	@Test
	public void signal() {
		String executionId = "301";// 流程实例id
		processEngine.getRuntimeService().signal(executionId);
	}

	/**
	 * 查询最新版本的流程定义列表
	 */
	@Test
	public void getLastTasks() {
		ProcessDefinitionQuery query = processEngine.getRepositoryService().createProcessDefinitionQuery();
		query.orderByProcessDefinitionVersion().asc();
		List<ProcessDefinition> list = query.list();
		Map<String, ProcessDefinition> map = new HashMap<String, ProcessDefinition>();
		for (ProcessDefinition pd : list) {
			map.put(pd.getKey(), pd);
		}
		ArrayList<ProcessDefinition> lastList = new ArrayList<>(map.values());
		for (ProcessDefinition processDefinition : lastList) {
			System.out.println(processDefinition.getName() + "  " + processDefinition.getVersion());
		}
	}
}



  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
宏天BPM X3软件平台是一个易于部署和使用的新一代业务程管理平台,能够以最快的速度帮助您梳理、设计、执行、监控分析和优化业务程,从业务和IT相结合的完美视角为用户组建长期而久远的卓越BPM程管 理架构。通过实施BPM方案让您的企业在运营效率、透明度、控制力和敏捷性方面迅速受益。 BPMX3是基于J2EE开源、轻量级的企业业务开发平台,基于代码重用、组件重用、业务逻辑重用、组装重用,结合快速开发平台中的工具,将开发人员从重复的代码编写中解放出来,把更多的精力集中解决客户的业务逻辑处理上。 BPMX3是支持程管理、监控、优化、再造的全套IT管理开发平台,并且集单点登录、企业单位门户、业务程管理、开发、整合、业务分析及重构等多重职能于一身的软件开发工具和企业IT架构平台。 BPMX3是企业管理业务的创新关键,可以帮忙用户更科学、更有效管理企业业务的各个环节,企业通过BPMX3可以明显实现业务的高效运营。同时,由于其架构的开放性,采用业界开放性的技术及程标准,使其能够成为企业SOA架构的程基础平台及开发平台,越来越多的企业更偏向采用开源的平台来解决其内部的信息化平台的要求,BPMX3却允许更多的平台系统接入及自身扩展更多的功能,以满足更多的企业不同的个性化的需求,以达到最大满足最终的客户使用要求。 【图一】工作引擎中心 1.BPMX3的特点 1.是一个开放式、轻量级的开发平台 2.BPMX3多层系统架构 3.基于模板代码生成 4.丰富的报表展示 5.跨数据库的数据访问支持 6.简易的前端使用 7.参照最新的BPMN2标准设计 8.满足中国特色程需求 9.在线的可视化程设计、可视化的程监控 10.完全独立的程引擎服务,可与其他系统无缝集成 11.基于行的JAVA 程引擎Activiti 5.8扩展 12.灵活的在线程定义 13.灵活的嵌入式部署、独立部署 14.灵活的在线表单定义及版本管理(支持按内表及外部表及视图生成表单) 15.灵活的第三方表单集成 16.开放式的程体系 17.灵活的组织结构支持 18.程的导入与导出 19.子程支持 20.程任务逐步回退处理(任务追回及多驳回 ) 21.程自由跳转 22.程跳转业务规则设置 23.多级分发任务与任务汇总 24.会签(并行与串行)、补签及投票处理 25.程版本变更管理 26.程催办(基于MQ短信及邮件设置) 27.程任务的工作日设置(用于统计程任务执行效率) 28.任务监控管理 29.程委办、转办 2.BPMX3多层架构 系统采用多层的系统架构进行功能开发,有利于代码功能责任分开,同时有利于不同开发人员的分工及合作,也有利于代码的单元测试。系统总体结构如下图所示: 【图二】BPMX3多层架构 •数据访问层Dao: 负责与数据库交互 •业务处理层Service: 负责系统的所有业务逻辑处理 •数据控制层Controller: 负责系统的页面数据准备及跳转处理 •视图层View :负责数据的展示处理 整合的开源技术 1.Spring Core 3.0.4 2.Spring MVC 3.0 3.Spring Security 3.0.5 4.Spring AOP 3.0.4 5.Apache Active MQ 5.5 6.MyBatis 3 7.CKEditor 3.6 8.JQuery 1.8 9.CXF 2.0 10.Alfresco Activiti 5.8 11.Compass + Lucene 12.JasperReport 4.5 13.JavaMail 14.Other: Log4j,Velocity,Sitemesh,Jfreechart,Jforum,Solr 15.Maven 2 3.BPMX3的组件构建方式 BPMX3同时也是基于组件构构建,整个系统的构建如下所示: 【图三】BPMX3组件构建 系统提供在线程设计器,在线表单设计器,代码生成器,结合BPMX3的基础组件,以实现复杂的程业务应用。基础组件包括: Spring基础组件库,报表引擎,数据库访问模块,短信模块,后台定时任务调用组件,短信访问组件,搜索引擎组件,JMS消息组件,Activiti工作组件,Cas统一用户认证组件,Spring安全认证组件。 4.BPMX3总体功能 1.多系统管理 BPMX3支持多个业务系统同时运行及切换处理,根据不同的用户授权允许用户进入不同的系统进行访问,而不同的业务系统的开发可以基于BPMX3平台上开发,也可以由其他开发框架开发再与BPMX3做整合。这种模式非常适合企业把BPMX3作为其内部的首先开发平台,以使后续的新应用系统都整合在一起进行管理及使用。 【图四】多系统管理 2.用户管理 BPMX3提供多种维度的用户人员管理,以支持各种类型的组织机构及人员的统一管理,目前可以支持内部组织、外部组织 、虚拟组织。而且还提供用户的属性自定义,允许对用户进行多种属性的扩展,以支持工作中的任务节点的人员的复杂查找计算。 3.系统安全管理 系统的安全管理由Spring Security 3提供配置及管理,非常容易与第三方的用户或认证平台进行整合,如与CAS服务器作统一认证,只需要加上新的配置模块即可实现,不影响系统现有的功能模块。大大满足了各种不同系统的安全管理认证的需要。 同时系统可以支持URL访问权限、数据权限、列权限及页面按钮权限的统一配置管理。系统的安全认证机制如下所示: 【图五】系统安全拦截原理 4.动态表单管理 BPMX3提供了基于数据库内部表、外部表、视图等来生成在线的程表单的功能,其生成是基于模板,模板可由开发人员进行自定义,也可以采用BPMX3提供的默认模板。生成的表单后,系统管理员还可以对表单进行编辑管理以实现企业的业务要求,其中,还允许开发人员在表单上编写编写脚本,以实现更复杂的应用。 表单上支持系统中的大量组件,如角色选择,用户选择,角色选择,在线表单,套红在线Office表单,签章表单等。系统开发人员几乎不用作任何开发,可以设计出任何复杂的表单应用需求。 表单上支持系统中的大量组件,如角色选择,用户选择,角色选择,在线表单,套红在线Office表单,签章表单等。系统开发人员几乎不用作任何开发,可以设计出任何复杂的表单应用需求。 【图六】在线动态表单 5.程管理 BPMX3提供了基于BPMN2标准的程管理,包括程版本变量,程节点表单设置,表单的权限设置,程任务通知,催办,代办,转化,并行会签、串行会签、补签,子程,同步任务,多实例任务,人工任务、消息任务、邮件任务等,任务多级分发与汇总、任务追回、任务层层驳回,任务自由跳转等中国特色的程需求。能满足企业复杂的程应用需求。 BPMX3在程管理上,不但能结合在线设计的复杂表单,还能结合本系统或其他系统其他模块的功能表单一起进行业务审批的工作。这大大方便了业务程在所有的系统中进行程开发的工作,简化了以往开发程业务的代码固死的做法,把程序员或业务员真正从程业务中解放出来。 【图七】在线程管理 【图八】在线程设计 6.报表管理 系统的报表管理是基于模板来进行设置管理的,目前支持FineReport及Jasper Report两种报表引擎,前者是商业报表,其功能非常强大,可以实现多样式数据呈现方式,支持HTML、PDF、EXCEL、Word、TXT、Flash样式呈,能完美解决中国式报表难题,无论数据库内原始数据是以何种样式的表结构存储,无论最终用户要求数据以何种表格样式显示,FineReport报表软件独创的多数据源关联查询、公式动态扩展计算等强大的功能,在无需改变表结构,无需改变用户的要求的基础上,完全按照用户的需求制作出报表模板。 【图九】报表管理 7.系统基础组件 系统的基础组件如用户模块一样,是系统的业务功能的基础,在其他业务模块中被大量使用。 ◦定时任务管理 通过配置以实现某时刻重复执行的系统任务,如配置每月最后一天进行库存清算任务,并且启动库存清算审批程。 ◦系统日志管理 记录进入系统中的每个用户访问的每个功能 ◦数据源管理 可以设置多种数据源,为在线表单设计及展示提供数据来源 ◦资源管理 管理系统的所有资源,包括URL,业务方法等,提供给安全管理进行极限配置 ◦水号管理 用于产生业务的一些处理水单号 ◦数据字典管理 用于管理所有的业务中常用的数据字典的数据 ◦附件管理 管理系统中所有的上传附件。 ◦桌面管理 管理用户的桌面布局及常用功能展示 ◦邮件、短信模板管理 用于配置系统的发送邮件、短信的模板 ◦工作日历管理 用于配置系统的工作的待办事项的处理工作时间的计算处理 ◦动态脚本管理 用于为程任务节点或事件中可被调用的逻辑计算代码 ◦短信收发管理 基于USB短信猫的短信模块或短信网关,以实现收发手机短信功能。 ◦外部邮件管理 支持POP3,IMap协议的邮件服务收发功能,允许用户设置多个外部邮箱。 ◦内部短消息收发管理 在系统中用户之间可以收发短消息,如工作任务的通知也采用短消息进行实时提醒。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

水中加点糖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值