activiti工作流

一、activiti工作流简介

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

二、必要的软件

1.JDK 6\+

2.Eclipse Indigo(V3.7) 和 Juno(V4.2)

三、下载

1.activiti下载地址:[http://activiti.org/download.html|http://activiti.org/download.html]

2.Eclipse下载地址: [http://www.eclipse.org/downloads/]

3.JDK下载地址: [http://www.oracle.com/technetwork/java/javase/downloads/index.html]

4.Eclipse安装activiti插件: [http://www.mossle.com/docs/activiti/#eclipseDesignerInstallation]

四、与spring集成

spring配置文件

<bean id="txManager2">
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<property name="sessionFactory" ref="sessionFactory"></property>
&nbsp;&nbsp; &nbsp;</bean>

<bean id="processEngineConfiguration"> &nbsp;
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<property name="dataSource" ref="dataSource"/> &nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <property name="deploymentResources" value="classpath*:/bpmn/*.bpmn"/> &nbsp;
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<property name="createDiagramOnDeploy" value="true" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <property name="activityFontName" value="宋体"/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <property name="labelFontName" value="宋体"/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <property name="transactionManager" ref="txManager2"/> &nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <property name="databaseSchemaUpdate" value="true"/> &nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <property name="jobExecutorActivate" value="false"/> &nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <property name="processDefinitionCacheLimit" value="10"/> &nbsp;
&nbsp;&nbsp; &nbsp;</bean>&nbsp;
&nbsp;&nbsp; &nbsp;<bean id="processEngine"> &nbsp;
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<property name="processEngineConfiguration" ref="processEngineConfiguration" /> &nbsp;
&nbsp;&nbsp; &nbsp;</bean>&nbsp;
&nbsp;&nbsp; &nbsp;<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" /> &nbsp;
&nbsp;&nbsp; &nbsp;<bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" /> &nbsp;
&nbsp;&nbsp; &nbsp;<bean id="formService" factory-bean="processEngine" factory-method="getFormService" /> &nbsp;
&nbsp;&nbsp; &nbsp;<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" /> &nbsp;
&nbsp;&nbsp; &nbsp;<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" /> &nbsp;
&nbsp;&nbsp; &nbsp;<bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" /> &nbsp;
&nbsp;&nbsp; &nbsp;<bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService" />

这里值得注意的是:spring的事务要与activiti的事务同步,所以用了spring的事务。

五、流程图

Eclipse安装完插件后,创建一个activiti项目,右键->New->Project,显示如下:

 !createp.jpg|border=1!
然后点击Next,输入项目名称,Finish.

 !first.jpg|border=1!
创建FirstActiviti的结构如下:
!fst1.jpg|border=1!

在diagrams创建流程。
选中diagrams,右键New->Other,如图:
!QQ截图20150518161857.jpg|border=1!
点击Activiti Diagram,Next,输入名称,MyProgress,Finish,如下图:
!QQ2.jpg|border=1!

制作流程图:
在Palette中,选择StartEvent,拖动到右侧面板中,这样就创建一个开始事件。

!sts1.jpg|border=1!

鼠标放在StartEvent上,会显示出下一步要创建的一些要件,如下:

!QQ截图wwwww.jpg|border=1!
点击上图中红色标记,则创建一个UserTask,如下图:

 !tsssss.jpg|border=1!

!ssss3.jpg|border=1!

在这里,可以设置userTask的Id,Name,以及Form值,Form值设置是这样的:

!1.jpg|border=1!
点击New新建Form属性:

 !2.jpg|border=1!

!3.jpg|border=1!
添加分节节点:
!4.jpg|border=1!
鼠标放在UserTask上,显示下一步要添加的节点,点击红色框中的分支节点,生成分支节点,如下:
!5.jpg|border=1!

分支的下一节点可以加条件,如下:

 !6.jpg|border=1!
这样,在分支的每条flow上可以加上条件,流程会根据条件决定走哪条分支。

然就是结束,如图:

 !7.jpg|border=1!
同样,点击红色框中的图标,结束。
!8.jpg|border=1!
这样,一个简单的流程就结束了。

六、流程操作

1.流程部署

spring中在processEngineConfiguration下添加如下:

<property name="deploymentResources" value="classpath*:/bpmn/*.bpmn"/>

说明:启动服务后,会自动扫描class下bpmn下的所有以.bpmn结尾的文件。

然后,把流程文件xx.bpmn文件拷贝到class下的bpmn包下。


2.启动流程

(1)要在配置文件中添加如下activiti服务:

activiti的服务接口


&nbsp;&nbsp; &nbsp;<bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService" /> &nbsp;
&nbsp;&nbsp; &nbsp;<bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService" /> &nbsp;
&nbsp;&nbsp; &nbsp;<bean id="formService" factory-bean="processEngine" factory-method="getFormService" /> &nbsp;
&nbsp;&nbsp; &nbsp;<bean id="taskService" factory-bean="processEngine" factory-method="getTaskService" /> &nbsp;
&nbsp;&nbsp; &nbsp;<bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" /> &nbsp;
&nbsp;&nbsp; &nbsp;<bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" /> &nbsp;
&nbsp;&nbsp; &nbsp;<bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService" />

(2)启动流程实例


&nbsp;&nbsp;&nbsp; ProcessInstance instance = processEngine.getRuntimeService().startProcessInstanceByKey("myProcess");

这样,流程就被启动了,其中,myProcess为流程创建时我们为其指定的ID,通过instance.getId()可以获取流程实例的ID,保存到业务表中,方便以后操作。

(3)同步业务系统与工作流用户

新增业务系统用户时,同步到工作流中。

引入

Resource(name = "identityService")
&nbsp;&nbsp;&nbsp; private IdentityService identityService;

{code}/**
  * 保存用户信息 并且同步用户信息到activiti的identity.User,同时设置roleId:业务角色
  * @param user
  * @param roleId
  */
 public void saveUser(Admin user, String workRoleId, boolean synToActiviti) {
     String userId = String.valueOf(user.getId());
     if (synToActiviti) {
      //按用户ID查询activiti用户
         List<org.activiti.engine.identity.User> userList = identityService.createUserQuery().userId(userId).list();
         if (userList != null && userList.size() == 1) {
             //更新信息
             org.activiti.engine.identity.User activitiUser = userList.get(0);
             activitiUser.setFirstName(user.getFirstName());
             activitiUser.setLastName(user.getLastName());
             activitiUser.setPassword(user.getPassword());
             activitiUser.setEmail("");
             identityService.saveUser(activitiUser);
             // 删除用户的membership
             List<Group> activitiGroups = identityService.createGroupQuery().groupMember(userId).list();
             for (Group group : activitiGroups) {
                 identityService.deleteMembership(userId, group.getId());
             }
             // 添加membership
             identityService.createMembership(userId, workRoleId);

         } else {
             org.activiti.engine.identity.User newUser = identityService.newUser(userId);
             newUser.setFirstName(user.getFirstName());
             newUser.setLastName(user.getLastName());
             newUser.setPassword(user.getPassword());
             newUser.setEmail("");
             identityService.saveUser(newUser);

             // 添加membership
             long groupNum = identityService.createGroupQuery().groupId(workRoleId).count();
             if(groupNum == 0){
              //创建activiti用户组
              Group group = identityService.newGroup(workRoleId);
              Map<String,String> workRoleMap = WorkFlowRole.getRoleMap();
              //ROLE_MAP.put("1", "角色1");
          //ROLE_MAP.put("2", "角色2");
          //ROLE_MAP.put("3", "角色3");
          group.setName(workRoleMap.get(workRoleId));
          identityService.saveGroup(group);
             }
             identityService.createMembership(userId, workRoleId);
         }
     }
 }{code}

修改用户,删除用户也相应操作。这样,添加用户时,工作流用户也添加了,方便后续操作。
(3)待办事项

引入服务

@Resource(name = "taskService")
&nbsp;&nbsp;&nbsp; private TaskService taskService;
&nbsp;&nbsp; &nbsp;
&nbsp;&nbsp;&nbsp; @Resource(name = "runtimeService")
&nbsp;&nbsp;&nbsp; private RuntimeService runtimeService;
&nbsp;&nbsp; &nbsp;
&nbsp;&nbsp;&nbsp; @Resource(name = "repositoryService")
&nbsp;&nbsp;&nbsp; private RepositoryService repositoryService;
&nbsp;&nbsp; &nbsp;
&nbsp;&nbsp;&nbsp; @Resource(name = "formService")
&nbsp;&nbsp;&nbsp; private FormService formService;
&nbsp;&nbsp; &nbsp;
&nbsp;&nbsp;&nbsp; @Resource(name = "historyService")
&nbsp;&nbsp;&nbsp; private HistoryService historyService;
&nbsp;&nbsp; &nbsp;
&nbsp;&nbsp;&nbsp; @Resource(name = "processEngine")
&nbsp;&nbsp;&nbsp; private ProcessEngine processEngine;

根据候选组ID查询拥有任务
&nbsp;List<Task> taskList = taskService.createTaskQuery().taskCandidateGroup(workRole).orderByTaskCreateTime().desc().list();

获取到当前用户所在组的任务列表。

(4)领取任务

待办事项中,获取到的每个Task,获取taskId,领取任务时会用到
taskService.claim(taskId, admin.getId()+"");

claim方法为领取任务,第一个参数为任务ID,第二个参数为领取任务的人,这里我们使用的是当前登录人的ID。

(5)完成任务

Map<String, Object> varMap = new HashMap<String, Object>();
varMap.put("userId", userId);

taskService.complete(taskId, varMap);

complete方法为完成任务,其中第一参数为任务ID,第二参数为表单中我们创建的form参数,userId,这样userId就被传入到下一节点,方便操作,

如果不需要传参数的话,可以使用taskService.complete(taskId)方法。完成任务后,流程会走到下一节点。


另外附Activiti工作流的用户手册:[http://www.mossle.com/docs/activiti] ,这里有你需要的一些操作,可参考。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值