add - 新增查询指定流程实例的所有任务列表,未完成

This commit is contained in:
wangli 2023-07-29 20:39:17 +08:00
parent 0c4d8d6cd7
commit 07cc68f3a7
8 changed files with 195 additions and 32 deletions

View File

@ -2,13 +2,14 @@ package cn.axzo.workflow.core.service;
import cn.axzo.workflow.core.service.dto.request.task.BpmTaskAssigneeDTO;
import cn.axzo.workflow.core.service.dto.request.task.BpmTaskAuditDTO;
import cn.axzo.workflow.core.service.dto.request.task.BpmTaskCommentDTO;
import cn.axzo.workflow.core.service.dto.request.task.BpmTaskTodoPageSearchDTO;
import cn.axzo.workflow.core.service.dto.response.BpmPageResult;
import cn.axzo.workflow.core.service.dto.response.task.BpmHistoricTaskInstanceVO;
import cn.axzo.workflow.core.service.dto.response.task.BpmTaskDonePageItemVO;
import cn.axzo.workflow.core.service.dto.response.task.BpmTaskTodoPageItemVO;
import org.flowable.form.api.FormInfo;
import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;
import java.util.List;
@ -39,7 +40,7 @@ public interface BpmTaskService {
/**
* 获取历史已审批的列表详情
*/
List<HistoricTaskInstance> getTaskListByProcessInstanceId(String processInstanceId);
List<BpmHistoricTaskInstanceVO> getHistoricTaskListByProcessInstanceId(String processInstanceId, String tenantId);
/**
* 获取实例正在审核的人列表
@ -68,4 +69,6 @@ public interface BpmTaskService {
* @param dto
*/
void assigneeTask(BpmTaskAssigneeDTO dto);
void commentTask(BpmTaskCommentDTO dto);
}

View File

@ -0,0 +1,37 @@
package cn.axzo.workflow.core.service.converter;
import cn.axzo.workflow.core.service.dto.response.task.BpmHistoricTaskInstanceVO;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import java.util.Arrays;
import static org.mapstruct.NullValueCheckStrategy.ALWAYS;
/**
* TODO
*
* @author wangli
* @sine 2023/7/29 17:50
*/
@Mapper(
componentModel = "spring",
nullValueCheckStrategy = ALWAYS,
imports = Arrays.class
)
public interface BpmHistoricTaskInstanceConverter extends EntityConverter<BpmHistoricTaskInstanceVO,
HistoricTaskInstance> {
@Override
@Mapping(target = "taskId", source = "id")
@Mapping(target = "taskDefinitionKey", source = "taskDefinitionKey")
@Mapping(target = "name", source = "name")
@Mapping(target = "processInstanceId", source = "processInstanceId")
@Mapping(target = "processDefinitionId", source = "processDefinitionId")
@Mapping(target = "createTime", source = "createTime")
@Mapping(target = "endTime", source = "endTime")
@Mapping(target = "durationInMillis", source = "durationInMillis")
@Mapping(target = "tenantId", source = "tenantId")
BpmHistoricTaskInstanceVO toVo(HistoricTaskInstance entity);
}

View File

@ -11,7 +11,7 @@ public class BpmTaskAuditDTO {
@ApiModelProperty(value = "任务编号", required = true, example = "1024")
@NotEmpty(message = "任务编号不能为空")
private String id;
private String taskId;
/**
* 审核人Id
*/

View File

@ -0,0 +1,31 @@
package cn.axzo.workflow.core.service.dto.request.task;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* 添加评论
*
* @author wangli
* @sine 2023/7/29 17:25
*/
@Data
public class BpmTaskCommentDTO {
@ApiModelProperty(value = "审批任务 ID")
@NotBlank(message = "任务 ID 不能为空")
private String taskId;
@ApiModelProperty(value = "流程实例 ID")
@NotBlank(message = "流程实例 ID 不能为空")
private String processInstanceId;
@ApiModelProperty(value = "租户 ID")
@NotBlank(message = "tenantId")
private String tenantId;
@ApiModelProperty(value = "评论内容")
private String comment;
}

View File

@ -0,0 +1,39 @@
package cn.axzo.workflow.core.service.dto.response.task;
import cn.axzo.workflow.core.common.enums.BpmProcessInstanceResultEnum;
import lombok.Data;
import java.util.Date;
/**
* TODO
*
* @author wangli
* @sine 2023/7/29 17:57
*/
//@ApiModel("管理后台 - 流程任务的 Done 已完成的分页项 Response VO")
@Data
public class BpmHistoricTaskInstanceVO {
private String taskId;
private String taskDefinitionKey;
private String name;
private String processInstanceId;
private String processDefinitionId;
private Date createTime;
private Date endTime;
private Long durationInMillis;
private String tenantId;
private BpmProcessInstanceResultEnum result;
private String comment;
}

View File

@ -1,16 +1,17 @@
package cn.axzo.workflow.core.service.impl;
import cn.axzo.workflow.core.common.BpmConstants;
import cn.axzo.workflow.core.common.enums.BpmProcessInstanceResultEnum;
import cn.axzo.workflow.core.common.exception.WorkflowEngineException;
import cn.axzo.workflow.core.common.utils.BpmCollectionUtils;
import cn.axzo.workflow.core.service.BpmTaskService;
import cn.axzo.workflow.core.service.converter.BpmHistoricTaskInstanceConverter;
import cn.axzo.workflow.core.service.converter.BpmTaskDonePageItemConverter;
import cn.axzo.workflow.core.service.converter.BpmTaskTodoPageItemConverter;
import cn.axzo.workflow.core.service.dto.request.task.BpmTaskAssigneeDTO;
import cn.axzo.workflow.core.service.dto.request.task.BpmTaskAuditDTO;
import cn.axzo.workflow.core.service.dto.request.task.BpmTaskCommentDTO;
import cn.axzo.workflow.core.service.dto.request.task.BpmTaskTodoPageSearchDTO;
import cn.axzo.workflow.core.service.dto.response.BpmPageResult;
import cn.axzo.workflow.core.service.dto.response.task.BpmHistoricTaskInstanceVO;
import cn.axzo.workflow.core.service.dto.response.task.BpmTaskDonePageItemVO;
import cn.axzo.workflow.core.service.dto.response.task.BpmTaskTodoPageItemVO;
import cn.hutool.core.collection.CollUtil;
@ -21,13 +22,15 @@ import org.flowable.engine.RepositoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.history.HistoricProcessInstanceQuery;
import org.flowable.engine.impl.persistence.entity.CommentEntity;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.engine.task.Comment;
import org.flowable.form.api.FormInfo;
import org.flowable.task.api.Task;
import org.flowable.task.api.TaskQuery;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
@ -38,19 +41,21 @@ import java.util.stream.Collectors;
import static cn.axzo.workflow.core.common.BpmConstants.*;
import static cn.axzo.workflow.core.common.enums.BpmErrorCode.*;
import static cn.axzo.workflow.core.common.enums.BpmProcessInstanceResultEnum.REJECTED;
import static cn.axzo.workflow.core.common.enums.BpmProcessInstanceResultEnum.valueOfStatus;
import static cn.axzo.workflow.core.common.utils.BpmCollectionUtils.convertSet;
@Service
@Slf4j
public class BpmTaskServiceImpl implements BpmTaskService {
@Autowired
@Resource
private TaskService taskService;
@Autowired
@Resource
private RuntimeService runtimeService;
@Autowired
@Resource
private HistoryService historyService;
@Autowired
@Resource
private RepositoryService repositoryService;
@Resource
private BpmProcessInstanceServiceImpl processInstanceService;
@ -58,6 +63,8 @@ public class BpmTaskServiceImpl implements BpmTaskService {
private BpmTaskTodoPageItemConverter todoPageItemConverter;
@Resource
private BpmTaskDonePageItemConverter donePageItemConverter;
@Resource
private BpmHistoricTaskInstanceConverter historicTaskInstanceConverter;
// @Resource
// private BpmTaskExtMapper taskExtMapper;
// @Resource
@ -144,7 +151,7 @@ public class BpmTaskServiceImpl implements BpmTaskService {
@Override
public void approveTask(BpmTaskAuditDTO dto) {
// 校验任务存在
Task task = checkTask(dto.getTenantId(), dto.getUserId(), dto.getId());
Task task = checkTask(dto.getTenantId(), dto.getUserId(), dto.getTaskId());
// 校验流程实例存在
HistoricProcessInstance instance = processInstanceService.getProcessInstance(
task.getProcessInstanceId(), null, true);
@ -182,18 +189,19 @@ public class BpmTaskServiceImpl implements BpmTaskService {
// // 更新任务拓展表为通过
// taskExtMapper.updateByTaskId(taskExtDO);
Map<String, Object> transientMap = new HashMap<>();
transientMap.put(BpmConstants.INTERNAL_TASK_COMMENT, dto.getComment());
// Map<String, Object> transientMap = new HashMap<>();
// transientMap.put(BpmConstants.INTERNAL_TASK_COMMENT, dto.getComment());
taskService.addComment(dto.getTaskId(), instance.getId(), dto.getComment());
// 完成任务审批通过
// FIXME 如果 task 被重复删除会抛出异常
taskService.complete(task.getId(), instance.getProcessVariables(), transientMap);
taskService.complete(task.getId(), instance.getProcessVariables());
}
@Override
public void rejectTask(BpmTaskAuditDTO dto) {
// 校验任务存在
Task task = checkTask(dto.getTenantId(),
dto.getUserId(), dto.getId());
dto.getUserId(), dto.getTaskId());
// 校验流程实例存在
HistoricProcessInstance instance = processInstanceService.getProcessInstance(
@ -210,19 +218,48 @@ public class BpmTaskServiceImpl implements BpmTaskService {
// 删除流程实例以实现驳回任务时取消整个审批流程
processInstanceService.deleteProcessInstance(instance.getId(), dto.getComment(),
BpmProcessInstanceResultEnum.REJECTED);
REJECTED);
}
@Override
public List<HistoricTaskInstance> getTaskListByProcessInstanceId(String processInstanceId) {
List<HistoricTaskInstance> tasks = historyService.createHistoricTaskInstanceQuery()
// .taskAssignee(workspaceId + "_" + identityId)
.processInstanceId(processInstanceId)
// .taskTenantId(String.valueOf(workspaceId))
.orderByHistoricTaskInstanceStartTime().desc() // 创建时间倒序
public List<BpmHistoricTaskInstanceVO> getHistoricTaskListByProcessInstanceId(String processInstanceId,
String tenantId) {
HistoricTaskInstanceQuery query =
historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId);
if (StringUtils.hasLength(tenantId)) {
query.taskTenantId(tenantId);
}
HistoricProcessInstanceQuery instanceQuery =
historyService.createHistoricProcessInstanceQuery().processInstanceId(processInstanceId);
if (StringUtils.hasLength(tenantId)) {
instanceQuery.processInstanceTenantId(tenantId);
}
HistoricProcessInstance instance = instanceQuery.singleResult();
List<HistoricTaskInstance> taskInstances = query.orderByHistoricTaskInstanceStartTime()
.desc() // 创建时间倒序
.list();
return tasks;
// Map<String, List<HistoricTaskInstance>> taskMapByDefKey =
// taskInstances.stream().collect(Collectors.groupingBy
// (HistoricTaskInstance::getTaskDefinitionKey));
List<BpmHistoricTaskInstanceVO> vos = historicTaskInstanceConverter.toVos(taskInstances);
List<Comment> comments = taskService.getProcessInstanceComments(processInstanceId, CommentEntity.TYPE_COMMENT);
if (!CollectionUtils.isEmpty(vos) && !CollectionUtils.isEmpty(comments)) {
for (BpmHistoricTaskInstanceVO vo : vos) {
vo.setResult(valueOfStatus(instance.getBusinessStatus()));
for (Comment comment : comments) {
if (Objects.equals(vo.getTaskId(), comment.getTaskId())
// 使用流程引擎的 Comment 表来记录审批意见,现目前业务一般只针对一个审批任务写一条审批建议
// 但防止后续新增多条评论,被动覆盖,所以简单粗暴的只取第一条评论
&& !StringUtils.hasLength(vo.getComment())) {
vo.setComment(comment.getFullMessage());
}
}
}
}
return vos;
}
@Override
@ -234,14 +271,14 @@ public class BpmTaskServiceImpl implements BpmTaskService {
}
/**
*
* 校验任务是否存在 并且是否是分配给自己的任务
*
* @param tenantId 租户ID
* @param assignee 用户ID
* @param taskId 任务ID
*/
private Task checkTask(String tenantId, String assignee,
String taskId) {
private Task checkTask(String tenantId, String assignee, String taskId) {
Task task = getTask(taskId, assignee, tenantId);
if (task == null) {
@ -366,4 +403,18 @@ public class BpmTaskServiceImpl implements BpmTaskService {
}
taskService.setAssignee(task.getId(), dto.getNewUserId());
}
@Override
public void commentTask(BpmTaskCommentDTO dto) {
TaskQuery query = taskService.createTaskQuery().taskId(dto.getTaskId());
if (StringUtils.hasLength(dto.getTenantId())) {
query.taskTenantId(dto.getTenantId());
}
Task task = query.singleResult();
if (Objects.isNull(task)) {
throw new WorkflowEngineException("不存在");
}
taskService.addComment(dto.getTaskId(), dto.getProcessInstanceId(), dto.getComment());
}
}

View File

@ -25,7 +25,7 @@
<multiInstanceLoopCharacteristics isSequential="false"
flowable:collection="sid-6589489F-EE93-43F2-A98F-78F5A578D39B_assigneeList"
flowable:elementVariable="assigneeName">
<extensionElements></extensionElements>
</multiInstanceLoopCharacteristics>
</userTask>
<sequenceFlow id="sid-7A2B3B51-387C-4957-830C-F4B75147DD15" sourceRef="startEvent1"

View File

@ -5,6 +5,7 @@ import cn.axzo.workflow.core.service.dto.request.task.BpmTaskAssigneeDTO;
import cn.axzo.workflow.core.service.dto.request.task.BpmTaskAuditDTO;
import cn.axzo.workflow.core.service.dto.request.task.BpmTaskTodoPageSearchDTO;
import cn.axzo.workflow.core.service.dto.response.BpmPageResult;
import cn.axzo.workflow.core.service.dto.response.task.BpmHistoricTaskInstanceVO;
import cn.axzo.workflow.core.service.dto.response.task.BpmTaskDonePageItemVO;
import cn.axzo.workflow.core.service.dto.response.task.BpmTaskTodoPageItemVO;
import cn.azxo.framework.common.model.CommonResponse;
@ -12,7 +13,6 @@ import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.flowable.form.api.FormInfo;
import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@ -77,13 +77,15 @@ public class BpmTaskController {
/**
* 获取历史已审批的列表详情
* 获取指定流程实例的审批过程信息
*/
@GetMapping("/listByProcessInstanceId")
public CommonResponse<List<HistoricTaskInstance>> getTaskListByProcessInstanceId(@RequestBody String processInstanceId) {
@GetMapping("/list")
public CommonResponse<List<BpmHistoricTaskInstanceVO>> getTaskListByProcessInstanceId(@RequestParam String processInstanceId,
@RequestParam(required =
false) String tenantId) {
log.info("获取历史已审批的列表详情 getTaskListByProcessInstanceId===>>>参数:{}", processInstanceId);
List<HistoricTaskInstance> result = bpmTaskService.getTaskListByProcessInstanceId(processInstanceId);
return CommonResponse.success(result);
return CommonResponse.success(bpmTaskService.getHistoricTaskListByProcessInstanceId(processInstanceId,
tenantId));
}
/**