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 3 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmProcessInstanceExtDO;
4 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 3 import cn.hutool.core.util.StrUtil;
4 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 3 import cn.iocoder.yudao.adminserver.modules.bpm.dal.dataobject.task.BpmTaskExtDO;
4 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 8 import org.activiti.api.task.model.Task;
6 9 import org.activiti.api.task.model.events.TaskRuntimeEvent;
7 10 import org.activiti.api.task.runtime.events.listener.TaskEventListener;
  11 +import org.activiti.api.task.runtime.events.listener.TaskRuntimeEventListener;
8 12 import org.springframework.context.annotation.Lazy;
9 13 import org.springframework.stereotype.Component;
10 14  
... ... @@ -16,15 +20,22 @@ import javax.annotation.Resource;
16 20 * @author 芋道源码
17 21 */
18 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 26 @Resource
23 27 @Lazy // 解决循环依赖
24 28 private BpmTaskService taskService;
25 29  
26 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 40 if (event.getEventType() == TaskRuntimeEvent.TaskEvents.TASK_CREATED) {
30 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 15 import cn.iocoder.yudao.framework.common.util.object.PageUtils;
16 16 import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
17 17 import lombok.extern.slf4j.Slf4j;
  18 +import org.activiti.bpmn.converter.BpmnXMLConverter;
  19 +import org.activiti.bpmn.model.BpmnModel;
18 20 import org.activiti.engine.RepositoryService;
19 21 import org.activiti.engine.impl.persistence.entity.SuspensionState;
  22 +import org.activiti.engine.impl.util.io.StringStreamSource;
20 23 import org.activiti.engine.repository.Deployment;
21 24 import org.activiti.engine.repository.Model;
22 25 import org.activiti.engine.repository.ModelQuery;
... ... @@ -27,6 +30,8 @@ import org.springframework.util.ObjectUtils;
27 30 import org.springframework.validation.annotation.Validated;
28 31  
29 32 import javax.annotation.Resource;
  33 +import javax.xml.stream.XMLInputFactory;
  34 +import javax.xml.stream.XMLStreamReader;
30 35 import java.util.HashSet;
31 36 import java.util.List;
32 37 import java.util.Map;
... ... @@ -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 87 runtimeService.setProcessInstanceName(instance.getId(), definition.getName());
88 88  
89 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 93 // 添加初始的评论 TODO 芋艿:在思考下
94 94 // Task task = taskService.createTaskQuery().processInstanceId(instance.getId()).singleResult();
... ...