【代码评审】工作流:getTodoTask 的评审

This commit is contained in:
YunaiV 2024-10-17 10:02:39 +08:00
parent 1d815c2c22
commit 3e55b44904
5 changed files with 24 additions and 15 deletions

View File

@ -74,12 +74,13 @@ public class BpmTaskController {
return success(BpmTaskConvert.INSTANCE.buildTodoTaskPage(pageResult, processInstanceMap, userMap));
}
// TODO @jason这个接口还要哇
@GetMapping("my-todo")
@Operation(summary = "获取我的待办任务,取第一条")
@Parameter(name = "processInstanceId", description = "流程实例的编号", required = true)
@PreAuthorize("@ss.hasPermission('bpm:task:query')")
public CommonResult<BpmTaskRespVO> getMyTodoTask(@RequestParam("processInstanceId") String processInstanceId) {
return success(taskService.getTodoTask(getLoginUserId(), processInstanceId));
return success(taskService.getFirstTodoTask(getLoginUserId(), processInstanceId));
}
@GetMapping("done-page")

View File

@ -6,11 +6,12 @@ import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.AssertTrue;
import lombok.Data;
// TODO @jason这个可以简化下使用 @RequestParam嘿嘿主要 VO 项不要太多
@Schema(description = "管理后台 - 审批详情 Request VO")
@Data
public class BpmApprovalDetailReqVO {
// TODO @jason这里要不注释说明下什么情况下使用 processDefinitionIdprocessInstanceIdactivityIdtaskId
@Schema(description = "流程定义的编号", example = "1024")
private String processDefinitionId;
@ -21,7 +22,7 @@ public class BpmApprovalDetailReqVO {
private String activityId; // 对应 BPMN XML 节点 Id
@Schema(description = "流程任务编号", example = "95f2f08b-621b-11ef-bf39-00ff4722db8b")
private String taskId; // UserTask 对应的Id
private String taskId; // 对应的 UserTask Id
@AssertTrue(message = "流程定义的编号和流程实例的编号不能同时为空")
@JsonIgnore

View File

@ -33,13 +33,13 @@ public interface BpmTaskService {
PageResult<Task> getTaskTodoPage(Long userId, BpmTaskPageReqVO pageReqVO);
/**
* 获得用户的待办任务 多条待办任务按时间顺序返回第一条
* 获得用户在指定流程下收个需要处理待办的任务
*
* @param userId 用户编号
* @param processInstanceId 流程实例编号
* @return 待办任务
*/
BpmTaskRespVO getTodoTask(Long userId, String processInstanceId);
BpmTaskRespVO getFirstTodoTask(Long userId, String processInstanceId);
/**
* 获得已办的流程任务分页

View File

@ -123,29 +123,28 @@ public class BpmTaskServiceImpl implements BpmTaskService {
return new PageResult<>(tasks, count);
}
// TODO 1 @jason这个赞要不要放到 BpmApprovalDetailRespVO 然后 BpmApprovalDetailRespVO 返回流程实例的信息 processInstance待审批的信息 todoTaskapproveNodes 审批信息列表以及 getFormFieldsPermission 也融合进去
// 类似我们现在新的 get-bpmn-model-view就是给 bpmn xml 高亮用的 get-approval-detail 就是给审批第一个 tab 用的基本信息 + 按钮 + 流程预测
@Override
public BpmTaskRespVO getTodoTask(Long userId, String processInstanceId) {
// TODO 芋艿暂未 review后续再瞅瞅先沟通完整体设计
public BpmTaskRespVO getFirstTodoTask(Long userId, String processInstanceId) {
if (processInstanceId == null) {
return null;
}
// 1.1 查询任务
TaskQuery taskQuery = taskService.createTaskQuery()
.active()
.processInstanceId(processInstanceId)
.includeTaskLocalVariables()
.includeProcessVariables()
.orderByTaskCreateTime().asc(); // 按创建时间升序
HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(processInstanceId);
BpmnModel bpmnModel = bpmProcessDefinitionService.getProcessDefinitionBpmnModel(processInstance.getProcessDefinitionId());
List<Task> todoList = taskQuery.list();
// 找到子任务用于减签
if (CollUtil.isEmpty(todoList)) {
return null;
}
// 1.2 构建子任务 Map用于减签keyparentTaskId
Map<String, List<Task>> childrenTaskMap = convertMultiMap(
filterList(todoList, r -> StrUtil.isNotEmpty(r.getParentTaskId())),
Task::getParentTaskId);
// 获取用户信息
// 2.1 获取用户信息
Set<Long> userIds = CollUtil.newHashSet();
todoList.forEach(task -> {
CollUtil.addIfAbsent(userIds, NumberUtils.parseLong((task.getAssignee())));
@ -154,8 +153,13 @@ public class BpmTaskServiceImpl implements BpmTaskService {
Map<Long, AdminUserRespDTO> userMap = adminUserApi.getUserMap(userIds);
Map<Long, DeptRespDTO> deptMap = deptApi.getDeptMap(
convertSet(userMap.values(), AdminUserRespDTO::getDeptId));
// 2.2 构建 Task 列表的返回信息
HistoricProcessInstance processInstance = processInstanceService.getHistoricProcessInstance(processInstanceId);
BpmnModel bpmnModel = bpmProcessDefinitionService.getProcessDefinitionBpmnModel(processInstance.getProcessDefinitionId());
List<BpmTaskRespVO> taskList = convertList(todoList, task -> {
// 找到分配给当前用户或者当前用户加签的任务为了减签
// TODO @jason1可以抽个小方法判断是否是当前用户的任务2尽量不做取反而是通过 ObjUtil.notEquals
// TODO 3(!userId.equals(NumberUtil.parseLong(task.getOwner(), null)) || BpmTaskSignTypeEnum.of(task.getScopeType()) == null) 这个判断的目的是啥
if (!userId.equals(NumberUtil.parseLong(task.getAssignee(), null)) &&
(!userId.equals(NumberUtil.parseLong(task.getOwner(), null)) || BpmTaskSignTypeEnum.of(task.getScopeType()) == null)) {
return null;
@ -169,8 +173,11 @@ public class BpmTaskServiceImpl implements BpmTaskService {
findAndThen(deptMap, ownerUser.getDeptId(), dept -> taskVO.getOwnerUser().setDeptName(dept.getName()));
}
// 当前用户加签的任务. 找到它的子任务 (为了减签)
// TODO @json这里最好也抽个小方法userId.equals(NumberUtil.parseLong(task.getOwner(), null))
// && BpmTaskSignTypeEnum.of(task.getScopeType()) != null
if (userId.equals(NumberUtil.parseLong(task.getOwner(), null))
&& BpmTaskSignTypeEnum.of(task.getScopeType()) != null) {
// TODO @jason170 173 181 192 这段拼接的逻辑可以拿到 convert 里面这样这块 Service 更聚焦
List<Task> childTasks = childrenTaskMap.get(task.getId());
if (CollUtil.isNotEmpty(childTasks)) {
taskVO.setChildren(