From 446a14b9282d6fc29a283b88a23de4a06c3f67b5 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: Sun, 6 Jul 2025 19:21:23 +0800 Subject: [PATCH] =?UTF-8?q?update=20SpEL=E8=A1=A8=E8=BE=BE=E5=BC=8F?= =?UTF-8?q?=E5=9B=9E=E6=98=BE=E5=90=8D=E7=A7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/enums/TaskAssigneeEnum.java | 2 +- .../workflow/service/IFlwSpelService.java | 24 +++++-- .../service/impl/FlwSpelServiceImpl.java | 65 +++++++++++++------ .../impl/FlwTaskAssigneeServiceImpl.java | 10 ++- 4 files changed, 74 insertions(+), 27 deletions(-) diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java index c86e73e42..c604f97e7 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/common/enums/TaskAssigneeEnum.java +++ b/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表达式", ""); private final String desc; private final String code; diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwSpelService.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwSpelService.java index fbafce0f6..02781682a 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/IFlwSpelService.java +++ b/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.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.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.List; +import java.util.Map; /** * 流程spel达式定义Service接口 @@ -18,8 +19,6 @@ import java.util.List; */ public interface IFlwSpelService { - TaskAssigneeDTO selectSpelByTaskAssigneeList(TaskAssigneeBody taskQuery); - /** * 查询流程spel达式定义 * @@ -69,4 +68,21 @@ public interface IFlwSpelService { * @return 是否删除成功 */ Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + /** + * 查询spel并返回任务指派的列表,支持分页 + * + * @param taskQuery 查询条件 + * @return 办理人 + */ + TaskAssigneeDTO selectSpelByTaskAssigneeList(TaskAssigneeBody taskQuery); + + /** + * 根据视图 SpEL 表达式列表,查询对应的备注信息 + * + * @param viewSpels SpEL 表达式列表 + * @return 映射表:key 为 SpEL 表达式,value 为对应备注;若为空则返回空 Map + */ + Map selectRemarksBySpels(List viewSpels); + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwSpelServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwSpelServiceImpl.java index a3b29efcd..35170b6af 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwSpelServiceImpl.java +++ b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwSpelServiceImpl.java @@ -1,9 +1,11 @@ package org.dromara.workflow.service.impl; +import cn.hutool.core.collection.CollUtil; import org.dromara.common.core.constant.SystemConstants; import org.dromara.common.core.domain.dto.TaskAssigneeDTO; import org.dromara.common.core.domain.model.TaskAssigneeBody; 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.mybatis.core.page.TableDataInfo; 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.springframework.stereotype.Service; +import java.util.Collections; import java.util.List; import java.util.Collection; import java.util.Map; @@ -38,26 +41,6 @@ public class FlwSpelServiceImpl implements IFlwSpelService { 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 params = bo.getParams(); - params.put("beginTime", taskQuery.getBeginTime()); - params.put("endTime", taskQuery.getEndTime()); - TableDataInfo page = this.queryPageList(bo, pageQuery); - // 使用封装的字段映射方法进行转换 - List handlers = TaskAssigneeDTO.convertToHandlerList(page.getRows(), - FlowSpelVo::getViewSpel, c -> "", FlowSpelVo::getRemark, null, FlowSpelVo::getCreateTime); - return new TaskAssigneeDTO(page.getTotal(), handlers); - } - /** * 查询流程spel达式定义 * @@ -159,4 +142,46 @@ public class FlwSpelServiceImpl implements IFlwSpelService { } 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 params = bo.getParams(); + params.put("beginTime", taskQuery.getBeginTime()); + params.put("endTime", taskQuery.getEndTime()); + TableDataInfo page = this.queryPageList(bo, pageQuery); + // 使用封装的字段映射方法进行转换 + List 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 selectRemarksBySpels(List viewSpels) { + if (CollUtil.isEmpty(viewSpels)) { + return Collections.emptyMap(); + } + List list = baseMapper.selectList( + new LambdaQueryWrapper() + .select(FlowSpel::getViewSpel, FlowSpel::getRemark) + ); + return StreamUtils.toMap(list, FlowSpel::getViewSpel, FlowSpel::getRemark); + } + } diff --git a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java b/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java index 3037410e7..2e22026ae 100644 --- a/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskAssigneeServiceImpl.java +++ b/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,同时记录原始顺序和对应解析结果 Map> typeIdMap = new EnumMap<>(TaskAssigneeEnum.class); Map> parsedMap = new LinkedHashMap<>(); + List spelList = new ArrayList<>(); for (String storageId : storageIds) { Pair parsed = this.parseStorageId(storageId); parsedMap.put(storageId, parsed); if (parsed != null) { typeIdMap.computeIfAbsent(parsed.getKey(), k -> new ArrayList<>()).add(parsed.getValue()); + } else if (StringUtils.startsWith(storageId, "#")) { + // #前缀表示SpEL办理人变量策略 + spelList.add(storageId); } } // 查询所有类型对应的 ID 名称映射 Map> nameMap = new EnumMap<>(TaskAssigneeEnum.class); typeIdMap.forEach((type, ids) -> nameMap.put(type, this.getNamesByType(type, ids))); - + Map spelMap = spelService.selectRemarksBySpels(spelList); // 组装返回结果,保持原始顺序 return parsedMap.entrySet().stream() .map(entry -> { String storageId = entry.getKey(); Pair parsed = entry.getValue(); - String handlerName = (parsed == null) ? null + String handlerName = (parsed == null) ? spelMap.get(storageId) : nameMap.getOrDefault(parsed.getKey(), Collections.emptyMap()) .get(parsed.getValue()); return new HandlerFeedBackVo(storageId, handlerName); @@ -239,6 +243,8 @@ public class FlwTaskAssigneeServiceImpl implements IFlwTaskAssigneeService, Hand } // 跳过以 $ 或 # 开头的字符串 if (StringUtils.startsWith(storageId, "$") || StringUtils.startsWith(storageId, "#")) { + // $前缀表示默认办理人变量策略 + // #前缀表示spel办理人变量策略 log.debug("跳过 storageId 解析,检测到内置变量表达式:{}", storageId); return null; }