mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-10-31 10:18:42 +08:00 
			
		
		
		
	BPM:移除 flowable starter 模块,融合到 bpm 模块中
This commit is contained in:
		| @@ -11,7 +11,6 @@ | ||||
|     <modules> | ||||
|         <module>yudao-module-bpm-api</module> | ||||
|         <module>yudao-module-bpm-biz</module> | ||||
|         <module>yudao-spring-boot-starter-flowable</module> | ||||
|     </modules> | ||||
|     <artifactId>yudao-module-bpm</artifactId> | ||||
|     <packaging>pom</packaging> | ||||
|   | ||||
| @@ -64,15 +64,19 @@ | ||||
|             <artifactId>yudao-spring-boot-starter-test</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- 工作流相关 --> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-flowable</artifactId> | ||||
|             <version>${revision}</version> | ||||
|         </dependency> | ||||
|         <!-- 工具类相关 --> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-excel</artifactId> | ||||
|         </dependency> | ||||
|         <!-- Flowable 工作流相关 --> | ||||
|         <dependency> | ||||
|             <groupId>org.flowable</groupId> | ||||
|             <artifactId>flowable-spring-boot-starter-process</artifactId> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.flowable</groupId> | ||||
|             <artifactId>flowable-spring-boot-starter-actuator</artifactId> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
| </project> | ||||
|   | ||||
| @@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.number.NumberUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||||
| import cn.iocoder.yudao.framework.flowable.core.util.FlowableUtils; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; | ||||
| import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstancePageItemRespVO; | ||||
| import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; | ||||
| import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmCategoryDO; | ||||
|   | ||||
| @@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.number.NumberUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||||
| import cn.iocoder.yudao.framework.flowable.core.util.FlowableUtils; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; | ||||
| import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.instance.BpmProcessInstanceRespVO; | ||||
| import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.BpmTaskRespVO; | ||||
| import cn.iocoder.yudao.module.bpm.dal.dataobject.definition.BpmFormDO; | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| package cn.iocoder.yudao.framework.flowable.core.context; | ||||
| package cn.iocoder.yudao.module.bpm.framework; | ||||
| 
 | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import com.alibaba.ttl.TransmittableThreadLocal; | ||||
| @@ -10,6 +10,7 @@ import java.util.Map; | ||||
| /** | ||||
|  * 工作流--用户用到的上下文相关信息 | ||||
|  */ | ||||
| @Deprecated // TODO 芋艿:找个方式,去掉这个上下文 | ||||
| public class FlowableContextHolder { | ||||
| 
 | ||||
|     private static final ThreadLocal<Map<String, List<Long>>> ASSIGNEE = new TransmittableThreadLocal<>(); | ||||
| @@ -1,19 +0,0 @@ | ||||
| package cn.iocoder.yudao.module.bpm.framework.bpm.config; | ||||
|  | ||||
| import cn.iocoder.yudao.module.bpm.framework.bpm.core.event.BpmProcessInstanceResultEventPublisher; | ||||
| import org.springframework.context.ApplicationEventPublisher; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
|  | ||||
| /** | ||||
|  * BPM 通用的 Configuration 配置类,提供给 Activiti 和 Flowable | ||||
|  */ | ||||
| @Configuration(proxyBeanMethods = false) | ||||
| public class BpmCommonConfiguration { | ||||
|  | ||||
|     @Bean | ||||
|     public BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher(ApplicationEventPublisher publisher) { | ||||
|         return new BpmProcessInstanceResultEventPublisher(publisher); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,6 +0,0 @@ | ||||
| /** | ||||
|  * 自定义 Event 实现,提供方便业务接入的 Listener! | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| package cn.iocoder.yudao.module.bpm.framework.bpm.core.event; | ||||
| @@ -1,4 +0,0 @@ | ||||
| /** | ||||
|  * 占位 | ||||
|  */ | ||||
| package cn.iocoder.yudao.module.bpm.framework.bpm.core; | ||||
| @@ -1,6 +0,0 @@ | ||||
| /** | ||||
|  * 提供给 Activiti 和 Flowable 的通用封装 | ||||
|  * | ||||
|  * @author 芋道源码 | ||||
|  */ | ||||
| package cn.iocoder.yudao.module.bpm.framework.bpm; | ||||
| @@ -4,13 +4,18 @@ import cn.hutool.core.collection.ListUtil; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior.BpmActivityBehaviorFactory; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.event.BpmProcessInstanceResultEventPublisher; | ||||
| import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | ||||
| import org.flowable.common.engine.api.delegate.event.FlowableEventListener; | ||||
| import org.flowable.spring.SpringProcessEngineConfiguration; | ||||
| import org.flowable.spring.boot.EngineConfigurationConfigurer; | ||||
| import org.springframework.beans.factory.ObjectProvider; | ||||
| import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; | ||||
| import org.springframework.context.ApplicationEventPublisher; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| import org.springframework.core.task.AsyncListenableTaskExecutor; | ||||
| import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; | ||||
|  | ||||
| import java.util.List; | ||||
|  | ||||
| @@ -22,6 +27,26 @@ import java.util.List; | ||||
| @Configuration(proxyBeanMethods = false) | ||||
| public class BpmFlowableConfiguration { | ||||
|  | ||||
|     /** | ||||
|      * 参考 {@link org.flowable.spring.boot.FlowableJobConfiguration} 类,创建对应的 AsyncListenableTaskExecutor Bean | ||||
|      * | ||||
|      * 如果不创建,会导致项目启动时,Flowable 报错的问题 | ||||
|      */ | ||||
|     @Bean(name = "applicationTaskExecutor") | ||||
|     @ConditionalOnMissingBean(name = "applicationTaskExecutor") | ||||
|     public AsyncListenableTaskExecutor taskExecutor() { | ||||
|         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); | ||||
|         executor.setCorePoolSize(8); | ||||
|         executor.setMaxPoolSize(8); | ||||
|         executor.setQueueCapacity(100); | ||||
|         executor.setThreadNamePrefix("flowable-task-Executor-"); | ||||
|         executor.setAwaitTerminationSeconds(30); | ||||
|         executor.setWaitForTasksToCompleteOnShutdown(true); | ||||
|         executor.setAllowCoreThreadTimeOut(true); | ||||
|         executor.initialize(); | ||||
|         return executor; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * BPM 模块的 ProcessEngineConfigurationConfigurer 实现类: | ||||
|      * | ||||
| @@ -56,4 +81,11 @@ public class BpmFlowableConfiguration { | ||||
|         return new BpmTaskCandidateInvoker(strategyList, adminUserApi); | ||||
|     } | ||||
|  | ||||
|     // =========== 自己拓展的 Bean ========== | ||||
|  | ||||
|     @Bean | ||||
|     public BpmProcessInstanceResultEventPublisher processInstanceResultEventPublisher(ApplicationEventPublisher publisher) { | ||||
|         return new BpmProcessInstanceResultEventPublisher(publisher); | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1,6 +1,6 @@ | ||||
| package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.flowable.core.util.FlowableUtils; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker; | ||||
| import lombok.Setter; | ||||
| import org.flowable.bpmn.model.Activity; | ||||
| @@ -43,9 +43,9 @@ public class BpmParallelMultiInstanceBehavior extends ParallelMultiInstanceBehav | ||||
|         // 第一步,设置 collectionVariable 和 CollectionVariable | ||||
|         // 从  execution.getVariable() 读取所有任务处理人的 key | ||||
|         super.collectionExpression = null; // collectionExpression 和 collectionVariable 是互斥的 | ||||
|         super.collectionVariable = FlowableUtils.formatCollectionVariable(execution.getCurrentActivityId()); | ||||
|         super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(execution.getCurrentActivityId()); | ||||
|         // 从 execution.getVariable() 读取当前所有任务处理的人的 key | ||||
|         super.collectionElementVariable = FlowableUtils.formatCollectionElementVariable(execution.getCurrentActivityId()); | ||||
|         super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId()); | ||||
|  | ||||
|         // 第二步,获取任务的所有处理人 | ||||
|         Set<Long> assigneeUserIds = taskCandidateInvoker.calculateUsers(execution); | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| package cn.iocoder.yudao.module.bpm.framework.flowable.core.behavior; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.flowable.core.util.FlowableUtils; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker; | ||||
| import lombok.Setter; | ||||
| import org.flowable.bpmn.model.Activity; | ||||
| @@ -37,9 +37,9 @@ public class BpmSequentialMultiInstanceBehavior extends SequentialMultiInstanceB | ||||
|         // 第一步,设置 collectionVariable 和 CollectionVariable | ||||
|         // 从  execution.getVariable() 读取所有任务处理人的 key | ||||
|         super.collectionExpression = null; // collectionExpression 和 collectionVariable 是互斥的 | ||||
|         super.collectionVariable = FlowableUtils.formatCollectionVariable(execution.getCurrentActivityId()); | ||||
|         super.collectionVariable = FlowableUtils.formatExecutionCollectionVariable(execution.getCurrentActivityId()); | ||||
|         // 从 execution.getVariable() 读取当前所有任务处理的人的 key | ||||
|         super.collectionElementVariable = FlowableUtils.formatCollectionElementVariable(execution.getCurrentActivityId()); | ||||
|         super.collectionElementVariable = FlowableUtils.formatExecutionCollectionElementVariable(execution.getCurrentActivityId()); | ||||
|  | ||||
|         // 第二步,获取任务的所有处理人 | ||||
|         Set<Long> assigneeUserIds = new LinkedHashSet<>(taskCandidateInvoker.calculateUsers(execution)); // 保证有序!!! | ||||
|   | ||||
| @@ -5,7 +5,7 @@ import cn.hutool.core.lang.Assert; | ||||
| import cn.hutool.core.util.StrUtil; | ||||
| import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; | ||||
| import cn.iocoder.yudao.framework.common.util.number.NumberUtils; | ||||
| import cn.iocoder.yudao.framework.flowable.core.util.BpmnModelUtils; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmnModelConstants; | ||||
| import cn.iocoder.yudao.module.system.api.user.AdminUserApi; | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| package cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.strategy; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.flowable.core.util.FlowableUtils; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmTaskCandidateStrategyEnum; | ||||
| import org.dromara.hutool.core.convert.Convert; | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| package cn.iocoder.yudao.module.bpm.framework.bpm.core.event; | ||||
| package cn.iocoder.yudao.module.bpm.framework.flowable.core.event; | ||||
| 
 | ||||
| import cn.iocoder.yudao.module.bpm.event.BpmProcessInstanceResultEvent; | ||||
| import lombok.AllArgsConstructor; | ||||
| @@ -1,4 +1,4 @@ | ||||
| package cn.iocoder.yudao.framework.flowable.core.util; | ||||
| package cn.iocoder.yudao.module.bpm.framework.flowable.core.util; | ||||
| 
 | ||||
| import cn.hutool.core.collection.CollUtil; | ||||
| import cn.hutool.core.util.ArrayUtil; | ||||
| @@ -1,5 +1,6 @@ | ||||
| package cn.iocoder.yudao.framework.flowable.core.util; | ||||
| package cn.iocoder.yudao.module.bpm.framework.flowable.core.util; | ||||
| 
 | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.enums.BpmConstants; | ||||
| import org.flowable.common.engine.api.delegate.Expression; | ||||
| import org.flowable.common.engine.api.variable.VariableContainer; | ||||
| import org.flowable.common.engine.impl.el.ExpressionManager; | ||||
| @@ -32,11 +33,23 @@ public class FlowableUtils { | ||||
| 
 | ||||
|     // ========== Execution 相关的工具方法 ========== | ||||
| 
 | ||||
|     public static String formatCollectionVariable(String activityId) { | ||||
|     /** | ||||
|      * 格式化多实例(并签、或签)的 collectionVariable 变量(多实例对应的多审批人列表) | ||||
|      * | ||||
|      * @param activityId 活动编号 | ||||
|      * @return collectionVariable 变量 | ||||
|      */ | ||||
|     public static String formatExecutionCollectionVariable(String activityId) { | ||||
|         return activityId + "_assignees"; | ||||
|     } | ||||
| 
 | ||||
|     public static String formatCollectionElementVariable(String activityId) { | ||||
|     /** | ||||
|      * 格式化多实例(并签、或签)的 collectionElementVariable 变量(当前实例对应的一个审批人) | ||||
|      * | ||||
|      * @param activityId 活动编号 | ||||
|      * @return collectionElementVariable 变量 | ||||
|      */ | ||||
|     public static String formatExecutionCollectionElementVariable(String activityId) { | ||||
|         return activityId + "_assignee"; | ||||
|     } | ||||
| 
 | ||||
| @@ -50,43 +63,86 @@ public class FlowableUtils { | ||||
|         return getProcessInstanceStatus(processInstance.getProcessVariables()); | ||||
|     } | ||||
| 
 | ||||
|     // TODO 芋艿:需要再搞搞 | ||||
|     /** | ||||
|      * 获得流程实例的状态 | ||||
|      * | ||||
|      * @param processVariables 流程实例的 variables | ||||
|      * @return 状态 | ||||
|      */ | ||||
|     private static Integer getProcessInstanceStatus(Map<String, Object> processVariables) { | ||||
|         return (Integer) processVariables.get("PROCESS_STATUS"); | ||||
|         return (Integer) processVariables.get(BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 获得流程实例的表单 | ||||
|      * | ||||
|      * @param processInstance 流程实例 | ||||
|      * @return 表单 | ||||
|      */ | ||||
|     public static Map<String, Object> getProcessInstanceFormVariable(ProcessInstance processInstance) { | ||||
|         Map<String, Object> formVariables = new HashMap<>(processInstance.getProcessVariables()); | ||||
|         filterProcessInstanceFormVariable(formVariables); | ||||
|         return formVariables; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 过滤流程实例的表单 | ||||
|      * | ||||
|      * 为什么要过滤?目前使用 processVariables 存储所有流程实例的拓展字段,需要过滤掉一部分的系统字段,从而实现表单的展示 | ||||
|      * | ||||
|      * @param processVariables 流程实例的 variables | ||||
|      * @return 过滤后的表单 | ||||
|      */ | ||||
|     public static Map<String, Object> filterProcessInstanceFormVariable(Map<String, Object> processVariables) { | ||||
|         processVariables.remove("PROCESS_STATUS"); | ||||
|         processVariables.remove(BpmConstants.PROCESS_INSTANCE_VARIABLE_STATUS); | ||||
|         return processVariables; | ||||
|     } | ||||
| 
 | ||||
|     // ========== Task 相关的工具方法 ========== | ||||
| 
 | ||||
|     // TODO 芋艿:需要再搞搞 | ||||
| 
 | ||||
|     /** | ||||
|      * 获得任务的状态 | ||||
|      * | ||||
|      * @param task 任务 | ||||
|      * @return 状态 | ||||
|      */ | ||||
|     public static Integer getTaskStatus(TaskInfo task) { | ||||
|         return (Integer) task.getTaskLocalVariables().get("TASK_STATUS"); | ||||
|         return (Integer) task.getTaskLocalVariables().get(BpmConstants.TASK_VARIABLE_STATUS); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 获得任务的审批原因 | ||||
|      * | ||||
|      * @param task 任务 | ||||
|      * @return 审批原因 | ||||
|      */ | ||||
|     public static String getTaskReason(TaskInfo task) { | ||||
|         return (String) task.getTaskLocalVariables().get("TASK_REASON"); | ||||
|         return (String) task.getTaskLocalVariables().get(BpmConstants.TASK_VARIABLE_REASON); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 获得任务的表单 | ||||
|      * | ||||
|      * @param task 任务 | ||||
|      * @return 表单 | ||||
|      */ | ||||
|     public static Map<String, Object> getTaskFormVariable(TaskInfo task) { | ||||
|         Map<String, Object> formVariables = new HashMap<>(task.getTaskLocalVariables()); | ||||
|         filterTaskFormVariable(formVariables); | ||||
|         return formVariables; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * 过滤任务的表单 | ||||
|      * | ||||
|      * 为什么要过滤?目前使用 taskLocalVariables 存储所有任务的拓展字段,需要过滤掉一部分的系统字段,从而实现表单的展示 | ||||
|      * | ||||
|      * @param taskLocalVariables 任务的 taskLocalVariables | ||||
|      * @return 过滤后的表单 | ||||
|      */ | ||||
|     public static Map<String, Object> filterTaskFormVariable(Map<String, Object> taskLocalVariables) { | ||||
|         taskLocalVariables.remove("TASK_STATUS"); | ||||
|         taskLocalVariables.remove("TASK_REASON"); | ||||
|         taskLocalVariables.remove(BpmConstants.TASK_VARIABLE_STATUS); | ||||
|         taskLocalVariables.remove(BpmConstants.TASK_VARIABLE_REASON); | ||||
|         return taskLocalVariables; | ||||
|     } | ||||
| 
 | ||||
| @@ -1,7 +1,10 @@ | ||||
| package cn.iocoder.yudao.module.bpm.framework.web.config; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum; | ||||
| import cn.iocoder.yudao.framework.swagger.config.YudaoSwaggerAutoConfiguration; | ||||
| import cn.iocoder.yudao.module.bpm.framework.web.core.FlowableWebFilter; | ||||
| import org.springdoc.core.models.GroupedOpenApi; | ||||
| import org.springframework.boot.web.servlet.FilterRegistrationBean; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
|  | ||||
| @@ -21,4 +24,15 @@ public class BpmWebConfiguration { | ||||
|         return YudaoSwaggerAutoConfiguration.buildGroupedOpenApi("bpm"); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 配置 Flowable Web 过滤器 | ||||
|      */ | ||||
|     @Bean | ||||
|     public FilterRegistrationBean<FlowableWebFilter> flowableWebFilter() { | ||||
|         FilterRegistrationBean<FlowableWebFilter> registrationBean = new FilterRegistrationBean<>(); | ||||
|         registrationBean.setFilter(new FlowableWebFilter()); | ||||
|         registrationBean.setOrder(WebFilterOrderEnum.FLOWABLE_FILTER); | ||||
|         return registrationBean; | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -1,16 +1,17 @@ | ||||
| package cn.iocoder.yudao.framework.flowable.core.web; | ||||
| package cn.iocoder.yudao.module.bpm.framework.web.core; | ||||
| 
 | ||||
| import cn.iocoder.yudao.framework.flowable.core.util.FlowableUtils; | ||||
| import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; | ||||
| import org.springframework.web.filter.OncePerRequestFilter; | ||||
| 
 | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; | ||||
| import jakarta.servlet.FilterChain; | ||||
| import jakarta.servlet.ServletException; | ||||
| import jakarta.servlet.http.HttpServletRequest; | ||||
| import jakarta.servlet.http.HttpServletResponse; | ||||
| import org.springframework.web.filter.OncePerRequestFilter; | ||||
| 
 | ||||
| import java.io.IOException; | ||||
| 
 | ||||
| /** | ||||
|  * flowable Web 过滤器,将 userId 设置到 {@link org.flowable.common.engine.impl.identity.Authentication} 中 | ||||
|  * Flowable Web 过滤器,将 userId 设置到 {@link org.flowable.common.engine.impl.identity.Authentication} 中 | ||||
|  * | ||||
|  * @author jason | ||||
|  */ | ||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -9,8 +9,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||||
| import cn.iocoder.yudao.framework.common.util.date.DateUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.number.NumberUtils; | ||||
| import cn.iocoder.yudao.framework.common.util.object.PageUtils; | ||||
| import cn.iocoder.yudao.framework.flowable.core.util.BpmnModelUtils; | ||||
| import cn.iocoder.yudao.framework.flowable.core.util.FlowableUtils; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.BpmnModelUtils; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; | ||||
| import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils; | ||||
| import cn.iocoder.yudao.module.bpm.controller.admin.task.vo.task.*; | ||||
| import cn.iocoder.yudao.module.bpm.convert.task.BpmTaskConvert; | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| package cn.iocoder.yudao.module.bpm.framework.flowable.core.candidate.strategy; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.flowable.core.util.FlowableUtils; | ||||
| import cn.iocoder.yudao.module.bpm.framework.flowable.core.util.FlowableUtils; | ||||
| import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest; | ||||
| import org.flowable.engine.delegate.DelegateExecution; | ||||
| import org.junit.jupiter.api.Test; | ||||
|   | ||||
| @@ -1,37 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project xmlns="http://maven.apache.org/POM/4.0.0" | ||||
|          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||||
|          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> | ||||
|     <parent> | ||||
|         <groupId>cn.iocoder.boot</groupId> | ||||
|         <artifactId>yudao-module-bpm</artifactId> | ||||
|         <version>${revision}</version> | ||||
|     </parent> | ||||
|     <modelVersion>4.0.0</modelVersion> | ||||
|  | ||||
|     <artifactId>yudao-spring-boot-starter-flowable</artifactId> | ||||
|  | ||||
|     <dependencies> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-common</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- Web 相关 --> | ||||
|         <dependency> | ||||
|             <groupId>cn.iocoder.boot</groupId> | ||||
|             <artifactId>yudao-spring-boot-starter-security</artifactId> | ||||
|         </dependency> | ||||
|  | ||||
|         <!-- flowable 工作流相关 --> | ||||
|         <dependency> | ||||
|             <groupId>org.flowable</groupId> | ||||
|             <artifactId>flowable-spring-boot-starter-process</artifactId> | ||||
|         </dependency> | ||||
|         <dependency> | ||||
|             <groupId>org.flowable</groupId> | ||||
|             <artifactId>flowable-spring-boot-starter-actuator</artifactId> | ||||
|         </dependency> | ||||
|     </dependencies> | ||||
|  | ||||
| </project> | ||||
| @@ -1,46 +0,0 @@ | ||||
| package cn.iocoder.yudao.framework.flowable.config; | ||||
|  | ||||
| import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum; | ||||
| import cn.iocoder.yudao.framework.flowable.core.web.FlowableWebFilter; | ||||
| import org.springframework.boot.autoconfigure.AutoConfiguration; | ||||
| import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; | ||||
| import org.springframework.boot.web.servlet.FilterRegistrationBean; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.core.task.AsyncListenableTaskExecutor; | ||||
| import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; | ||||
|  | ||||
| @AutoConfiguration | ||||
| public class YudaoFlowableConfiguration { | ||||
|  | ||||
|     /** | ||||
|      * 参考 {@link org.flowable.spring.boot.FlowableJobConfiguration} 类,创建对应的 AsyncListenableTaskExecutor Bean | ||||
|      * | ||||
|      * 如果不创建,会导致项目启动时,Flowable 报错的问题 | ||||
|      */ | ||||
|     @Bean(name = "applicationTaskExecutor") | ||||
|     @ConditionalOnMissingBean(name = "applicationTaskExecutor") | ||||
|     public AsyncListenableTaskExecutor taskExecutor() { | ||||
|         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); | ||||
|         executor.setCorePoolSize(8); | ||||
|         executor.setMaxPoolSize(8); | ||||
|         executor.setQueueCapacity(100); | ||||
|         executor.setThreadNamePrefix("flowable-task-Executor-"); | ||||
|         executor.setAwaitTerminationSeconds(30); | ||||
|         executor.setWaitForTasksToCompleteOnShutdown(true); | ||||
|         executor.setAllowCoreThreadTimeOut(true); | ||||
|         executor.initialize(); | ||||
|         return executor; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * 配置 flowable Web 过滤器 | ||||
|      */ | ||||
|     @Bean | ||||
|     public FilterRegistrationBean<FlowableWebFilter> flowableWebFilter() { | ||||
|         FilterRegistrationBean<FlowableWebFilter> registrationBean = new FilterRegistrationBean<>(); | ||||
|         registrationBean.setFilter(new FlowableWebFilter()); | ||||
|         registrationBean.setOrder(WebFilterOrderEnum.FLOWABLE_FILTER); | ||||
|         return registrationBean; | ||||
|     } | ||||
|  | ||||
| } | ||||
| @@ -1 +0,0 @@ | ||||
| cn.iocoder.yudao.framework.flowable.config.YudaoFlowableConfiguration | ||||
		Reference in New Issue
	
	Block a user
	 YunaiV
					YunaiV