From 84041ed7ceb54d1b602af7f344ce1bc1dd9a9b32 Mon Sep 17 00:00:00 2001 From: PIGCLOUD Date: Tue, 10 Feb 2026 12:57:46 +0800 Subject: [PATCH] =?UTF-8?q?feat(pigx-flow-api):=20=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E7=8A=B6=E6=80=81=E4=BA=8B=E4=BB=B6=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E4=B8=8E=E6=A0=A1=E9=AA=8C=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在FlowStatusEventPublisher中添加流程ID注册和校验方法,使用Redis Set存储已注册的flowId - 更新FlowStatusEventAutoConfiguration,在启动时自动注册所有本地flowId到Redis - 重构ProcessServiceImpl中的validateFlowId方法,改为通过Redis查询flowId注册状态 - 优化BpmOaLeaveServiceImpl中的流程参数设置逻辑,使用Dict构建root用户信息 --- .../FlowStatusEventAutoConfiguration.java | 4 ++- .../flow/event/FlowStatusEventPublisher.java | 21 +++++++++++++++ .../service/impl/BpmOaLeaveServiceImpl.java | 15 ++++++++--- .../flow/service/impl/ProcessServiceImpl.java | 26 +++++-------------- 4 files changed, 42 insertions(+), 24 deletions(-) diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/config/FlowStatusEventAutoConfiguration.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/config/FlowStatusEventAutoConfiguration.java index 2cf6e0b54..d92e51b39 100644 --- a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/config/FlowStatusEventAutoConfiguration.java +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/config/FlowStatusEventAutoConfiguration.java @@ -40,7 +40,9 @@ public class FlowStatusEventAutoConfiguration { @ConditionalOnMissingBean @ConditionalOnBean(IProcessInstanceStatusEventService.class) public FlowStatusEventListener flowStatusEventListener(List eventServices, - StringRedisTemplate redisTemplate) { + StringRedisTemplate redisTemplate, FlowStatusEventPublisher publisher) { + // 启动时注册所有本地 flowId 到 Redis + eventServices.forEach(service -> publisher.registerFlowId(service.getFlowId())); return new FlowStatusEventListener(eventServices, redisTemplate); } diff --git a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/event/FlowStatusEventPublisher.java b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/event/FlowStatusEventPublisher.java index 8cf2c3dbb..64ce73f7c 100644 --- a/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/event/FlowStatusEventPublisher.java +++ b/pigx-flow/pigx-flow-api/src/main/java/com/pig4cloud/pigx/flow/event/FlowStatusEventPublisher.java @@ -1,6 +1,7 @@ package com.pig4cloud.pigx.flow.event; import cn.hutool.json.JSONUtil; +import com.pig4cloud.pigx.common.core.constant.CacheConstants; import com.pig4cloud.pigx.flow.dto.ProcessInstanceParamDto; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -21,6 +22,8 @@ public class FlowStatusEventPublisher { public static final String CHANNEL = "pigx:flow:status"; + public static final String REGISTERED_FLOW_IDS_KEY = CacheConstants.GLOBALLY + "flow:registered-flow-ids"; + private final StringRedisTemplate redisTemplate; /** @@ -34,4 +37,22 @@ public class FlowStatusEventPublisher { paramDto.getProcessInstanceId()); } + /** + * 注册 flowId 到 Redis Set + * @param flowId 流程定义Key + */ + public void registerFlowId(String flowId) { + redisTemplate.opsForSet().add(REGISTERED_FLOW_IDS_KEY, flowId); + log.debug("注册 flowId: {}", flowId); + } + + /** + * 校验 flowId 是否已注册 + * @param flowId 流程定义Key + * @return true 表示已注册 + */ + public boolean isFlowIdRegistered(String flowId) { + return Boolean.TRUE.equals(redisTemplate.opsForSet().isMember(REGISTERED_FLOW_IDS_KEY, flowId)); + } + } diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/BpmOaLeaveServiceImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/BpmOaLeaveServiceImpl.java index 2eb56d47d..d3713caaa 100644 --- a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/BpmOaLeaveServiceImpl.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/BpmOaLeaveServiceImpl.java @@ -1,18 +1,22 @@ package com.pig4cloud.pigx.flow.service.impl; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.lang.Dict; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.pig4cloud.pigx.common.core.util.R; import com.pig4cloud.pigx.common.security.util.SecurityUtils; import com.pig4cloud.pigx.flow.api.feign.RemoteFlowApiFlowService; +import com.pig4cloud.pigx.flow.constant.NodeUserTypeEnum; import com.pig4cloud.pigx.flow.dto.ProcessInstanceParamDto; import com.pig4cloud.pigx.flow.entity.BpmOaLeaveEntity; import com.pig4cloud.pigx.flow.mapper.BpmOaLeaveMapper; import com.pig4cloud.pigx.flow.service.BpmOaLeaveService; -import com.pig4cloud.pigx.flow.support.utils.FlowableUtils; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.Map; + /** * 请假表单 * @@ -63,8 +67,13 @@ public class BpmOaLeaveServiceImpl extends ServiceImpl flowParamMap = bpmOaLeave.getFlowParamMap(); + Dict rootUser = Dict.create() + .set("id", SecurityUtils.getUser().getId()) + .set("name", SecurityUtils.getUser().getUsername()) + .set("type", NodeUserTypeEnum.USER.getKey()); + flowParamMap.put("root", CollUtil.newArrayList(rootUser)); + processInstanceParamDto.setParamMap(flowParamMap); R stringR = flowApiFlowService.startProcessInstance(processInstanceParamDto); bpmOaLeave.setProcessInstanceId(stringR.getData()); baseMapper.updateById(bpmOaLeave); diff --git a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessServiceImpl.java b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessServiceImpl.java index f0efc1c48..580031cb0 100644 --- a/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessServiceImpl.java +++ b/pigx-flow/pigx-flow-biz/src/main/java/com/pig4cloud/pigx/flow/service/impl/ProcessServiceImpl.java @@ -23,7 +23,7 @@ import com.pig4cloud.pigx.flow.dto.Node; import com.pig4cloud.pigx.flow.dto.NodeUser; import com.pig4cloud.pigx.flow.entity.Process; import com.pig4cloud.pigx.flow.entity.ProcessStarter; -import com.pig4cloud.pigx.flow.event.IProcessInstanceStatusEventService; +import com.pig4cloud.pigx.flow.event.FlowStatusEventPublisher; import com.pig4cloud.pigx.flow.mapper.ProcessMapper; import com.pig4cloud.pigx.flow.service.IProcessService; import com.pig4cloud.pigx.flow.service.IProcessStarterService; @@ -43,7 +43,6 @@ import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; import java.util.Objects; -import java.util.Optional; /** * 流程定义服务实现类 @@ -69,7 +68,7 @@ public class ProcessServiceImpl extends ServiceImpl impl private final Sequence flowSequence; - private final Optional> processInstanceStatusEventServicesOptional; + private final FlowStatusEventPublisher flowStatusEventPublisher; /** * 获取流程详细信息 @@ -301,10 +300,10 @@ public class ProcessServiceImpl extends ServiceImpl impl } /** - * 验证流程ID是否在所有IProcessInstanceStatusEventService实现类中存在 + * 验证流程ID是否已注册流程状态事件处理 *

- * 遍历所有实现了IProcessInstanceStatusEventService接口的服务类,检查输入的flowId - * 是否与任意一个服务的getFlowId()返回值匹配。如果匹配则返回true,否则返回false。 + * 通过 Redis Set 查询 flowId 是否已被任意微服务模块注册, + * 支持跨服务校验。 *

* * @param flowId 流程定义ID @@ -312,23 +311,10 @@ public class ProcessServiceImpl extends ServiceImpl impl */ @Override public R validateFlowId(String flowId) { - // 如果flowId为空,直接返回false if (StrUtil.isBlank(flowId)) { return R.ok(false); } - - // 如果没有IProcessInstanceStatusEventService实现类,返回false - if (processInstanceStatusEventServicesOptional.isEmpty()) { - log.warn("未找到任何IProcessInstanceStatusEventService实现类"); - return R.ok(false); - } - - // 遍历所有实现类,检查flowId是否存在 - List serviceList = processInstanceStatusEventServicesOptional.get(); - boolean exists = serviceList.stream() - .anyMatch(service -> flowId.equals(service.getFlowId())); - - return R.ok(exists); + return R.ok(flowStatusEventPublisher.isFlowIdRegistered(flowId)); } }