Bladeren bron

优化listener

zhouhao 6 jaren geleden
bovenliggende
commit
6a69135cfa

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

@@ -1,8 +1,13 @@
 package org.hswebframework.web.workflow.service.imp;
 
 import io.vavr.Lazy;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
 import org.activiti.engine.repository.ProcessDefinition;
 import org.activiti.engine.task.Task;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.hswebframework.expands.script.engine.DynamicScriptEngine;
+import org.hswebframework.expands.script.engine.DynamicScriptEngineFactory;
 import org.hswebframework.web.authorization.Authentication;
 import org.hswebframework.web.authorization.AuthenticationHolder;
 import org.hswebframework.web.authorization.AuthenticationPredicate;
@@ -10,12 +15,15 @@ import org.hswebframework.web.authorization.exception.AccessDenyException;
 import org.hswebframework.web.organizational.authorization.PersonnelAuthentication;
 import org.hswebframework.web.organizational.authorization.PersonnelAuthenticationHolder;
 import org.hswebframework.web.workflow.dao.entity.ActivityConfigEntity;
+import org.hswebframework.web.workflow.dao.entity.ListenerConfig;
 import org.hswebframework.web.workflow.dao.entity.ProcessDefineConfigEntity;
 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.ProcessEvent;
 import org.hswebframework.web.workflow.listener.ProcessEventListener;
+import org.hswebframework.web.workflow.listener.TaskEvent;
 import org.hswebframework.web.workflow.listener.TaskEventListener;
 import org.hswebframework.web.workflow.service.ActivityConfigService;
 import org.hswebframework.web.workflow.service.ProcessDefineConfigService;
@@ -25,10 +33,14 @@ import org.hswebframework.web.workflow.service.config.ActivityConfiguration;
 import org.hswebframework.web.workflow.service.config.ProcessConfiguration;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
 
@@ -37,6 +49,7 @@ import java.util.stream.Collectors;
  * @since 3.0.0-RC
  */
 @Service
+@Slf4j
 public class ProcessConfigurationServiceImpl implements ProcessConfigurationService {
 
     @Autowired
@@ -52,7 +65,7 @@ public class ProcessConfigurationServiceImpl implements ProcessConfigurationServ
     private CandidateDimensionParser candidateDimensionParser;
 
 
-    static final EmptyActivityConfiguration emptyConfiguration = new EmptyActivityConfiguration();
+    private static final EmptyActivityConfiguration emptyConfiguration = new EmptyActivityConfiguration();
 
     @Override
     public ActivityConfiguration getActivityConfiguration(String doingUser, String processDefineId, String activityId) {
@@ -111,11 +124,40 @@ public class ProcessConfigurationServiceImpl implements ProcessConfigurationServ
 
             @Override
             public TaskEventListener getTaskListener(String eventType) {
-                return null;
+                if (CollectionUtils.isEmpty(configEntity.getListeners())) {
+                    return null;
+                }
+                return configEntity
+                        .getListeners()
+                        .stream()
+                        .filter(config -> eventType.equals(config.getEventType()))
+                        .map(ProcessConfigurationServiceImpl.this::<TaskEvent>createTaskEventListener)
+                        .collect(Collectors.collectingAndThen(Collectors.toList(),
+                                list -> event -> list.forEach(listener -> listener.accept(event))));
             }
         };
     }
 
+
+    @SneakyThrows
+    protected <T> Consumer<T> createTaskEventListener(ListenerConfig listenerConfig) {
+        DynamicScriptEngine engine = DynamicScriptEngineFactory.getEngine(listenerConfig.getLanguage());
+        if (null != engine) {
+            String scriptId = DigestUtils.md5Hex(listenerConfig.getScript());
+            if (!engine.compiled(scriptId)) {
+                engine.compile(scriptId, listenerConfig.getScript());
+            }
+            return event -> {
+                Map<String, Object> context = new HashMap<>();
+                context.put("event", event);
+                engine.execute(scriptId, context).getIfSuccess();
+            };
+        } else {
+            log.warn("不支持的脚本语言:{}", listenerConfig.getLanguage());
+        }
+        return null;
+    }
+
     @Override
     public ProcessConfiguration getProcessConfiguration(String processDefineId) {
         ProcessDefineConfigEntity entity = defineConfigService.selectByProcessDefineId(processDefineId);
@@ -149,7 +191,16 @@ public class ProcessConfigurationServiceImpl implements ProcessConfigurationServ
 
             @Override
             public ProcessEventListener getProcessListener(String eventType) {
-                return null;
+                if (CollectionUtils.isEmpty(entity.getListeners())) {
+                    return null;
+                }
+                return entity
+                        .getListeners()
+                        .stream()
+                        .filter(config -> eventType.equals(config.getEventType()))
+                        .map(ProcessConfigurationServiceImpl.this::<ProcessEvent>createTaskEventListener)
+                        .collect(Collectors.collectingAndThen(Collectors.toList(),
+                                list -> event -> list.forEach(listener -> listener.accept(event))));
             }
         };
     }