Commit 645fd7624b8238ae251bb7f36acbeaf84b3dcc14

Authored by YunaiV
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();