浏览代码

增加监听器支持

zhouhao 6 年之前
父节点
当前提交
b65ffcee75
共有 16 个文件被更改,包括 226 次插入4 次删除
  1. 5 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dao/entity/ActivityConfigEntity.java
  2. 19 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dao/entity/ListenerConfig.java
  3. 5 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dao/entity/ProcessDefineConfigEntity.java
  4. 8 1
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/flowable/FlowableAutoConfiguration.java
  5. 87 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/listener/GlobalEventListenerDispatcher.java
  6. 13 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/listener/ProcessEvent.java
  7. 11 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/listener/ProcessEventListener.java
  8. 14 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/listener/TaskEvent.java
  9. 9 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/listener/TaskEventListener.java
  10. 4 2
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/config/ActivityConfiguration.java
  11. 6 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/config/ProcessConfiguration.java
  12. 18 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/imp/BpmTaskServiceImpl.java
  13. 22 1
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/imp/ProcessConfigurationServiceImpl.java
  14. 2 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/hsweb-starter.js
  15. 1 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/workflow/ActivityConfigMapper.xml
  16. 2 0
      hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/workflow/ProcessDefineConfigMapper.xml

+ 5 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dao/entity/ActivityConfigEntity.java

@@ -8,6 +8,8 @@ import org.hswebframework.web.validator.group.CreateGroup;
 
 import javax.validation.constraints.NotNull;
 import java.util.Date;
+import java.util.List;
+import java.util.Map;
 
 @Getter
 @Setter
@@ -50,4 +52,7 @@ public class ActivityConfigEntity extends SimpleGenericEntity<String> {
 
     @NotNull(groups = CreateGroup.class)
     private Byte status;
+
+    private List<ListenerConfig> listeners;
+
 }

+ 19 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dao/entity/ListenerConfig.java

@@ -0,0 +1,19 @@
+package org.hswebframework.web.workflow.dao.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+@Getter
+@Setter
+public class ListenerConfig {
+    private String eventType;
+
+    private String language;
+
+    private String script;
+
+}

+ 5 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/dao/entity/ProcessDefineConfigEntity.java

@@ -8,6 +8,8 @@ import org.hswebframework.web.validator.group.CreateGroup;
 
 import javax.validation.constraints.NotNull;
 import java.util.Date;
+import java.util.List;
+import java.util.Map;
 
 @Getter
 @Setter
@@ -46,4 +48,7 @@ public class ProcessDefineConfigEntity extends SimpleGenericEntity<String> {
      */
     @NotNull(groups = CreateGroup.class)
     private Byte status;
+
+    private List<ListenerConfig> listeners;
+
 }

+ 8 - 1
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/flowable/FlowableAutoConfiguration.java

@@ -1,5 +1,6 @@
 package org.hswebframework.web.workflow.flowable;
 
+import org.activiti.engine.delegate.event.ActivitiEventListener;
 import org.activiti.engine.impl.interceptor.SessionFactory;
 import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
 import org.hswebframework.web.dao.Dao;
@@ -20,12 +21,15 @@ import java.util.List;
 @Configuration
 @AutoConfigureAfter(FlowableAutoConfiguration.CustomEntityManagerAutoConfiguration.class)
 @MapperScan(value = "org.hswebframework.web.workflow.dao", markerInterface = Dao.class
-        ,sqlSessionFactoryRef = "sqlSessionFactory")
+        , sqlSessionFactoryRef = "sqlSessionFactory")
 public class FlowableAutoConfiguration {
 
     @Autowired(required = false)
     private List<SessionFactory> sessionFactories;
 
+    @Autowired(required = false)
+    private List<ActivitiEventListener> activitiEventListeners;
+
     @Bean
     public ProcessEngineConfigurationConfigurer processEngineConfigurationConfigurer() {
         return configuration -> {
@@ -37,6 +41,9 @@ public class FlowableAutoConfiguration {
                     .setLabelFontName("宋体")
                     .setAnnotationFontName("宋体");
 
+            if (activitiEventListeners != null) {
+                configuration.setEventListeners(activitiEventListeners);
+            }
             if (sessionFactories != null) {
                 configuration.setCustomSessionFactories(sessionFactories);
             }

+ 87 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/listener/GlobalEventListenerDispatcher.java

@@ -0,0 +1,87 @@
+package org.hswebframework.web.workflow.listener;
+
+import org.activiti.engine.RuntimeService;
+import org.activiti.engine.delegate.event.ActivitiEntityEvent;
+import org.activiti.engine.delegate.event.ActivitiEvent;
+import org.activiti.engine.delegate.event.ActivitiEventListener;
+import org.activiti.engine.impl.persistence.entity.TaskEntity;
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+import org.hswebframework.web.authorization.Authentication;
+import org.hswebframework.web.authorization.User;
+import org.hswebframework.web.workflow.service.ProcessDefineConfigService;
+import org.hswebframework.web.workflow.service.config.ActivityConfiguration;
+import org.hswebframework.web.workflow.service.config.ProcessConfiguration;
+import org.hswebframework.web.workflow.service.config.ProcessConfigurationService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+@Component
+public class GlobalEventListenerDispatcher implements ActivitiEventListener {
+
+    @Autowired
+    private ProcessConfigurationService processConfigurationService;
+
+    @Autowired
+    @Lazy
+    private RuntimeService runtimeService;
+
+    @Override
+    public void onEvent(ActivitiEvent event) {
+        String eventType = event.getType().name().toLowerCase();
+        if (event instanceof ActivitiEntityEvent) {
+            ActivitiEntityEvent entityEvent = ((ActivitiEntityEvent) event);
+
+            Object entity = entityEvent.getEntity();
+            if (entity instanceof TaskEntity) {
+                //task事件
+                TaskEntity task = ((TaskEntity) entity);
+                ActivityConfiguration activityConfiguration = processConfigurationService.getActivityConfiguration(
+                        Authentication.current().map(Authentication::getUser)
+                                .map(User::getId).orElse(null)
+                        , event.getProcessDefinitionId()
+                        , task.getTaskDefinitionKey()
+                );
+                TaskEventListener listener = activityConfiguration.getTaskListener(eventType);
+                if (null != listener) {
+                    listener.doEvent(new TaskEvent() {
+                        @Override
+                        public Task getTask() {
+                            return task;
+                        }
+
+                        @Override
+                        public ProcessInstance getProcessInstance() {
+                            return runtimeService
+                                    .createProcessInstanceQuery()
+                                    .processInstanceId(event.getProcessInstanceId())
+                                    .singleResult();
+                        }
+                    });
+                }
+            }
+        }
+        if (eventType.startsWith("process")) {
+            ProcessConfiguration configuration = processConfigurationService.getProcessConfiguration(event.getProcessDefinitionId());
+            ProcessEventListener listener = configuration.getProcessListener(eventType);
+            if (null != listener) {
+                listener.doEvent(() -> runtimeService
+                        .createProcessInstanceQuery()
+                        .processInstanceId(event.getProcessInstanceId())
+                        .singleResult());
+            }
+        }
+
+
+    }
+
+    @Override
+    public boolean isFailOnException() {
+        return false;
+    }
+}

+ 13 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/listener/ProcessEvent.java

@@ -0,0 +1,13 @@
+package org.hswebframework.web.workflow.listener;
+
+import org.activiti.engine.runtime.ProcessInstance;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+public interface ProcessEvent {
+
+      ProcessInstance getProcessInstance();
+
+}

+ 11 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/listener/ProcessEventListener.java

@@ -0,0 +1,11 @@
+package org.hswebframework.web.workflow.listener;
+
+/**
+ *
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+public interface ProcessEventListener {
+
+    void doEvent(ProcessEvent event);
+}

+ 14 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/listener/TaskEvent.java

@@ -0,0 +1,14 @@
+package org.hswebframework.web.workflow.listener;
+
+import org.activiti.engine.runtime.ProcessInstance;
+import org.activiti.engine.task.Task;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+public interface TaskEvent {
+    Task getTask();
+
+    ProcessInstance getProcessInstance();
+}

+ 9 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/listener/TaskEventListener.java

@@ -0,0 +1,9 @@
+package org.hswebframework.web.workflow.listener;
+
+/**
+ * @author zhouhao
+ * @since 3.0.0-RC
+ */
+public interface TaskEventListener {
+    void doEvent(TaskEvent event);
+}

+ 4 - 2
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/config/ActivityConfiguration.java

@@ -1,10 +1,11 @@
 package org.hswebframework.web.workflow.service.config;
 
-import org.activiti.engine.runtime.ProcessInstance;
 import org.activiti.engine.task.Task;
 import org.hswebframework.web.authorization.User;
+import org.hswebframework.web.workflow.listener.TaskEventListener;
 
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author zhouhao
@@ -28,7 +29,7 @@ public interface ActivityConfiguration {
      * @see User
      * @see org.hswebframework.web.authorization.Authentication
      */
-    boolean canClaim(Task task,String userId);
+    boolean canClaim(Task task, String userId);
 
     /**
      * 获取此任务的所有候选人信息
@@ -37,4 +38,5 @@ public interface ActivityConfiguration {
      */
     List<CandidateInfo> getCandidateInfo(Task task);
 
+    TaskEventListener getTaskListener(String eventType);
 }

+ 6 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/config/ProcessConfiguration.java

@@ -2,6 +2,9 @@ package org.hswebframework.web.workflow.service.config;
 
 
 import org.activiti.engine.repository.ProcessDefinition;
+import org.hswebframework.web.workflow.listener.ProcessEventListener;
+
+import java.util.Map;
 
 /**
  * @author zhouhao
@@ -13,4 +16,7 @@ public interface ProcessConfiguration {
     void assertCanStartProcess(String userId, ProcessDefinition definition);
 
     boolean canStartProcess(String userId, ProcessDefinition definition);
+
+    ProcessEventListener getProcessListener(String eventType);
+
 }

+ 18 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/imp/BpmTaskServiceImpl.java

@@ -22,6 +22,8 @@ import org.hswebframework.web.BusinessException;
 import org.hswebframework.web.Maps;
 import org.hswebframework.web.NotFoundException;
 import org.hswebframework.web.authorization.Authentication;
+import org.hswebframework.web.commons.entity.PagerResult;
+import org.hswebframework.web.commons.entity.param.QueryParamEntity;
 import org.hswebframework.web.workflow.dao.entity.ProcessHistoryEntity;
 import org.hswebframework.web.workflow.service.ProcessHistoryService;
 import org.hswebframework.web.workflow.service.config.ProcessConfigurationService;
@@ -146,6 +148,22 @@ public class BpmTaskServiceImpl extends AbstractFlowableService implements BpmTa
                 .processInstanceId(task.getProcessInstanceId())
                 .singleResult();
 
+        //查询主表的数据作为变量
+        Optional.of(workFlowFormService.<Map<String, Object>>selectProcessForm(instance.getProcessDefinitionId(),
+                QueryParamEntity.of("processInstanceId", instance.getProcessInstanceId()).doPaging(0, 2)))
+                .map(PagerResult::getData)
+                .map(list -> {
+                    if (list.size() == 1) {
+                        return list.get(0);
+                    }
+                    if (list.size() > 1) {
+                        logger.warn("主表数据存在多条数据:processInstanceId={}", instance.getProcessInstanceId());
+                    }
+                    return null;
+                })
+                .ifPresent(transientVariables::putAll);
+
+
         //保存表单数据
         workFlowFormService.saveTaskForm(instance, task, SaveFormRequest.builder()
                 .userName(request.getCompleteUserName())

+ 22 - 1
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/java/org/hswebframework/web/workflow/service/imp/ProcessConfigurationServiceImpl.java

@@ -15,6 +15,8 @@ import org.hswebframework.web.workflow.dimension.CandidateDimension;
 import org.hswebframework.web.workflow.dimension.CandidateDimensionParser;
 import org.hswebframework.web.workflow.dimension.DimensionContext;
 import org.hswebframework.web.workflow.dimension.PermissionDimensionParser;
+import org.hswebframework.web.workflow.listener.ProcessEventListener;
+import org.hswebframework.web.workflow.listener.TaskEventListener;
 import org.hswebframework.web.workflow.service.ActivityConfigService;
 import org.hswebframework.web.workflow.service.ProcessDefineConfigService;
 import org.hswebframework.web.workflow.service.config.ProcessConfigurationService;
@@ -106,6 +108,11 @@ public class ProcessConfigurationServiceImpl implements ProcessConfigurationServ
 
                 }, List.class);
             }
+
+            @Override
+            public TaskEventListener getTaskListener(String eventType) {
+                return null;
+            }
         };
     }
 
@@ -139,6 +146,11 @@ public class ProcessConfigurationServiceImpl implements ProcessConfigurationServ
                 }
                 return true;
             }
+
+            @Override
+            public ProcessEventListener getProcessListener(String eventType) {
+                return null;
+            }
         };
     }
 
@@ -161,12 +173,21 @@ public class ProcessConfigurationServiceImpl implements ProcessConfigurationServ
 
         @Override
         public void assertCanStartProcess(String userId, ProcessDefinition definition) {
-            // throw new AccessDenyException("没有权限启动此流程:" + definition.getName() + "(" + definition.getId() + ")");
         }
 
         @Override
         public boolean canStartProcess(String userId, ProcessDefinition definition) {
             return true;
         }
+
+        @Override
+        public ProcessEventListener getProcessListener(String eventType) {
+            return null;
+        }
+
+        @Override
+        public TaskEventListener getTaskListener(String eventType) {
+            return null;
+        }
     }
 }

+ 2 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/hsweb-starter.js

@@ -31,6 +31,7 @@ function install(context) {
         .addColumn().name("create_time").alias("createTime").comment("创建时间").datetime().commit()
         .addColumn().name("update_time").alias("updateTime").comment("修改时间").datetime().commit()
         .addColumn().name("status").alias("status").comment("状态").jdbcType(java.sql.JDBCType.TINYINT).commit()
+        .addColumn().name("listeners").alias("listeners").comment("监听器配置").jdbcType(java.sql.JDBCType.CLOB).commit()
         .comment("工作流流程自定义配置")
         .commit();
 
@@ -45,6 +46,7 @@ function install(context) {
         .addColumn().name("update_time").alias("updateTime").comment("修改时间").datetime().commit()
         .addColumn().name("status").alias("status").comment("状态").jdbcType(java.sql.JDBCType.TINYINT).commit()
         .addColumn().name("properties").alias("properties").comment("其他配置").jdbcType(java.sql.JDBCType.CLOB).commit()
+        .addColumn().name("listeners").alias("listeners").comment("监听器配置").jdbcType(java.sql.JDBCType.CLOB).commit()
         .comment("工作流环节自定义配置")
         .commit();
 

+ 1 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/workflow/ActivityConfigMapper.xml

@@ -15,6 +15,7 @@
         <result property="createTime" column="create_time" javaType="date" jdbcType="TIMESTAMP"/>
         <result property="updateTime" column="update_time" javaType="date" jdbcType="TIMESTAMP"/>
         <result property="status" column="status" javaType="Byte" jdbcType="TINYINT"/>
+        <result property="listeners" column="listeners" javaType="java.util.List" jdbcType="CLOB"/>
 
     </resultMap>
 

+ 2 - 0
hsweb-system/hsweb-system-workflow/hsweb-system-workflow-local/src/main/resources/org/hswebframework/web/dao/mybatis/mappers/workflow/ProcessDefineConfigMapper.xml

@@ -15,6 +15,8 @@
         <result property="updateTime" column="update_time" javaType="date" jdbcType="TIMESTAMP"/>
         <result property="status" column="status" javaType="Byte" jdbcType="TINYINT"/>
 
+        <result property="listeners" column="listeners" javaType="java.util.List" jdbcType="CLOB"/>
+
     </resultMap>
 
     <!--用于动态生成sql所需的配置-->