身份服务

suaxi
2024-07-13 / 0 评论 / 43 阅读 / 正在检测是否收录...

1. 候选人

(1)流程图

1.1财务审批-候选人-流程图.png

候选人设置方式:

  • 直接指定

    1.2财务审批-候选人-candidate.png

  • 通过表达式设置(当不清楚具体是谁来审批时)

    1.3财务审批-候选人-candidate.png


(2)部署和启动流程

package com.sw.camundademo;

import org.camunda.bpm.engine.*;
import org.camunda.bpm.engine.repository.Deployment;
import org.camunda.bpm.engine.task.IdentityLink;
import org.camunda.bpm.engine.task.Task;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author Suaxi
 * @Date 2024/7/8 21:52
 * @Description
 */
@SpringBootTest
public class FlowCandidateTest {
    @Autowired
    private RepositoryService repositoryService;

    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    @Test
    public void deploy() {
        Deployment deploy = repositoryService.createDeployment()
                .name("财务审批-候选人")
                .addClasspathResource("flow/07.财务审批-候选人.bpmn")
                .deploy();
        System.out.println(deploy.getId());
    }

    @Test
    public void startProcess() {
        String processId = "Process_1su8y7i:1:7f77bcb5-3d31-11ef-933e-a8a1592cf182";
        runtimeService.startProcessInstanceById(processId);
    }
}

(3)拾取任务

在候选人流程中,组要通过拾取行为把候选人转换为处理人

  • 通过GUI操作

    1.4财务审批-候选人-拾取任务.png

  • 通过API操作
/**
 * 查询当前登录用户可拾取的任务
 */
@Test
public void getUserCandidateUserTask() {
    List<Task> currentUserTaskList = taskService.createTaskQuery()
        .taskCandidateUser("admin")
        .list();

    if (currentUserTaskList != null && currentUserTaskList.size() > 0) {
        for (Task task : currentUserTaskList) {
            System.out.println("task.getId() = " + task.getId());
            System.out.println("task.getName() = " + task.getName());
            System.out.println("====================================");
        }
    } else {
        System.out.println("当前登录用户没有可候选的task");
    }
}

@Test
public void claimTask() {
    Task task = taskService.createTaskQuery()
        .taskCandidateUser("admin")
        .singleResult();
    if (task != null) {
        taskService.claim(task.getId(), "admin");
    }
}

注:已经拾取过的任务不能被其他候选人强行拾取,且拾取后其他候选人查不到该任务

(4)归还任务

拾取后的任务如果因为一些原因不想/不能操作,可以归还

  • 通过GUI操作

    1.5财务审批-候选人-归还任务.png

  • 通过API操作

    @Test
    public void unClaimTak() {
        Task task = taskService.createTaskQuery()
            .taskAssignee("admin")
            .singleResult();
        if (task != null) {
            //只需把任务处理人设置为空即可
            taskService.claim(task.getId(), null);
        } else {
            System.out.println("没有需要归还的任务!");
        }
    }


(5)交接任务

拾取后的任务如果不想处理也不想归还,则可以交接/指派给其他用户处理

@Test
public void setAssignee() {
    Task task = taskService.createTaskQuery()
        .taskAssignee("admin")
        .singleResult();
    if (task != null) {
        taskService.setAssignee(task.getId(), "zhangsan");
        System.out.println("任务交接/指派给了zhangsan!");
    } else {
        System.out.println("未查询到待处理的任务!");
    }
}


(6)完成任务

@Test
public void completeTask() {
    String taskId = "a50080d7-3d31-11ef-a0f6-a8a1592cf182";
    //当前流程的下一个节点需要通过表达式设置候选人,此处需要设置候选人变量
    Map<String, Object> map = new HashMap<>(2);
    map.put("user1", "admin");
    map.put("user2", "lisi");
    taskService.complete(taskId, map);
}


2. 候选人组

(1)用户管理

package com.sw.camundademo;

import org.camunda.bpm.engine.IdentityService;
import org.camunda.bpm.engine.identity.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * @Author Suaxi
 * @Date 2024/7/9 21:54
 * @Description
 */
@SpringBootTest
public class FlowCandidateGroupTest {

    @Autowired
    private IdentityService identityService;

    /**
     * 创建用户
     */
    @Test
    public void createUser() {
        User user = identityService.newUser("zhangsan");
        user.setPassword("123456");
        user.setEmail("zhangsan@qq.com");
        user.setFirstName("zhang");
        user.setLastName("san");
        identityService.saveUser(user);
    }

    /**
     * 删除用户
     */
    @Test
    public void deleteUser() {
        identityService.deleteUser("zhangsan");
    }

    /**
     * 更新用户
     */
    @Test
    public void updateUser() {
        User user = identityService.createUserQuery().userId("zhangsan").singleResult();
        user.setLastName("777");
        //saveUser包含保存和更新的操作
        identityService.saveUser(user);
    }
}


(2)Group管理

/**
 * 创建组
 */
@Test
public void createGroup() {
    Group group = identityService.newGroup("userGroup");
    group.setName("用户组");
    group.setType("user");
    identityService.saveGroup(group);
}

/**
 * 更新组
 */
@Test
public void updateGroup() {
    Group group = identityService.createGroupQuery().groupId("userGroup").singleResult();
    group.setName("用户组");
    group.setType("USER");
    identityService.saveGroup(group);
}

/**
 * 删除组
 */
@Test
public void deleteGroup() {
    identityService.deleteGroup("userGroup");
}


(3)用户、组关联关系管理

/**
 * 建立 user 和 group 的关联关系
 */
@Test
public void createMemberShip() {
    identityService.createMembership("zhangsan", "userGroup");
}

/**
 * 更新 user 和 group 的关联关系
 */
@Test
public void updateMemberShip() {
    //camunda未提供直接更新memberShip的api,此处采用先删除再插入的方法
    identityService.deleteMembership("zhangsan", "userGroup");
    identityService.createMembership("zhangsan", "userGroup1");
}


(4)应用

流程图

1.6财务审批-候选人组-流程图.png

测试

@Test
public void deploy() {
    Deployment deploy = repositoryService.createDeployment()
        .name("财务审批-候选人组")
        .addClasspathResource("flow/08.财务审批-候选人组.bpmn")
        .deploy();
    System.out.println(deploy.getId());
}

@Test
public void startProcess() {
    String processId = "Process_10u33as:1:2cc72548-3e02-11ef-b682-a8a1592cf182";
    Map<String, Object> variables = new HashMap<>();
    variables.put("group1", "userGroup1");
    runtimeService.startProcessInstanceById(processId, variables);
}

@Test
public void queryCandidateGroupTask() {
    String processDefinitionId = "Process_10u33as:1:2cc72548-3e02-11ef-b682-a8a1592cf182";
    //根据当前登录用户查询对应的group
    List<Group> groupList = identityService.createGroupQuery().groupMember("zhangsan").list();
    if (groupList != null && groupList.size() > 0) {
        for (Group group : groupList) {
            List<Task> taskList = taskService.createTaskQuery()
                .processDefinitionId(processDefinitionId)
                .taskCandidateGroup(group.getId())
                .list();
            if (taskList != null && taskList.size() > 0) {
                for (Task task : taskList) {
                    System.out.println("task.getName() = " + task.getName());
                }
            } else {
                System.out.println("未查询到待审批的任务!");
            }
        }
    }
}

@Test
public void claimTask() {
    String processDefinitionId = "Process_10u33as:1:2cc72548-3e02-11ef-b682-a8a1592cf182";
    //根据当前登录用户查询对应的group
    List<Group> groupList = identityService.createGroupQuery().groupMember("zhangsan").list();
    if (groupList != null && groupList.size() > 0) {
        for (Group group : groupList) {
            List<Task> taskList = taskService.createTaskQuery()
                .processDefinitionId(processDefinitionId)
                .taskCandidateGroup(group.getId())
                .list();
            if (taskList != null && taskList.size() > 0) {
                for (Task task : taskList) {
                    taskService.claim(task.getId(), "zhangsan");
                }
            } else {
                System.out.println("未查询到待审批的任务!");
            }
        }
    }
}
0

评论 (0)

取消