【功能优化】工作流:流程详情的重构 60%:参考钉钉,加签审批后,也成为独立节点

This commit is contained in:
YunaiV 2024-10-26 18:29:25 +08:00
parent 758d59d74e
commit 05979254ca
9 changed files with 34 additions and 125 deletions

View File

@ -15,12 +15,12 @@ public class BpmApprovalDetailReqVO {
@Schema(description = "流程定义的编号", example = "1024")
private String processDefinitionId; // 使用场景发起流程时传流程定义 ID
@Schema(description = "流程变量")
private Map<String, Object> processVariables; // 使用场景 processDefinitionId用于流程预测
@Schema(description = "流程实例的编号", example = "1024")
private String processInstanceId; // 使用场景流程已发起时候传流程实例 ID
@Schema(description = "流程变量")
private Map<String, Object> processVariable; // 使用场景 processDefinitionId用于流程预测
// TODO @芋艿如果未来 BPMN 增加流程图它没有发起人节点会有问题
@Schema(description = "流程活动编号", example = "StartUserNode")
private String activityId; // 用于获取表单权限1发起流程时发起人节点 activityId 可获取发起人的表单权限2从抄送列表界面进来时传抄送的 activityId 可获取抄送人的表单权限

View File

@ -20,7 +20,7 @@ public class BpmApprovalDetailRespVO {
private Integer status; // 参见 BpmProcessInstanceStatusEnum 枚举
@Schema(description = "审批信息列表", requiredMode = Schema.RequiredMode.REQUIRED)
private List<ApprovalNodeInfo> approveNodes;
private List<NodeInfo> approveNodes;
@Schema(description = "表单字段权限")
private Map<String, String> formFieldsPermission;
@ -40,7 +40,7 @@ public class BpmApprovalDetailRespVO {
@Schema(description = "审批节点信息")
@Data
public static class ApprovalNodeInfo {
public static class NodeInfo {
@Schema(description = "节点编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "StartUserNode")
private String id;
@ -62,8 +62,12 @@ public class BpmApprovalDetailRespVO {
@Schema(description = "审批节点的任务信息")
private List<ApprovalTaskInfo> tasks;
@Schema(description = "候选人用户 ID 列表", requiredMode = Schema.RequiredMode.NOT_REQUIRED, example = "1818")
@JsonIgnore // 不返回只是方便后续读取赋值给 candidateUsers
private List<Long> candidateUserIds;
@Schema(description = "候选人用户列表")
private List<UserSimpleBaseVO> candidateUsers; // 用于未运行任务节点
private List<UserSimpleBaseVO> candidateUsers; // 只包含未生成 ApprovalTaskInfo 的用户列表
}

View File

@ -8,7 +8,6 @@ import cn.iocoder.yudao.module.bpm.enums.definition.BpmBoundaryEventType;
import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants;
import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils;
import cn.iocoder.yudao.module.bpm.service.definition.BpmModelService;
import cn.iocoder.yudao.module.bpm.service.task.BpmActivityService;
import cn.iocoder.yudao.module.bpm.service.task.BpmTaskService;
import com.google.common.collect.ImmutableSet;
import jakarta.annotation.Resource;
@ -44,9 +43,6 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener {
@Resource
@Lazy // 解决循环依赖
private BpmTaskService taskService;
@Resource
@Lazy // 解决循环依赖
private BpmActivityService activityService;
public static final Set<FlowableEngineEventType> TASK_EVENTS = ImmutableSet.<FlowableEngineEventType>builder()
.add(FlowableEngineEventType.TASK_CREATED)
@ -72,7 +68,7 @@ public class BpmTaskEventListener extends AbstractFlowableEngineEventListener {
@Override
protected void activityCancelled(FlowableActivityCancelledEvent event) {
List<HistoricActivityInstance> activityList = activityService.getHistoricActivityListByExecutionId(event.getExecutionId());
List<HistoricActivityInstance> activityList = taskService.getHistoricActivityListByExecutionId(event.getExecutionId());
if (CollUtil.isEmpty(activityList)) {
log.error("[activityCancelled][使用 executionId({}) 查找不到对应的活动实例]", event.getExecutionId());
return;

View File

@ -1,30 +0,0 @@
package cn.iocoder.yudao.module.bpm.service.task;
import org.flowable.engine.history.HistoricActivityInstance;
import java.util.List;
/**
* BPM 活动实例 Service 接口
*
* @author 芋道源码
*/
public interface BpmActivityService {
/**
* 获得指定流程实例的活动实例列表
*
* @param processInstanceId 流程实例的编号
* @return 活动实例列表
*/
List<HistoricActivityInstance> getActivityListByProcessInstanceId(String processInstanceId);
/**
* 获得执行编号对应的活动实例
*
* @param executionId 执行编号
* @return 活动实例
*/
List<HistoricActivityInstance> getHistoricActivityListByExecutionId(String executionId);
}

View File

@ -1,37 +0,0 @@
package cn.iocoder.yudao.module.bpm.service.task;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.flowable.engine.HistoryService;
import org.flowable.engine.history.HistoricActivityInstance;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.util.List;
// TODO 芋艿准备废弃
/**
* BPM 活动实例 Service 实现类
*
* @author 芋道源码
*/
@Service
@Slf4j
@Validated
public class BpmActivityServiceImpl implements BpmActivityService {
@Resource
private HistoryService historyService;
@Override
public List<HistoricActivityInstance> getActivityListByProcessInstanceId(String processInstanceId) {
return historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId)
.orderByHistoricActivityInstanceStartTime().asc().list();
}
@Override
public List<HistoricActivityInstance> getHistoricActivityListByExecutionId(String executionId) {
return historyService.createHistoricActivityInstanceQuery().executionId(executionId).list();
}
}

View File

@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*;
import cn.iocoder.yudao.module.bpm.enums.definition.BpmUserTaskTimeoutHandlerTypeEnum;
import jakarta.validation.Valid;
import org.flowable.bpmn.model.UserTask;
import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.task.api.Task;
import org.flowable.task.api.history.HistoricTaskInstance;
@ -139,12 +140,20 @@ public interface BpmTaskService {
List<Task> getTaskListByParentTaskId(String parentTaskId);
/**
* 通过任务 ID查询任务名 Map
* 获得指定流程实例的活动实例列表
*
* @param taskIds 任务 ID
* @return 任务 ID 与名字的 Map
* @param processInstanceId 流程实例的编号
* @return 活动实例列表
*/
Map<String, String> getTaskNameByTaskIds(Collection<String> taskIds);
List<HistoricActivityInstance> getActivityListByProcessInstanceId(String processInstanceId);
/**
* 获得执行编号对应的活动实例
*
* @param executionId 执行编号
* @return 活动实例
*/
List<HistoricActivityInstance> getHistoricActivityListByExecutionId(String executionId);
// ========== Update 写入相关方法 ==========

View File

@ -39,6 +39,7 @@ import org.flowable.engine.HistoryService;
import org.flowable.engine.ManagementService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.history.HistoricActivityInstance;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.DelegationState;
@ -377,12 +378,14 @@ public class BpmTaskServiceImpl implements BpmTaskService {
}
@Override
public Map<String, String> getTaskNameByTaskIds(Collection<String> taskIds) {
if (CollUtil.isEmpty(taskIds)) {
return Collections.emptyMap();
}
List<Task> tasks = taskService.createTaskQuery().taskIds(taskIds).list();
return convertMap(tasks, Task::getId, Task::getName);
public List<HistoricActivityInstance> getActivityListByProcessInstanceId(String processInstanceId) {
return historyService.createHistoricActivityInstanceQuery().processInstanceId(processInstanceId)
.orderByHistoricActivityInstanceStartTime().asc().list();
}
@Override
public List<HistoricActivityInstance> getHistoricActivityListByExecutionId(String executionId) {
return historyService.createHistoricActivityInstanceQuery().executionId(executionId).list();
}
// ========== Update 写入相关方法 ==========

View File

@ -1,36 +0,0 @@
package cn.iocoder.yudao.module.bpm.service.task.bo;
import lombok.Data;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmApprovalDetailRespVO.ApprovalNodeInfo;
/**
* 已经进行中的审批节点 Response BO
*
* @author jason
*/
@Data
public class AlreadyRunApproveNodeRespBO {
/**
* 审批节点信息数组
*/
private List<ApprovalNodeInfo> approveNodes;
/**
* 已运行的节点 ID 数组 (对应 Bpmn XML 节点 id)
*/
private Set<String> runNodeIds;
/**
* 正在运行的节点的审批信息key: activityId, value: 审批信息
* <p>
* 用于依次审批需要加上候选人信息
*/
private Map<String, ApprovalNodeInfo> runningApprovalNodes;
}