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配置文件


        
    

 
          

         
        
       
       
         
         
         
         
     
      
          
    
 
      
      
      
      
      
      
    

这里值得注意的是: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 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 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 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")
    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 taskList = taskService.createTaskQuery().taskCandidateGroup(workRole).orderByTaskCreateTime().desc().list();

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

(4)领取任务

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

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

(5)完成任务

Map varMap = new HashMap();
varMap.put("userId", userId);

taskService.complete(taskId, varMap);

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

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


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

你可能感兴趣的:(activiti,工作流)