bpm 我的流程,增加 task 的展示

This commit is contained in:
YunaiV 2022-01-08 09:56:56 +08:00
parent 14a7d637b3
commit 1ab15dd1f9
16 changed files with 139 additions and 89 deletions

View File

@ -5,7 +5,7 @@ tenant-id: 1
Authorization: Bearer {{token}}
{
"processDefinitionId": "leave:7:20ada39c-6c95-11ec-88b1-cacd34981f8e",
"processDefinitionId": "gateway_test:2:00e52d8e-701b-11ec-aca9-a2380e71991a",
"variables": {
"a": 1,
"b": "2"

View File

@ -1,6 +1,6 @@
package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow;
package cn.iocoder.yudao.adminserver.modules.bpm.controller.task;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.*;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.*;
import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;

View File

@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
@ApiModel("流程实例的分页 Item Response VO")
@Data
@ -34,6 +35,21 @@ public class BpmProcessInstancePageItemRespVO {
@ApiModelProperty(value = "结束时间", required = true)
private Date endTime;
// TODO 芋艿tasks
/**
* 当前任务
*/
private List<Task> tasks;
@ApiModel("流程任务")
@Data
public static class Task {
@ApiModelProperty(value = "流程任务的编号", required = true, example = "1024")
private String id;
@ApiModelProperty(value = "任务名称", required = true, example = "芋道")
private String name;
}
}

View File

@ -1,4 +1,4 @@
package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo;
package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task;
import lombok.Data;

View File

@ -1,4 +1,4 @@
package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo;
package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task;
import lombok.Data;
import lombok.ToString;

View File

@ -1,4 +1,4 @@
package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo;
package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task;
import lombok.Data;
import lombok.ToString;

View File

@ -1,4 +1,4 @@
package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo;
package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task;
import lombok.Data;
import lombok.ToString;

View File

@ -1,4 +1,4 @@
package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo;
package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task;
import lombok.Data;
import lombok.ToString;

View File

@ -1,4 +1,4 @@
package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo;
package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.annotations.ApiModel;

View File

@ -1,4 +1,4 @@
package cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo;
package cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task;
import io.swagger.annotations.ApiModel;
import lombok.Data;

View File

@ -5,12 +5,15 @@ import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessIn
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.factory.Mappers;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
/**
* 流程实例 Convert
@ -32,10 +35,17 @@ public interface BpmProcessInstanceConvert {
})
BpmProcessInstanceExtDO convert(ProcessInstance instance, ProcessDefinition definition);
PageResult<BpmProcessInstancePageItemRespVO> convertPage(PageResult<BpmProcessInstanceExtDO> page);
default PageResult<BpmProcessInstancePageItemRespVO> convertPage(PageResult<BpmProcessInstanceExtDO> page,
Map<String, List<Task>> taskMap) {
List<BpmProcessInstancePageItemRespVO> list = convertList(page.getList());
list.forEach(respVO -> respVO.setTasks(convertList2(taskMap.get(respVO.getId()))));
return new PageResult<>(list, page.getTotal());
}
List<BpmProcessInstancePageItemRespVO> convertList(List<BpmProcessInstanceExtDO> list);
List<BpmProcessInstancePageItemRespVO.Task> convertList2(List<Task> tasks);
@Mapping(source = "processInstanceId", target = "id")
BpmProcessInstancePageItemRespVO convert(BpmProcessInstanceExtDO bean);

View File

@ -1,7 +1,7 @@
package cn.iocoder.yudao.adminserver.modules.bpm.convert.task;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.TaskStepVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.TodoTaskRespVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.TaskStepVO;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.TodoTaskRespVO;
import org.activiti.api.task.model.Task;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.repository.ProcessDefinition;

View File

@ -1,15 +1,41 @@
package cn.iocoder.yudao.adminserver.modules.bpm.service.task;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.*;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import org.activiti.engine.task.Task;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* 工作流用户任务服务接口
* 工作任务 Service 接口
*
* @author jason
* @author 芋道源码
*/
public interface BpmTaskService {
/**
* 获得流程任务列表
*
* @param processInstanceIds 流程实例的编号数组
* @return 流程任务列表
*/
List<Task> getTasksByProcessInstanceIds(List<String> processInstanceIds);
/**
* 获得流程任务 Map
*
* @param processInstanceIds 流程实例的编号数组
* @return 流程任务 Map
*/
default Map<String, List<Task>> getTaskMapByProcessInstanceIds(List<String> processInstanceIds) {
return CollectionUtils.convertMultiMap(getTasksByProcessInstanceIds(processInstanceIds),
Task::getProcessInstanceId);
}
/**
* 获取当前用户的待办任务 分页

View File

@ -12,9 +12,11 @@ import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceRes
import cn.iocoder.yudao.adminserver.modules.bpm.enums.task.BpmProcessInstanceStatusEnum;
import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService;
import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService;
import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService;
import cn.iocoder.yudao.adminserver.modules.system.service.user.SysUserService;
import cn.iocoder.yudao.coreservice.modules.system.dal.dataobject.user.SysUserDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RuntimeService;
@ -34,6 +36,7 @@ import java.util.Map;
import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_DEFINITION_IS_SUSPENDED;
import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_DEFINITION_NOT_EXISTS;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
/**
* 流程实例 Service 实现类
@ -55,7 +58,7 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
@Resource
private RuntimeService runtimeService;
@Resource
private TaskService taskService;
private BpmTaskService taskService;
@Resource
private HistoryService historyService;
@ -88,17 +91,17 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
createProcessInstanceExt(instance, definition);
// 添加初始的评论 TODO 芋艿在思考下
Task task = taskService.createTaskQuery().processInstanceId(instance.getId()).singleResult();
if (task != null) {
SysUserDO user = userService.getUser(userId);
Assert.notNull(user, "用户({})不存在", userId);
String type = "normal";
taskService.addComment(task.getId(), instance.getProcessInstanceId(), type,
String.format("%s 发起流程申请", user.getNickname()));
// TODO 芋艿应该不用下面两个步骤
// taskService.setAssignee(task.getId(), String.valueOf(userId));
// taskService.complete(task.getId(), variables);
}
// Task task = taskService.createTaskQuery().processInstanceId(instance.getId()).singleResult();
// if (task != null) {
// SysUserDO user = userService.getUser(userId);
// Assert.notNull(user, "用户({})不存在", userId);
// String type = "normal";
// taskService.addComment(task.getId(), instance.getProcessInstanceId(), type,
// String.format("%s 发起流程申请", user.getNickname()));
// // TODO 芋艿应该不用下面两个步骤
//// taskService.setAssignee(task.getId(), String.valueOf(userId));
//// taskService.complete(task.getId(), variables);
// }
return instance.getId();
}
@ -123,24 +126,12 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService
if (CollUtil.isEmpty(pageResult.getList())) {
return new PageResult<>(pageResult.getTotal());
}
// TODO 芋艿tasks
// 获得流程 Task Map
List<String> processInstanceIds = convertList(pageResult.getList(), BpmProcessInstanceExtDO::getProcessInstanceId);
Map<String, List<Task>> taskMap = taskService.getTaskMapByProcessInstanceIds(processInstanceIds);
// 转换返回
return BpmProcessInstanceConvert.INSTANCE.convertPage(pageResult);
}
public void getMyProcessInstancePage(Long userId) {
// id title 所属流程 当前审批环节 状态 结果 创建时间 提交申请时间 标题状态ActBusiness
// id title 流程类别 流程版本 提交时间 流程状态 耗时 当前节点 办理 标题提交时间HistoricProcessInstanceQuery
// id name 所属流程 流程类别 创建时间 状态 当前审批环节 标题流程时间状态结果
runtimeService.createProcessInstanceQuery().list();
HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery()
.startedBy(String.valueOf(userId)) // 发起人是自己
.orderByProcessInstanceStartTime().desc(); // 按照发起时间倒序
List<HistoricProcessInstance> list = historicProcessInstanceQuery.list();
System.out.println("test");
return BpmProcessInstanceConvert.INSTANCE.convertPage(pageResult, taskMap);
}
/**

View File

@ -2,16 +2,13 @@ package cn.iocoder.yudao.adminserver.modules.bpm.service.task.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.IoUtil;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.workflow.vo.*;
import cn.iocoder.yudao.adminserver.modules.bpm.controller.task.vo.task.*;
import cn.iocoder.yudao.adminserver.modules.bpm.convert.task.TaskConvert;
import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import lombok.extern.slf4j.Slf4j;
import org.activiti.api.runtime.shared.query.Page;
import org.activiti.api.runtime.shared.query.Pageable;
import org.activiti.api.task.model.Task;
import org.activiti.api.task.model.builders.ClaimTaskPayloadBuilder;
import org.activiti.api.task.model.builders.TaskPayloadBuilder;
import org.activiti.api.task.runtime.TaskRuntime;
@ -22,11 +19,13 @@ import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Comment;
import org.activiti.engine.task.Task;
import org.activiti.image.ProcessDiagramGenerator;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -35,11 +34,7 @@ import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.*;
import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.HIGHLIGHT_IMG_ERROR;
import static cn.iocoder.yudao.adminserver.modules.bpm.enums.BpmErrorCodeConstants.PROCESS_INSTANCE_NOT_EXISTS;
@ -51,34 +46,39 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Resource
private TaskRuntime taskRuntime;
@Resource
private org.activiti.engine.TaskService activitiTaskService;
@Resource
private HistoryService historyService;
@Resource
private RepositoryService repositoryService;
private TaskService taskService;
@Resource
private RuntimeService runtimeService;
@Resource
private HistoryService historyService;
@Resource
private RepositoryService repositoryService;
@Resource
private ProcessDiagramGenerator processDiagramGenerator;
@Override
public List<Task> getTasksByProcessInstanceIds(List<String> processInstanceIds) {
if (CollUtil.isEmpty(processInstanceIds)) {
return Collections.emptyList();
}
return taskService.createTaskQuery().processInstanceIdIn(processInstanceIds).list();
}
@Override
public PageResult<TodoTaskRespVO> getTodoTaskPage(TodoTaskPageReqVO pageReqVO) {
// TODO @jason封装一个方法用于转换成 activiti 的分页对象
final Pageable pageable = Pageable.of((pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize(), pageReqVO.getPageSize());
Page<Task> pageTasks = taskRuntime.tasks(pageable);
int totalItems = pageTasks.getTotalItems();
List<Task> tasks = pageTasks.getContent();
final List<TodoTaskRespVO> respVOList = tasks.stream().map(task -> {
ProcessDefinition definition = repositoryService.getProcessDefinition(task.getProcessDefinitionId());
return TaskConvert.INSTANCE.convert(task, definition);
}).collect(Collectors.toList());
return new PageResult<>(respVOList, (long)totalItems);
// final Pageable pageable = Pageable.of((pageReqVO.getPageNo() - 1) * pageReqVO.getPageSize(), pageReqVO.getPageSize());
// Page<Task> pageTasks = taskRuntime.tasks(pageable);
// int totalItems = pageTasks.getTotalItems();
// List<Task> tasks = pageTasks.getContent();
// final List<TodoTaskRespVO> respVOList = tasks.stream().map(task -> {
// ProcessDefinition definition = repositoryService.getProcessDefinition(task.getProcessDefinitionId());
// return TaskConvert.INSTANCE.convert(task, definition);
// }).collect(Collectors.toList());
// return new PageResult<>(respVOList, (long)totalItems);
return null;
}
@ -95,27 +95,27 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override
@Transactional
public void completeTask(TaskReqVO taskReq) {
final Task task = taskRuntime.task(taskReq.getTaskId());
activitiTaskService.addComment(taskReq.getTaskId(), task.getProcessInstanceId(), taskReq.getComment());
taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(taskReq.getTaskId())
.withVariables(taskReq.getVariables())
.build());
// final Task task = taskRuntime.task(taskReq.getTaskId());
//
// taskService.addComment(taskReq.getTaskId(), task.getProcessInstanceId(), taskReq.getComment());
//
// taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(taskReq.getTaskId())
// .withVariables(taskReq.getVariables())
// .build());
}
@Override
public TaskHandleVO getTaskSteps(TaskQueryReqVO taskQuery) {
TaskHandleVO handleVO = new TaskHandleVO();
final Task task = taskRuntime.task(taskQuery.getTaskId());
List<TaskStepVO> steps = getTaskSteps(task.getProcessInstanceId());
handleVO.setHistoryTask(steps);
return handleVO;
// TaskHandleVO handleVO = new TaskHandleVO();
// final Task task = taskRuntime.task(taskQuery.getTaskId());
// List<TaskStepVO> steps = getTaskSteps(task.getProcessInstanceId());
// handleVO.setHistoryTask(steps);
// return handleVO;
return null;
}
private List<TaskStepVO> getTaskSteps(String processInstanceId) {
// 获得已完成的活动
List<HistoricActivityInstance> finished = historyService.createHistoricActivityInstanceQuery()
@ -129,7 +129,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
TaskStepVO stepVO = TaskConvert.INSTANCE.convert(instance);
stepVO.setStatus(1); // TODO @jason1 这个 magic number 要枚举起来
// TODO @jason可以考虑把 comments 读取后在统一调用 convert 拼接另外 Comment 是废弃的类有没其它可以使用的哈
List<Comment> comments = activitiTaskService.getTaskComments(instance.getTaskId());
List<Comment> comments = taskService.getTaskComments(instance.getTaskId());
if (!CollUtil.isEmpty(comments)) {
stepVO.setComment(Optional.ofNullable(comments.get(0)).map(Comment::getFullMessage).orElse(""));
}
@ -160,8 +160,9 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override
public TodoTaskRespVO getTaskFormKey(TaskQueryReqVO taskQuery) {
final Task task = taskRuntime.task(taskQuery.getTaskId());
return TaskConvert.INSTANCE.convert(task);
// final Task task = taskRuntime.task(taskQuery.getTaskId());
// return TaskConvert.INSTANCE.convert(task);
return null;
}
@Override

View File

@ -54,7 +54,13 @@
<span>{{ getDictDataLabel(DICT_TYPE.BPM_MODEL_CATEGORY, scope.row.category) }}</span>
</template>
</el-table-column>
<el-table-column label="当前审批任务" align="center" prop="tasks" /> <!-- TODO 芋艿待完善 -->
<el-table-column label="当前审批任务" align="center" prop="tasks">
<template slot-scope="scope">
<el-button v-for="task in scope.row.tasks" type="text" @click="handleFormDetail(task.id)">
<span>{{ task.name }}</span>
</el-button>
</template>
</el-table-column>
<el-table-column label="状态" align="center" prop="status">
<template slot-scope="scope">
<span>