Explorar el Código

update SpEL表达式回显名称

AprilWind hace 1 año
padre
commit
446a14b928

+ 1 - 1
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java

@@ -40,7 +40,7 @@ public enum TaskAssigneeEnum {
     /**
     /**
      * SPEL表达式
      * SPEL表达式
      */
      */
-    SPEL("SPEL表达式", "");
+    SPEL("SpEL表达式", "");
 
 
     private final String desc;
     private final String desc;
     private final String code;
     private final String code;

+ 20 - 4
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwSpelService.java

@@ -2,13 +2,14 @@ package org.dromara.workflow.service;
 
 
 import org.dromara.common.core.domain.dto.TaskAssigneeDTO;
 import org.dromara.common.core.domain.dto.TaskAssigneeDTO;
 import org.dromara.common.core.domain.model.TaskAssigneeBody;
 import org.dromara.common.core.domain.model.TaskAssigneeBody;
+import org.dromara.common.mybatis.core.page.PageQuery;
+import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.workflow.domain.bo.FlowSpelBo;
 import org.dromara.workflow.domain.bo.FlowSpelBo;
 import org.dromara.workflow.domain.vo.FlowSpelVo;
 import org.dromara.workflow.domain.vo.FlowSpelVo;
-import org.dromara.common.mybatis.core.page.TableDataInfo;
-import org.dromara.common.mybatis.core.page.PageQuery;
 
 
 import java.util.Collection;
 import java.util.Collection;
 import java.util.List;
 import java.util.List;
+import java.util.Map;
 
 
 /**
 /**
  * 流程spel达式定义Service接口
  * 流程spel达式定义Service接口
@@ -18,8 +19,6 @@ import java.util.List;
  */
  */
 public interface IFlwSpelService {
 public interface IFlwSpelService {
 
 
-    TaskAssigneeDTO selectSpelByTaskAssigneeList(TaskAssigneeBody taskQuery);
-
     /**
     /**
      * 查询流程spel达式定义
      * 查询流程spel达式定义
      *
      *
@@ -69,4 +68,21 @@ public interface IFlwSpelService {
      * @return 是否删除成功
      * @return 是否删除成功
      */
      */
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
     Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+
+    /**
+     * 查询spel并返回任务指派的列表,支持分页
+     *
+     * @param taskQuery 查询条件
+     * @return 办理人
+     */
+    TaskAssigneeDTO selectSpelByTaskAssigneeList(TaskAssigneeBody taskQuery);
+
+    /**
+     * 根据视图 SpEL 表达式列表,查询对应的备注信息
+     *
+     * @param viewSpels SpEL 表达式列表
+     * @return 映射表:key 为 SpEL 表达式,value 为对应备注;若为空则返回空 Map
+     */
+    Map<String, String> selectRemarksBySpels(List<String> viewSpels);
+
 }
 }

+ 45 - 20
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwSpelServiceImpl.java

@@ -1,9 +1,11 @@
 package org.dromara.workflow.service.impl;
 package org.dromara.workflow.service.impl;
 
 
+import cn.hutool.core.collection.CollUtil;
 import org.dromara.common.core.constant.SystemConstants;
 import org.dromara.common.core.constant.SystemConstants;
 import org.dromara.common.core.domain.dto.TaskAssigneeDTO;
 import org.dromara.common.core.domain.dto.TaskAssigneeDTO;
 import org.dromara.common.core.domain.model.TaskAssigneeBody;
 import org.dromara.common.core.domain.model.TaskAssigneeBody;
 import org.dromara.common.core.utils.MapstructUtils;
 import org.dromara.common.core.utils.MapstructUtils;
+import org.dromara.common.core.utils.StreamUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.PageQuery;
@@ -20,6 +22,7 @@ import org.dromara.workflow.mapper.FlwSpelMapper;
 import org.dromara.workflow.service.IFlwSpelService;
 import org.dromara.workflow.service.IFlwSpelService;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
+import java.util.Collections;
 import java.util.List;
 import java.util.List;
 import java.util.Collection;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Map;
@@ -38,26 +41,6 @@ public class FlwSpelServiceImpl implements IFlwSpelService {
 
 
     private final FlwSpelMapper baseMapper;
     private final FlwSpelMapper baseMapper;
 
 
-    /**
-     * 查询流程spel达式定义列表
-     */
-    @Override
-    public TaskAssigneeDTO selectSpelByTaskAssigneeList(TaskAssigneeBody taskQuery) {
-        PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum());
-        FlowSpelBo bo = new FlowSpelBo();
-        bo.setViewSpel(taskQuery.getHandlerCode());
-        bo.setRemark(taskQuery.getHandlerName());
-        bo.setStatus(SystemConstants.NORMAL);
-        Map<String, Object> params = bo.getParams();
-        params.put("beginTime", taskQuery.getBeginTime());
-        params.put("endTime", taskQuery.getEndTime());
-        TableDataInfo<FlowSpelVo> page = this.queryPageList(bo, pageQuery);
-        // 使用封装的字段映射方法进行转换
-        List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(),
-            FlowSpelVo::getViewSpel, c -> "", FlowSpelVo::getRemark, null, FlowSpelVo::getCreateTime);
-        return new TaskAssigneeDTO(page.getTotal(), handlers);
-    }
-
     /**
     /**
      * 查询流程spel达式定义
      * 查询流程spel达式定义
      *
      *
@@ -159,4 +142,46 @@ public class FlwSpelServiceImpl implements IFlwSpelService {
         }
         }
         return baseMapper.deleteByIds(ids) > 0;
         return baseMapper.deleteByIds(ids) > 0;
     }
     }
+
+    /**
+     * 查询spel并返回任务指派的列表,支持分页
+     *
+     * @param taskQuery 查询条件
+     * @return 办理人
+     */
+    @Override
+    public TaskAssigneeDTO selectSpelByTaskAssigneeList(TaskAssigneeBody taskQuery) {
+        PageQuery pageQuery = new PageQuery(taskQuery.getPageSize(), taskQuery.getPageNum());
+        FlowSpelBo bo = new FlowSpelBo();
+        bo.setViewSpel(taskQuery.getHandlerCode());
+        bo.setRemark(taskQuery.getHandlerName());
+        bo.setStatus(SystemConstants.NORMAL);
+        Map<String, Object> params = bo.getParams();
+        params.put("beginTime", taskQuery.getBeginTime());
+        params.put("endTime", taskQuery.getEndTime());
+        TableDataInfo<FlowSpelVo> page = this.queryPageList(bo, pageQuery);
+        // 使用封装的字段映射方法进行转换
+        List<TaskAssigneeDTO.TaskHandler> handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(),
+            FlowSpelVo::getViewSpel, c -> "", FlowSpelVo::getRemark, null, FlowSpelVo::getCreateTime);
+        return new TaskAssigneeDTO(page.getTotal(), handlers);
+    }
+
+    /**
+     * 根据视图 SpEL 表达式列表,查询对应的备注信息
+     *
+     * @param viewSpels SpEL 表达式列表
+     * @return 映射表:key 为 SpEL 表达式,value 为对应备注;若为空则返回空 Map
+     */
+    @Override
+    public Map<String, String> selectRemarksBySpels(List<String> viewSpels) {
+        if (CollUtil.isEmpty(viewSpels)) {
+            return Collections.emptyMap();
+        }
+        List<FlowSpel> list = baseMapper.selectList(
+            new LambdaQueryWrapper<FlowSpel>()
+                .select(FlowSpel::getViewSpel, FlowSpel::getRemark)
+        );
+        return StreamUtils.toMap(list, FlowSpel::getViewSpel, FlowSpel::getRemark);
+    }
+
 }
 }

+ 8 - 2
ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java

@@ -92,24 +92,28 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand
         // 解析并归类 ID,同时记录原始顺序和对应解析结果
         // 解析并归类 ID,同时记录原始顺序和对应解析结果
         Map<TaskAssigneeEnum, List<Long>> typeIdMap = new EnumMap<>(TaskAssigneeEnum.class);
         Map<TaskAssigneeEnum, List<Long>> typeIdMap = new EnumMap<>(TaskAssigneeEnum.class);
         Map<String, Pair<TaskAssigneeEnum, Long>> parsedMap = new LinkedHashMap<>();
         Map<String, Pair<TaskAssigneeEnum, Long>> parsedMap = new LinkedHashMap<>();
+        List<String> spelList = new ArrayList<>();
         for (String storageId : storageIds) {
         for (String storageId : storageIds) {
             Pair<TaskAssigneeEnum, Long> parsed = this.parseStorageId(storageId);
             Pair<TaskAssigneeEnum, Long> parsed = this.parseStorageId(storageId);
             parsedMap.put(storageId, parsed);
             parsedMap.put(storageId, parsed);
             if (parsed != null) {
             if (parsed != null) {
                 typeIdMap.computeIfAbsent(parsed.getKey(), k -> new ArrayList<>()).add(parsed.getValue());
                 typeIdMap.computeIfAbsent(parsed.getKey(), k -> new ArrayList<>()).add(parsed.getValue());
+            } else if (StringUtils.startsWith(storageId, "#")) {
+                // #前缀表示SpEL办理人变量策略
+                spelList.add(storageId);
             }
             }
         }
         }
 
 
         // 查询所有类型对应的 ID 名称映射
         // 查询所有类型对应的 ID 名称映射
         Map<TaskAssigneeEnum, Map<Long, String>> nameMap = new EnumMap<>(TaskAssigneeEnum.class);
         Map<TaskAssigneeEnum, Map<Long, String>> nameMap = new EnumMap<>(TaskAssigneeEnum.class);
         typeIdMap.forEach((type, ids) -> nameMap.put(type, this.getNamesByType(type, ids)));
         typeIdMap.forEach((type, ids) -> nameMap.put(type, this.getNamesByType(type, ids)));
-
+        Map<String, String> spelMap = spelService.selectRemarksBySpels(spelList);
         // 组装返回结果,保持原始顺序
         // 组装返回结果,保持原始顺序
         return parsedMap.entrySet().stream()
         return parsedMap.entrySet().stream()
             .map(entry -> {
             .map(entry -> {
                 String storageId = entry.getKey();
                 String storageId = entry.getKey();
                 Pair<TaskAssigneeEnum, Long> parsed = entry.getValue();
                 Pair<TaskAssigneeEnum, Long> parsed = entry.getValue();
-                String handlerName = (parsed == null) ? null
+                String handlerName = (parsed == null) ? spelMap.get(storageId)
                     : nameMap.getOrDefault(parsed.getKey(), Collections.emptyMap())
                     : nameMap.getOrDefault(parsed.getKey(), Collections.emptyMap())
                     .get(parsed.getValue());
                     .get(parsed.getValue());
                 return new HandlerFeedBackVo(storageId, handlerName);
                 return new HandlerFeedBackVo(storageId, handlerName);
@@ -239,6 +243,8 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand
         }
         }
         // 跳过以 $ 或 # 开头的字符串
         // 跳过以 $ 或 # 开头的字符串
         if (StringUtils.startsWith(storageId, "$") || StringUtils.startsWith(storageId, "#")) {
         if (StringUtils.startsWith(storageId, "$") || StringUtils.startsWith(storageId, "#")) {
+            // $前缀表示默认办理人变量策略
+            // #前缀表示spel办理人变量策略
             log.debug("跳过 storageId 解析,检测到内置变量表达式:{}", storageId);
             log.debug("跳过 storageId 解析,检测到内置变量表达式:{}", storageId);
             return null;
             return null;
         }
         }