mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-01 02:38:43 +08:00 
			
		
		
		
	【功能优化】工作流:流程详情的重构 60%:参考钉钉,加签审批后,也成为独立节点
This commit is contained in:
		| @@ -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 可获取抄送人的表单权限; | ||||
|   | ||||
| @@ -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 的用户列表 | ||||
|  | ||||
|     } | ||||
|  | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -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); | ||||
|  | ||||
| } | ||||
| @@ -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(); | ||||
|     } | ||||
|  | ||||
| } | ||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -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 写入相关方法 ========== | ||||
|  | ||||
|   | ||||
| @@ -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 写入相关方法 ========== | ||||
|   | ||||
| @@ -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; | ||||
|  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV