用户与组以及流程部署

用户和组

Activiti内置了一套相对简单的对用户和组的支持,可以满足基本的业务需求。其中,组可以理解为我们常说的角色,和用户的关系是多对对。

用户

先看一个例子:

@Rule
    public ActivitiRule activitiRule = new ActivitiRule();

    /**
     * activiti  保存用户
     */
    @Test
    public void testUser() {

        IdentityService identityService = activitiRule.getIdentityService();

        User user = identityService.newUser("1");

        user.setFirstName("xi");
        user.setLastName("yu");

        identityService.saveUser(user);

        User userdb = identityService.createUserQuery().userId("1").singleResult();

        System.out.println(userdb);

        identityService.deleteUser("1");

        User user1 = identityService.createUserQuery().userId("1").singleResult();

        System.out.println(user1);
    }

上面的代码块就是创建一个简单的用户,以及查询一个用户和删除一个用户,activiti都给我们提供好了现成的api.

来看一个组的例子

@Test
    public void testGroup() {

        IdentityService identityService = activitiRule.getIdentityService();

        Group group = identityService.newGroup("dept");
        group.setId("dept1");
        group.setName("leader");

        identityService.saveGroup(group);

        Group group1 = identityService.createGroupQuery().groupId("dept1").singleResult();

        identityService.deleteGroup("dept1");

        Group group2 = identityService.createGroupQuery().groupId("dept1").singleResult();
    }

基本和用户的用法类似

用户和组的关系

了解了用户,也了解了组,现在我们要做的就是把用户和组联系起来。

 @Test
    public void testMemberShip() {

        IdentityService identityService = activitiRule.getIdentityService();

        Group group = identityService.newGroup("dept");
        group.setId("dept1");
        group.setName("leader");
        identityService.saveGroup(group);

        User user = identityService.newUser("1");
        user.setFirstName("xi");
        user.setLastName("yu");
        identityService.saveUser(user);

        identityService.createMembership("1", "dept1");

        User groupUser = identityService.createUserQuery().memberOfGroup("dept1").singleResult();

        System.out.println(groupUser);

        Group group1 = identityService.createGroupQuery().groupMember("1").singleResult();

        System.out.println(group1);
    }

主要的代码就是:identityService.createMembership("1", "dept1"); 建立用户和组的关系。

用户任务中的用户和组

用户和组有了关系,现在应该把这个关系扩展到实际的应用当中,所谓的实际应用也就是一个个任务。

候选组

先来看一个简单的流程:
先看一下xml 配置



  
    
    
    
    
    
  
  
    
      
        
        
          
        
      
      
        
        
          
        
      
      
        
        
          
        
      
      
        
        
        
          
        
      
      
        
        
        
          
        
      
    
  

对于的流程图:


image.png

对应对代码:

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = Application.class)
public class AbstractTest {
    @Rule
    public ActivitiRule activitiRule = new ActivitiRule();
    IdentityService identityService;
    RuntimeService runtimeService;
    TaskService taskService;

    @Test
    public void test() {

        identityService = activitiRule.getIdentityService();
        runtimeService = activitiRule.getRuntimeService();
        taskService = activitiRule.getTaskService();
    }
}

public class UserGroupTest extends AbstractTest {

    @Before
    public void setUp() {
        super.test();
        Group group = identityService.newGroup("dept1");
        group.setId("dept1");
        group.setType("assignment");
        group.setName("leader");
        identityService.saveGroup(group);

        User user = identityService.newUser("1");
        user.setFirstName("xi");
        user.setLastName("yu");
        identityService.saveUser(user);

        identityService.createMembership("1", "dept1");

        User groupUser = identityService.createUserQuery().memberOfGroup("dept1").singleResult();
        System.out.println(groupUser);

        Group group1 = identityService.createGroupQuery().groupMember("1").singleResult();
        System.out.println(group1);

    }

    @After
    public void afterDeal() {
        identityService.deleteMembership("1", "dept1");
        identityService.deleteUser("1");
        identityService.deleteGroup("dept1");
    }

    @Test
    @Deployment(resources = {"user.bpmn"})
    public void testUserTask() {

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("user");

        System.out.println(processInstance);

        Task task = taskService.createTaskQuery().taskCandidateUser("1").singleResult();

        taskService.claim(task.getId(), "1");

        taskService.complete(task.getId());
    }
}

关键的代码: Task task = taskService.createTaskQuery().taskCandidateUser("1").singleResult();
taskService.claim(task.getId(), "1"); 这行代码的含义是,ID为1的用户签收了这个任务。

候选人

候选人和候选组类似
对于的xml



  
    
    
    
    
    
  
  
    
      
        
        
          
        
      
      
        
        
          
        
      
      
        
        
          
        
      
      
        
        
        
          
        
      
      
        
        
        
          
        
      
    
  

对应的代码:


    @Before
    public void setUp() {
        super.test();
        Group group = identityService.newGroup("dept1");
        group.setId("dept1");
        group.setType("assignment");
        group.setName("leader");
        identityService.saveGroup(group);

        User user = identityService.newUser("1");
        user.setFirstName("xi");
        user.setLastName("yu");
        identityService.saveUser(user);

        identityService.createMembership("1", "dept1");

        User groupUser = identityService.createUserQuery().memberOfGroup("dept1").singleResult();
        System.out.println(groupUser);

        Group group1 = identityService.createGroupQuery().groupMember("1").singleResult();
        System.out.println(group1);

    }

    @After
    public void afterDeal() {
        identityService.deleteMembership("1", "dept1");
        identityService.deleteUser("1");
        identityService.deleteGroup("dept1");
    }


    @Test
    @Deployment(resources = {"user.bpmn"})
    public void testUserTask1() {

        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("user");

        System.out.println(processInstance);
        // xixi签收
        Task task = taskService.createTaskQuery().taskCandidateUser("xixi").singleResult();
        taskService.claim(task.getId(), "xixi");
        taskService.complete(task.getId());

        //xiaoyu 签收
        Task task1 = taskService.createTaskQuery().taskCandidateUser("xiaoyu").singleResult();
        taskService.claim(task1.getId(), "xiaoyu");
        taskService.complete(task1.getId());
    }

部署流程资源

流程资源可以是工作类型的文件,在启动流程或者流程实例运行过程中会被读取。
流程定义文件:扩展名为:bpmn20.xml 和bpmn
流程定义的图片:用bmpn2.0规范的各种图形描绘,一般用PNG格式
表单文件:把表单内容包材在一个文件里,扩展名为form
流程总是在先部署一个流程定义,然后根据部署的流程定义启动流程实例。

classpath 方式

classpath方式就是要以class目录为基础寻找对应的资源再部署。

  //部署流程定义文件
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 读取classpath 文件
        Deployment deploy = processEngine.getRepositoryService()
            .createDeployment()
            .addClasspathResource("leave.bpmn")
            .deploy();

InputStream 方式

使用InputStream方式部署流程资源需要传入一个输出流以及资源名称,输出流的来源不限。

   String inputName = "";
        FileInputStream fileInputStream = null;
        try {
            fileInputStream = new FileInputStream(inputName);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        processEngine.getRepositoryService()
            .createDeployment().addInputStream(inputName,fileInputStream)
            .deploy();

字符串方式

利用字符串方式可以直接传入纯文本作为资源的来源。

// string
        String xml = "";
        processEngine.getRepositoryService()
            .createDeployment().addString("test.bpmn",xml)
        .deploy();

zip/bar格式压缩包

以上三种每次都只能部署一个流程资源,如果想要部署多个,就要打成bar或者zip的压缩文件。

  //bar zip
        InputStream inputStream = getClass().getClassLoader().getResourceAsStream("test.bar");
        processEngine.getRepositoryService()
            .createDeployment().addZipInputStream(new ZipInputStream(inputStream))
            .deploy();

删除流程部署

一个流程定义不能直接删除,需要通过流程定义的部署ID来删除。在执行删除的操作时,会同时删除所有和本次部署相关的资源,已经生产的流程,任务,历史的流程,任务都会删除掉。

   @Test
    public  void deleteDeployment() {
      //不做级联删除
        repositoryService.deleteDeployment("1");
        //做级联删除
        repositoryService.deleteDeployment("1",true);
    }

你可能感兴趣的:(用户与组以及流程部署)