Commit 645fd7624b8238ae251bb7f36acbeaf84b3dcc14
1 parent
9734eacf
增加 BpmUserTaskActivitiBehavior 自定义实现,为后续做自定义的任务分配机制做准备
Showing
9 changed files
with
144 additions
and
34 deletions
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/BpmActivitiConfiguration.java deleted
| 1 | -package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti; | ||
| 2 | - | ||
| 3 | -import cn.iocoder.yudao.adminserver.modules.bpm.service.task.listener.BpmTackActivitiEventListener; | ||
| 4 | -import org.activiti.spring.SpringProcessEngineConfiguration; | ||
| 5 | -import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer; | ||
| 6 | -import org.springframework.context.annotation.Configuration; | ||
| 7 | - | ||
| 8 | -import javax.annotation.Resource; | ||
| 9 | -import java.util.Collections; | ||
| 10 | - | ||
| 11 | -/** | ||
| 12 | - * BPM 模块的 Activiti 配置类 | ||
| 13 | - */ | ||
| 14 | -@Configuration | ||
| 15 | -public class BpmActivitiConfiguration implements ProcessEngineConfigurationConfigurer { | ||
| 16 | - | ||
| 17 | - @Resource | ||
| 18 | - private BpmTackActivitiEventListener taskActivitiEventListener; | ||
| 19 | - | ||
| 20 | - @Override | ||
| 21 | - public void configure(SpringProcessEngineConfiguration configuration) { | ||
| 22 | - // 注册监听器,例如说 BpmActivitiEventListener | ||
| 23 | - configuration.setEventListeners(Collections.singletonList(taskActivitiEventListener)); | ||
| 24 | - } | ||
| 25 | - | ||
| 26 | -} |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/config/BpmActivitiConfiguration.java
0 → 100644
| 1 | +package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.config; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.BpmActivityBehaviorFactory; | ||
| 4 | +import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener.BpmTackActivitiEventListener; | ||
| 5 | +import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer; | ||
| 6 | +import org.springframework.context.annotation.Bean; | ||
| 7 | +import org.springframework.context.annotation.Configuration; | ||
| 8 | + | ||
| 9 | +import java.util.Collections; | ||
| 10 | + | ||
| 11 | +import static org.activiti.spring.boot.ProcessEngineAutoConfiguration.BEHAVIOR_FACTORY_MAPPING_CONFIGURER; | ||
| 12 | + | ||
| 13 | +/** | ||
| 14 | + * BPM 模块的 Activiti 配置类 | ||
| 15 | + */ | ||
| 16 | +@Configuration | ||
| 17 | +public class BpmActivitiConfiguration { | ||
| 18 | + | ||
| 19 | + /** | ||
| 20 | + * BPM 模块的 ProcessEngineConfigurationConfigurer 实现类,主要设置各种监听器 | ||
| 21 | + */ | ||
| 22 | + @Bean | ||
| 23 | + public ProcessEngineConfigurationConfigurer bpmProcessEngineConfigurationConfigurer( | ||
| 24 | + BpmTackActivitiEventListener taskActivitiEventListener) { | ||
| 25 | + return configuration -> { | ||
| 26 | + // 注册监听器,例如说 BpmActivitiEventListener | ||
| 27 | + configuration.setEventListeners(Collections.singletonList(taskActivitiEventListener)); | ||
| 28 | + }; | ||
| 29 | + } | ||
| 30 | + | ||
| 31 | + /** | ||
| 32 | + * 用于设置自定义的 ActivityBehaviorFactory 实现的 ProcessEngineConfigurationConfigurer 实现类 | ||
| 33 | + * | ||
| 34 | + * 目的:覆盖 {@link org.activiti.spring.boot.ProcessEngineAutoConfiguration} 的 | ||
| 35 | + * defaultActivityBehaviorFactoryMappingConfigurer 方法创建的 Bean | ||
| 36 | + */ | ||
| 37 | + @Bean(name = BEHAVIOR_FACTORY_MAPPING_CONFIGURER) | ||
| 38 | + public ProcessEngineConfigurationConfigurer defaultActivityBehaviorFactoryMappingConfigurer( | ||
| 39 | + BpmActivityBehaviorFactory bpmActivityBehaviorFactory) { | ||
| 40 | + return configuration -> { | ||
| 41 | + // 设置 ActivityBehaviorFactory 实现类,用于流程任务的审核人的自定义 | ||
| 42 | + configuration.setActivityBehaviorFactory(bpmActivityBehaviorFactory); | ||
| 43 | + }; | ||
| 44 | + } | ||
| 45 | + | ||
| 46 | + @Bean | ||
| 47 | + public BpmActivityBehaviorFactory bpmActivityBehaviorFactory() { | ||
| 48 | + return new BpmActivityBehaviorFactory(); | ||
| 49 | + } | ||
| 50 | + | ||
| 51 | +} |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmActivityBehaviorFactory.java
0 → 100644
| 1 | +package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior; | ||
| 2 | + | ||
| 3 | +import cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior.BpmUserTaskActivitiBehavior; | ||
| 4 | +import lombok.Data; | ||
| 5 | +import lombok.EqualsAndHashCode; | ||
| 6 | +import lombok.ToString; | ||
| 7 | +import org.activiti.bpmn.model.UserTask; | ||
| 8 | +import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior; | ||
| 9 | +import org.activiti.engine.impl.bpmn.parser.factory.DefaultActivityBehaviorFactory; | ||
| 10 | + | ||
| 11 | +/** | ||
| 12 | + * 自定义的 ActivityBehaviorFactory 实现类,目的如下: | ||
| 13 | + * 1. 自定义 {@link #createUserTaskActivityBehavior(UserTask)}:实现自定义的流程任务的 assignee 负责人的分配 | ||
| 14 | + * | ||
| 15 | + * @author 芋道源码 | ||
| 16 | + */ | ||
| 17 | +@Data | ||
| 18 | +@EqualsAndHashCode(callSuper = true) | ||
| 19 | +@ToString(callSuper = true) | ||
| 20 | +public class BpmActivityBehaviorFactory extends DefaultActivityBehaviorFactory { | ||
| 21 | + | ||
| 22 | + @Override | ||
| 23 | + public UserTaskActivityBehavior createUserTaskActivityBehavior(UserTask userTask) { | ||
| 24 | + return new BpmUserTaskActivitiBehavior(userTask); | ||
| 25 | + } | ||
| 26 | + | ||
| 27 | + // TODO 芋艿:并行任务 ParallelMultiInstanceBehavior | ||
| 28 | + | ||
| 29 | + // TODO 芋艿:并行任务 SequentialMultiInstanceBehavior | ||
| 30 | + | ||
| 31 | +} |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/behavior/BpmUserTaskActivitiBehavior.java
0 → 100644
| 1 | +package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.behavior; | ||
| 2 | + | ||
| 3 | +import org.activiti.bpmn.model.UserTask; | ||
| 4 | +import org.activiti.engine.delegate.DelegateExecution; | ||
| 5 | +import org.activiti.engine.impl.bpmn.behavior.UserTaskActivityBehavior; | ||
| 6 | +import org.activiti.engine.impl.el.ExpressionManager; | ||
| 7 | +import org.activiti.engine.impl.persistence.entity.TaskEntity; | ||
| 8 | +import org.activiti.engine.impl.persistence.entity.TaskEntityManager; | ||
| 9 | + | ||
| 10 | +import java.util.List; | ||
| 11 | + | ||
| 12 | +/** | ||
| 13 | + * 自定义的流程任务的 assignee 负责人的分配 | ||
| 14 | + * | ||
| 15 | + * @author 芋道源码 | ||
| 16 | + */ | ||
| 17 | +public class BpmUserTaskActivitiBehavior extends UserTaskActivityBehavior { | ||
| 18 | + | ||
| 19 | + public BpmUserTaskActivitiBehavior(UserTask userTask) { | ||
| 20 | + super(userTask); | ||
| 21 | + } | ||
| 22 | + | ||
| 23 | + @Override | ||
| 24 | + protected void handleAssignments(TaskEntityManager taskEntityManager, | ||
| 25 | + String assignee, String owner, List<String> candidateUsers, List<String> candidateGroups, | ||
| 26 | + TaskEntity task, ExpressionManager expressionManager, DelegateExecution execution) { | ||
| 27 | + System.out.println(""); | ||
| 28 | + taskEntityManager.changeTaskAssignee(task, "1"); | ||
| 29 | + } | ||
| 30 | + | ||
| 31 | +} |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/listener/BpmProcessInstanceEventListener.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmProcessInstanceEventListener.java
| 1 | -package cn.iocoder.yudao.adminserver.modules.bpm.service.task.listener; | 1 | +package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; | 3 | import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO; |
| 4 | import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; | 4 | import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmProcessInstanceService; |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/listener/BpmTackActivitiEventListener.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTackActivitiEventListener.java
| 1 | -package cn.iocoder.yudao.adminserver.modules.bpm.service.task.listener; | 1 | +package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener; |
| 2 | 2 | ||
| 3 | import cn.hutool.core.util.StrUtil; | 3 | import cn.hutool.core.util.StrUtil; |
| 4 | import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; | 4 | import cn.iocoder.yudao.adminserver.modules.bpm.service.definition.BpmProcessDefinitionService; |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/listener/BpmTaskEventListener.java renamed to yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/framework/activiti/core/listener/BpmTaskEventListener.java
| 1 | -package cn.iocoder.yudao.adminserver.modules.bpm.service.task.listener; | 1 | +package cn.iocoder.yudao.adminserver.modules.bpm.framework.activiti.core.listener; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmTaskExtDO; | 3 | import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmTaskExtDO; |
| 4 | import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService; | 4 | import cn.iocoder.yudao.adminserver.modules.bpm.service.task.BpmTaskService; |
| 5 | +import org.activiti.api.model.shared.event.RuntimeEvent; | ||
| 6 | +import org.activiti.api.process.model.ProcessInstance; | ||
| 7 | +import org.activiti.api.process.model.events.ProcessRuntimeEvent; | ||
| 5 | import org.activiti.api.task.model.Task; | 8 | import org.activiti.api.task.model.Task; |
| 6 | import org.activiti.api.task.model.events.TaskRuntimeEvent; | 9 | import org.activiti.api.task.model.events.TaskRuntimeEvent; |
| 7 | import org.activiti.api.task.runtime.events.listener.TaskEventListener; | 10 | import org.activiti.api.task.runtime.events.listener.TaskEventListener; |
| 11 | +import org.activiti.api.task.runtime.events.listener.TaskRuntimeEventListener; | ||
| 8 | import org.springframework.context.annotation.Lazy; | 12 | import org.springframework.context.annotation.Lazy; |
| 9 | import org.springframework.stereotype.Component; | 13 | import org.springframework.stereotype.Component; |
| 10 | 14 | ||
| @@ -16,15 +20,22 @@ import javax.annotation.Resource; | @@ -16,15 +20,22 @@ import javax.annotation.Resource; | ||
| 16 | * @author 芋道源码 | 20 | * @author 芋道源码 |
| 17 | */ | 21 | */ |
| 18 | @Component | 22 | @Component |
| 19 | -public class BpmTaskEventListener<T extends TaskRuntimeEvent<? extends Task>> | ||
| 20 | - implements TaskEventListener<T> { | 23 | +public class BpmTaskEventListener<T extends RuntimeEvent<?, ?>> |
| 24 | + implements TaskRuntimeEventListener<T> { | ||
| 21 | 25 | ||
| 22 | @Resource | 26 | @Resource |
| 23 | @Lazy // 解决循环依赖 | 27 | @Lazy // 解决循环依赖 |
| 24 | private BpmTaskService taskService; | 28 | private BpmTaskService taskService; |
| 25 | 29 | ||
| 26 | @Override | 30 | @Override |
| 27 | - public void onEvent(T event) { | 31 | + @SuppressWarnings("unchecked") |
| 32 | + public void onEvent(T rawEvent) { | ||
| 33 | + // 由于 TaskRuntimeEventListener 无法保证只监听 TaskRuntimeEvent 事件,所以通过这样的方式 | ||
| 34 | + if (!(rawEvent instanceof TaskRuntimeEvent)) { | ||
| 35 | + return; | ||
| 36 | + } | ||
| 37 | + TaskRuntimeEvent<Task> event = (TaskRuntimeEvent<Task>) rawEvent; | ||
| 38 | + | ||
| 28 | // 创建时,插入拓展表 | 39 | // 创建时,插入拓展表 |
| 29 | if (event.getEventType() == TaskRuntimeEvent.TaskEvents.TASK_CREATED) { | 40 | if (event.getEventType() == TaskRuntimeEvent.TaskEvents.TASK_CREATED) { |
| 30 | taskService.createTaskExt(event.getEntity()); | 41 | taskService.createTaskExt(event.getEntity()); |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/model/impl/BpmModelServiceImpl.java
| @@ -15,8 +15,11 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | @@ -15,8 +15,11 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | ||
| 15 | import cn.iocoder.yudao.framework.common.util.object.PageUtils; | 15 | import cn.iocoder.yudao.framework.common.util.object.PageUtils; |
| 16 | import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; | 16 | import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; |
| 17 | import lombok.extern.slf4j.Slf4j; | 17 | import lombok.extern.slf4j.Slf4j; |
| 18 | +import org.activiti.bpmn.converter.BpmnXMLConverter; | ||
| 19 | +import org.activiti.bpmn.model.BpmnModel; | ||
| 18 | import org.activiti.engine.RepositoryService; | 20 | import org.activiti.engine.RepositoryService; |
| 19 | import org.activiti.engine.impl.persistence.entity.SuspensionState; | 21 | import org.activiti.engine.impl.persistence.entity.SuspensionState; |
| 22 | +import org.activiti.engine.impl.util.io.StringStreamSource; | ||
| 20 | import org.activiti.engine.repository.Deployment; | 23 | import org.activiti.engine.repository.Deployment; |
| 21 | import org.activiti.engine.repository.Model; | 24 | import org.activiti.engine.repository.Model; |
| 22 | import org.activiti.engine.repository.ModelQuery; | 25 | import org.activiti.engine.repository.ModelQuery; |
| @@ -27,6 +30,8 @@ import org.springframework.util.ObjectUtils; | @@ -27,6 +30,8 @@ import org.springframework.util.ObjectUtils; | ||
| 27 | import org.springframework.validation.annotation.Validated; | 30 | import org.springframework.validation.annotation.Validated; |
| 28 | 31 | ||
| 29 | import javax.annotation.Resource; | 32 | import javax.annotation.Resource; |
| 33 | +import javax.xml.stream.XMLInputFactory; | ||
| 34 | +import javax.xml.stream.XMLStreamReader; | ||
| 30 | import java.util.HashSet; | 35 | import java.util.HashSet; |
| 31 | import java.util.List; | 36 | import java.util.List; |
| 32 | import java.util.Map; | 37 | import java.util.Map; |
| @@ -211,4 +216,11 @@ public class BpmModelServiceImpl implements BpmModelService { | @@ -211,4 +216,11 @@ public class BpmModelServiceImpl implements BpmModelService { | ||
| 211 | } | 216 | } |
| 212 | } | 217 | } |
| 213 | 218 | ||
| 219 | +// public static void main(String[] args) { | ||
| 220 | +// // 创建转换对象 | ||
| 221 | +// BpmnXMLConverter converter = new BpmnXMLConverter(); | ||
| 222 | +// BpmnModel bpmnModel = converter.convertToBpmnModel(new StringStreamSource(""), true, true); | ||
| 223 | +// bpmnModel.getProcesses() | ||
| 224 | +// } | ||
| 225 | + | ||
| 214 | } | 226 | } |
yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/bpm/service/task/impl/BpmProcessInstanceServiceImpl.java
| @@ -87,8 +87,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | @@ -87,8 +87,8 @@ public class BpmProcessInstanceServiceImpl implements BpmProcessInstanceService | ||
| 87 | runtimeService.setProcessInstanceName(instance.getId(), definition.getName()); | 87 | runtimeService.setProcessInstanceName(instance.getId(), definition.getName()); |
| 88 | 88 | ||
| 89 | // TODO 芋艿:临时使用, 保证分配 | 89 | // TODO 芋艿:临时使用, 保证分配 |
| 90 | - List<Task> tasks = taskService.getTasksByProcessInstanceId(instance.getId()); | ||
| 91 | - tasks.forEach(task -> taskService.updateTaskAssign(task.getId(), userId)); | 90 | +// List<Task> tasks = taskService.getTasksByProcessInstanceId(instance.getId()); |
| 91 | +// tasks.forEach(task -> taskService.updateTaskAssign(task.getId(), userId)); | ||
| 92 | 92 | ||
| 93 | // 添加初始的评论 TODO 芋艿:在思考下 | 93 | // 添加初始的评论 TODO 芋艿:在思考下 |
| 94 | // Task task = taskService.createTaskQuery().processInstanceId(instance.getId()).singleResult(); | 94 | // Task task = taskService.createTaskQuery().processInstanceId(instance.getId()).singleResult(); |