add - 新增查询指定流程实例的所有任务列表,未完成
This commit is contained in:
parent
0c4d8d6cd7
commit
07cc68f3a7
@ -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);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
@ -11,7 +11,7 @@ public class BpmTaskAuditDTO {
|
||||
|
||||
@ApiModelProperty(value = "任务编号", required = true, example = "1024")
|
||||
@NotEmpty(message = "任务编号不能为空")
|
||||
private String id;
|
||||
private String taskId;
|
||||
/**
|
||||
* 审核人Id
|
||||
*/
|
||||
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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"
|
||||
|
||||
@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Loading…
Reference in New Issue
Block a user