一、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配置文件
这里值得注意的是: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下添加如下:
说明:启动服务后,会自动扫描class下bpmn下的所有以.bpmn结尾的文件。
然后,把流程文件xx.bpmn文件拷贝到class下的bpmn包下。
2.启动流程
(1)要在配置文件中添加如下activiti服务:
activiti的服务接口
(2)启动流程实例
ProcessInstance instance = processEngine.getRuntimeService().startProcessInstanceByKey("myProcess");
这样,流程就被启动了,其中,myProcess为流程创建时我们为其指定的ID,通过instance.getId()可以获取流程实例的ID,保存到业务表中,方便以后操作。
(3)同步业务系统与工作流用户
新增业务系统用户时,同步到工作流中。
引入
Resource(name = "identityService")
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
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
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
//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")
private TaskService taskService;
@Resource(name = "runtimeService")
private RuntimeService runtimeService;
@Resource(name = "repositoryService")
private RepositoryService repositoryService;
@Resource(name = "formService")
private FormService formService;
@Resource(name = "historyService")
private HistoryService historyService;
@Resource(name = "processEngine")
private ProcessEngine processEngine;
根据候选组ID查询拥有任务
List
获取到当前用户所在组的任务列表。
(4)领取任务
待办事项中,获取到的每个Task,获取taskId,领取任务时会用到
taskService.claim(taskId, admin.getId()+"");
claim方法为领取任务,第一个参数为任务ID,第二个参数为领取任务的人,这里我们使用的是当前登录人的ID。
(5)完成任务
Map
varMap.put("userId", userId);
taskService.complete(taskId, varMap);
complete方法为完成任务,其中第一参数为任务ID,第二参数为表单中我们创建的form参数,userId,这样userId就被传入到下一节点,方便操作,
如果不需要传参数的话,可以使用taskService.complete(taskId)方法。完成任务后,流程会走到下一节点。
另外附Activiti工作流的用户手册:[http://www.mossle.com/docs/activiti] ,这里有你需要的一些操作,可参考。