From 1737dffef2949b62030f36ada62bfd7fd558ad82 Mon Sep 17 00:00:00 2001 From: ye1023 <12588209+ye1023@user.noreply.gitee.com> Date: Sun, 3 May 2026 11:33:30 +0800 Subject: [PATCH] =?UTF-8?q?yxk-20260506-=E6=B5=81=E7=A8=8B=E8=A1=A8?= =?UTF-8?q?=E8=BE=BE=E5=BC=8F=EF=BC=9A=201=E3=80=81getUsersListByDeptAndRo?= =?UTF-8?q?le=E6=A0=B9=E6=8D=AE=E9=83=A8=E9=97=A8=E5=92=8C=E8=A7=92?= =?UTF-8?q?=E8=89=B2id=E8=8E=B7=E5=8F=96=E4=BA=BA=E5=91=98list=202?= =?UTF-8?q?=E3=80=81getSonProcessVariable=E6=A0=B9=E6=8D=AE=E5=AD=90?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E7=9A=84=E5=8F=98=E9=87=8F=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=EF=BC=8C=E8=8E=B7=E5=8F=96=E5=AD=90=E6=B5=81=E7=A8=8B=E7=9A=84?= =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/expression/FlowNodeExpression.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) diff --git a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/common/expression/FlowNodeExpression.java b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/common/expression/FlowNodeExpression.java index 7eeb5ee..f9e7874 100644 --- a/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/common/expression/FlowNodeExpression.java +++ b/jeecg-boot-platform/jeecg-boot-module-bpm-flowable/src/main/java/org/jeecg/modules/extbpm/process/common/expression/FlowNodeExpression.java @@ -5,6 +5,9 @@ import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; +import org.flowable.engine.RuntimeService; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.runtime.Execution; import org.jeecg.common.constant.SymbolConstant; import org.jeecg.common.system.api.ISysBaseAPI; import org.springframework.beans.factory.annotation.Autowired; @@ -26,6 +29,8 @@ public class FlowNodeExpression { // 自动注入 + 自动延迟加载(解决循环依赖) private final @Lazy ISysBaseAPI sysbase; + private final RuntimeService runtimeService; + /** * 查找当前部门负责人 @@ -87,6 +92,76 @@ public class FlowNodeExpression { return ISysBaseAPI.getUsersListByJsonLocalAPI(jsonData,deptKeyName,roleId); } + /** + * Get username list by department id and role id. + * Example: ${flowNodeExpression.getUsersListByDeptAndRole('deptIdValue', 'roleIdValue')} + * + * @param deptId department id + * @param roleId role id + * @return username list + */ + public List getUsersListByDeptAndRole(String deptId, String roleId) { + if (StringUtils.isBlank(deptId) || StringUtils.isBlank(roleId)) { + return Collections.emptyList(); + } + + JSONObject json = new JSONObject(); + json.put("deptId", deptId); + return ISysBaseAPI.getUsersListByJsonLocalAPI(json, "deptId", roleId); + } + + /** + * Get subprocess variable. + * Example: ${flowNodeExpression.getSonProcessVariable(execution, 'subApproveUser')} + * + * @param execution current execution + * @param variableName subprocess variable name + * @return username list + */ + public List getSonProcessVariable(DelegateExecution execution, String variableName) { + if (execution == null || StringUtils.isBlank(variableName)) { + return Collections.emptyList(); + } + + try { + if (execution.hasVariableLocal(variableName)) { + return splitUsernames(execution.getVariableLocal(variableName)); + } + + List executions = runtimeService.createExecutionQuery() + .processInstanceId(execution.getProcessInstanceId()) + .list(); + for (Execution childExecution : executions) { + if (execution.getId().equals(childExecution.getId())) { + continue; + } + Object localVariable = runtimeService.getVariableLocal(childExecution.getId(), variableName); + if (localVariable != null) { + return splitUsernames(localVariable); + } + } + + Object variable = execution.getVariable(variableName); + if (variable != null) { + return splitUsernames(variable); + } + } catch (Exception e) { + log.warn("getSonProcessVariable failed, executionId={}, variableName={}", + execution.getId(), variableName, e); + } + return Collections.emptyList(); + } + + private List splitUsernames(Object value) { + if (value == null) { + return Collections.emptyList(); + } + return Arrays.stream(String.valueOf(value).split(SymbolConstant.COMMA)) + .map(String::trim) + .filter(StringUtils::isNotBlank) + .collect(Collectors.toList()); + } + /** * 查找上一级部门负责人 * ${flowNodeExpression.getLevel1DepartLeaders(applyUserId)}