【代码评审修改】 getTodoTask 评审修改

This commit is contained in:
jason 2024-10-18 23:35:18 +08:00
parent 7b57c7d056
commit 8469b2b8cb
5 changed files with 68 additions and 52 deletions

View File

@ -17,9 +17,9 @@ import java.util.Arrays;
public enum BpmUserTaskApproveMethodEnum implements IntArrayValuable {
RANDOM(1, "随机挑选一人审批", null),
RATIO(2, "多人会签(按通过比例)", "${ nrOfCompletedInstances >= nrOfInstances }"), // 会签按通过比例
RATIO(2, "多人会签(按通过比例)", "${ nrOfCompletedInstances/nrOfInstances >= %s}"), // 会签按通过比例
ANY(3, "多人或签(一人通过或拒绝)", "${ nrOfCompletedInstances > 0 }"), // 或签通过只需一人拒绝只需一人
SEQUENTIAL(4, "依次审批", "${ nrOfCompletedInstances/nrOfInstances >= %s}"); // 依次审批
SEQUENTIAL(4, "依次审批", "${ nrOfCompletedInstances >= nrOfInstances }"); // 依次审批
/**
* 审批方式

View File

@ -10,19 +10,17 @@ import lombok.Data;
@Data
public class BpmApprovalDetailReqVO {
// TODO @jason这里要不注释说明下什么情况下使用 processDefinitionIdprocessInstanceIdactivityIdtaskId
@Schema(description = "流程定义的编号", example = "1024")
private String processDefinitionId;
private String processDefinitionId; // 发起流程的时候传流程定义 Id
@Schema(description = "流程实例的编号", example = "1024")
private String processInstanceId;
private String processInstanceId; // 流程已发起时候传流程实例 Id
@Schema(description = "流程活动编号", example = "StartUserNode")
private String activityId; // 对应 BPMN XML 节点 Id
private String activityId; // 用于获取表单权限 发起流程时, 发起人节点 activityId 可获取发起人的表单权限
@Schema(description = "流程任务编号", example = "95f2f08b-621b-11ef-bf39-00ff4722db8b")
private String taskId; // 对应的 UserTask Id
private String taskId; // 用于获取表单权限流程已发起时传任务 Id, 获取任务节点的变得权限
@AssertTrue(message = "流程定义的编号和流程实例的编号不能同时为空")
@JsonIgnore

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.bpm.convert.task;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
@ -101,21 +102,13 @@ public interface BpmTaskConvert {
.setFormFields(form.getFields()).setFormVariables(FlowableUtils.getTaskFormVariable(task));
}
// 用户信息
AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(task.getAssignee()));
if (assignUser != null) {
taskVO.setAssigneeUser(BeanUtils.toBean(assignUser, BpmProcessInstanceRespVO.User.class));
findAndThen(deptMap, assignUser.getDeptId(), dept -> taskVO.getAssigneeUser().setDeptName(dept.getName()));
}
AdminUserRespDTO ownerUser = userMap.get(NumberUtils.parseLong(task.getOwner()));
if (ownerUser != null) {
taskVO.setOwnerUser(BeanUtils.toBean(ownerUser, BpmProcessInstanceRespVO.User.class));
findAndThen(deptMap, ownerUser.getDeptId(), dept -> taskVO.getOwnerUser().setDeptName(dept.getName()));
}
if (BpmTaskStatusEnum.RUNNING.getStatus().equals(taskStatus)){
buildTaskAssignee(taskVO, task.getAssignee(), userMap, deptMap);
buildTaskOwner(taskVO, task.getOwner(), userMap, deptMap);
if (BpmTaskStatusEnum.RUNNING.getStatus().equals(taskStatus)) {
// 操作按钮设置
taskVO.setButtonsSetting(BpmnModelUtils.parseButtonsSetting(bpmnModel, task.getTaskDefinitionKey()));
}
return taskVO;
return taskVO;
});
// 拼接父子关系
@ -158,6 +151,41 @@ public interface BpmTaskConvert {
return reqDTO;
}
default void buildTaskOwner(BpmTaskRespVO task, String taskOwner,
Map<Long, AdminUserRespDTO> userMap,
Map<Long, DeptRespDTO> deptMap) {
AdminUserRespDTO ownerUser = userMap.get(NumberUtils.parseLong(taskOwner));
if (ownerUser != null) {
task.setOwnerUser(BeanUtils.toBean(ownerUser, BpmProcessInstanceRespVO.User.class));
findAndThen(deptMap, ownerUser.getDeptId(), dept -> task.getOwnerUser().setDeptName(dept.getName()));
}
}
default void buildTaskChildren(BpmTaskRespVO task, Map<String, List<Task>> childrenTaskMap,
Map<Long, AdminUserRespDTO> userMap, Map<Long, DeptRespDTO> deptMap) {
List<Task> childTasks = childrenTaskMap.get(task.getId());
if (CollUtil.isNotEmpty(childTasks)) {
task.setChildren(
convertList(childTasks, childTask -> {
BpmTaskRespVO childTaskVO = BeanUtils.toBean(childTask, BpmTaskRespVO.class);
childTaskVO.setStatus(FlowableUtils.getTaskStatus(childTask));
buildTaskAssignee(childTaskVO, childTask.getAssignee(), userMap, deptMap);
return childTaskVO;
})
);
}
}
default void buildTaskAssignee(BpmTaskRespVO task, String taskAssignee,
Map<Long, AdminUserRespDTO> userMap,
Map<Long, DeptRespDTO> deptMap) {
AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(taskAssignee));
if (assignUser != null) {
task.setAssigneeUser(BeanUtils.toBean(assignUser, BpmProcessInstanceRespVO.User.class));
findAndThen(deptMap, assignUser.getDeptId(), dept -> task.getAssigneeUser().setDeptName(dept.getName()));
}
}
/**
* 将父任务的属性拷贝到子任务加签任务
* <p>

View File

@ -33,7 +33,7 @@ public interface BpmTaskService {
PageResult<Task> getTaskTodoPage(Long userId, BpmTaskPageReqVO pageReqVO);
/**
* 获得用户在指定流程下个需要处理待办的任务
* 获得用户在指定流程下个需要处理待办的任务
*
* @param userId 用户编号
* @param processInstanceId 流程实例编号

View File

@ -11,7 +11,6 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
import cn.iocoder.yudao.framework.common.util.object.PageUtils;
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO;
import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert;
import cn.iocoder.yudao.module.bpm.enums.definition.*;
@ -60,7 +59,6 @@ import java.util.stream.Stream;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
import static cn.iocoder.yudao.framework.common.util.collection.MapUtils.findAndThen;
import static cn.iocoder.yudao.module.bpm.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnVariableConstants.PROCESS_INSTANCE_VARIABLE_RETURN_FLAG;
@ -158,41 +156,18 @@ public class BpmTaskServiceImpl implements BpmTaskService {
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)) {
// @芋艿 !isAddSignTask(userId, task) 该判断的目的被用户加签的任务该用户可以进行减签操作
if (!isAssignUserTask(userId, task) && !isAddSignTask(userId, task)) {
return null;
}
BpmTaskRespVO taskVO = BeanUtils.toBean(task, BpmTaskRespVO.class);
taskVO.setStatus(FlowableUtils.getTaskStatus(task)).setReason(FlowableUtils.getTaskReason(task));
taskVO.setButtonsSetting(BpmnModelUtils.parseButtonsSetting(bpmnModel, task.getTaskDefinitionKey()));
AdminUserRespDTO ownerUser = userMap.get(NumberUtils.parseLong(task.getOwner()));
if (ownerUser != null) {
taskVO.setOwnerUser(BeanUtils.toBean(ownerUser, BpmProcessInstanceRespVO.User.class));
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(
convertList(childTasks, childTask -> {
BpmTaskRespVO childTaskVO = BeanUtils.toBean(task, BpmTaskRespVO.class);
childTaskVO.setStatus(FlowableUtils.getTaskStatus(task));
AdminUserRespDTO assignUser = userMap.get(NumberUtils.parseLong(childTask.getAssignee()));
if (assignUser != null) {
childTaskVO.setAssigneeUser(BeanUtils.toBean(assignUser, BpmProcessInstanceRespVO.User.class));
findAndThen(deptMap, assignUser.getDeptId(), dept -> childTaskVO.getAssigneeUser().setDeptName(dept.getName()));
}
return childTaskVO;
})
);
}
BpmTaskConvert.INSTANCE.buildTaskOwner(taskVO, task.getOwner(), userMap, deptMap);
// 如果是被加签的任务. 找到它的子任务 (为了减签)
if (isAddSignTask(userId, task)) {
BpmTaskConvert.INSTANCE.buildTaskChildren(taskVO, childrenTaskMap, userMap, deptMap);
}
return taskVO;
@ -200,6 +175,21 @@ public class BpmTaskServiceImpl implements BpmTaskService {
return findFirst(taskList, Objects::nonNull);
}
/**
* 判断是否为被分配给用户的任务
*/
private boolean isAssignUserTask(Long userId, Task task) {
return ObjectUtil.equal(userId, NumberUtil.parseLong(task.getAssignee(), null));
}
/**
* 判断是否为被用户加签的任务
*/
private boolean isAddSignTask(Long userId, Task task) {
return userId.equals(NumberUtil.parseLong(task.getOwner(), null))
&& BpmTaskSignTypeEnum.of(task.getScopeType()) != null;
}
@Override
public PageResult<HistoricTaskInstance> getTaskDonePage(Long userId, BpmTaskPageReqVO pageVO) {
HistoricTaskInstanceQuery taskQuery = historyService.createHistoricTaskInstanceQuery()