组任务的办理流程是什么?
第一步:查询组任务
指定候选人,查询该候选人当前的待办任务。
候选人不能办理任务。
第二步:让候选人去拾取(claim)任务
该组任务的所有候选人都能拾取。
将候选人的组任务,变成个人任务。原来候选人就变成了该任务的负责人。
问题: 如果拾取后不想办理该任务怎么办?
解答: 需要将已经拾取的个人任务归还到组里边,将个人任务变成了组任务。
第三步:查询个人任务
查询方式同个人任务部分,根据 assignee 查询用户负责的个人任务。
第四步:办理个人任务
// 新的请假流程定义的部署
public static void main(String[] args) {
// 1. 得到 processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 得到 RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
// 部署
Deployment deploy = repositoryService.createDeployment()
.addClasspathResource("holiday.bpmn")
// .addClasspathResource("studentHoliday.png")
.name("请假流程2020-5-20")
.deploy();
System.out.println(deploy.getId());
System.out.println(deploy.getName());
System.out.println(deploy.getKey());
}
// 启动流程实例,同时还要设置流程变量的值
public static void main(String[] args) {
// 1. 得到 processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2.得到 RuntimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
// 3.流程定义的key问题并进行启动
String processDefinitionKey = "myProcess_1";
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1");
// 4.输出实例信息;
System.out.println(processInstance.getName());
System.out.println(processInstance.getProcessDefinitionId());
System.out.println(processInstance.getId());
}
// 处理任务: 任务查询是否存在再执行
public static void main(String[] args) {
// 1. 得到 processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 2.得到 TaskService
TaskService taskService = processEngine.getTaskService();
// 3. 查询当前用户是否有任务
String key = "myProcess_1";
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.singleResult();
// 4. 判断task!=null,说明当前用户有任务
if (task != null) {
taskService.complete(task.getId());
System.out.println("用户任务执行完成");
System.out.println(task.getId());
}
}
任务成功执行完毕如下:
// 4.根据候选人查询组任务
public void findGroupTaskList() {
// 流程定义key
String key = "myProcess_1";
// 任务候选人
String candidateUser = "zhangsan";
// 创建 TaskService
TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
// 查询任务
List list = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskCandidateUser(candidateUser)
.list();
// 流程信息的输出展示
if (!list.isEmpty()) {
for (Task task : list) {
System.out.println("===============================");
System.out.println("流程实例id:" + task.getProcessInstanceId());
System.out.println("任务id:" + task.getId());
System.out.println("任务负责人:" + task.getAssignee());
System.out.println("任务名称:" + task.getName());
}
}
}
成功运行结果如下:
// 5. 让候选人去拾取(claim)任务
public static void claimTask() {
TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
String key = "myProcess_1";
String candidateUsers = "zhangsan";
// 先查询是否有任务,校验用户是否有资格
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskCandidateUser(candidateUsers)
.singleResult();
if (task != null) {
// 拾取主任务
taskService.claim(task.getId(), candidateUsers);
System.out.println("该任务拾取成功!");
}
}
如果任务拾取成功显示如下:
查看部门经理的assignee,之前是空, 目前已经确认,给 "zhansan" 了. "zhansan"由候选人变成了执行人.
任务拾取的核心: TaskService.claim(taskId, candidateUser); 目的就是将候选人转化为执行人, 让assignee有值.
这里的核心是用taskAssignee(userId);进行查询, userId还是candidateUser, 但是candidateUser实际已经编程执行人了, 所以查询的时候方法是用taskAssignee()来进行查询.
// 6. 用户查询个人代办任务
public static void findPersonalTaskList(){
// 流程定义key
String key = "myProcess_1";
// 任务候选人
String candidateUser = "zhangsan";
// 创建 TaskService
TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
// 查询任务
List list = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskAssignee(candidateUser)
.list();
// 流程信息的输出展示
if (!list.isEmpty()) {
for (Task task : list) {
System.out.println("===============================");
System.out.println("流程实例id:" + task.getProcessInstanceId());
System.out.println("任务id:" + task.getId());
System.out.println("任务负责人:" + task.getAssignee());
System.out.println("任务名称:" + task.getName());
}
}
}
// 7.用户办理个人任务
public static void completeTask() {
// 任务Id
String taskId = "";
ProcessEngines.getDefaultProcessEngine().getTaskService()
.complete(taskId);
System.out.println("完成任务:" + taskId);
}
优化--(判断有没有权限)
// 7. 当前用户完成自己的任务
public static void completeTask() {
TaskService taskService = ProcessEngines.getDefaultProcessEngine().getTaskService();
String key = "myProcess_1";
String candidateUsers = "zhangsan";
// 先查询是否有任务,校验用户是否有资格
Task task = taskService.createTaskQuery()
.processDefinitionKey(key)
.taskAssignee(candidateUsers)
.singleResult();
if (task != null) {
// 完成任务
taskService.complete(task.getId());
System.out.println("完成任务:" + task.getId());
}
组任务的办理流程和任务的交接流程如下:
第一步:查询组任务
指定候选人,查询该候选人当前的待办任务。
第二步:让候选人去拾取(claim)任务
第三步:查询个人任务
第四步:办理个人任务