From 44b3e2c399c2b824b35b7a3c68b0059731ae2a04 Mon Sep 17 00:00:00 2001 From: yangqicheng Date: Mon, 23 Dec 2024 16:08:17 +0800 Subject: [PATCH 01/11] =?UTF-8?q?REQ-3282-=E4=BA=BA=E5=91=98=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E8=BF=81=E7=A7=BB=E5=88=B0=E6=96=B0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 +++ workflow-engine-server/pom.xml | 4 ++ .../AbstractBpmnTaskAssigneeSelector.java | 31 ++++++++++++ .../BasedFixedPersonTaskAssigneeSelector.java | 50 +++++++++---------- ...edInitiatorLeaderTaskAssigneeSelector.java | 15 +++--- .../BasedPositionTaskAssigneeSelector.java | 12 ++--- 6 files changed, 77 insertions(+), 41 deletions(-) diff --git a/pom.xml b/pom.xml index 74a308849..7d0da22f8 100644 --- a/pom.xml +++ b/pom.xml @@ -19,6 +19,7 @@ 1.5.1-SNAPSHOT 2.0.0-SNAPSHOT 2.0.0-SNAPSHOT + 1.0.0-SNAPSHOT 11.8 1.18.22 1.4.2.Final @@ -155,6 +156,11 @@ riven-api ${axzo-dependencies.version} + + cn.axzo.org + org-api + ${axzo-dependencies.org.version} + diff --git a/workflow-engine-server/pom.xml b/workflow-engine-server/pom.xml index 934ed9487..cd319b356 100644 --- a/workflow-engine-server/pom.xml +++ b/workflow-engine-server/pom.xml @@ -142,6 +142,10 @@ cn.axzo riven-api + + cn.axzo.org + org-api + diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/AbstractBpmnTaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/AbstractBpmnTaskAssigneeSelector.java index a7230f8ef..6327648f8 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/AbstractBpmnTaskAssigneeSelector.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/AbstractBpmnTaskAssigneeSelector.java @@ -119,6 +119,37 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign return Collections.emptyList(); } + protected final T parseFoundationApiResult(Supplier> supplier, String operatorDesc, + String extInfo, Object... param) { + StopWatch stopWatch = new StopWatch(operatorDesc); + log.info("{}-Param: {}", operatorDesc, JSONUtil.toJsonStr(param)); + stopWatch.start(); + cn.axzo.foundation.result.ApiResult result = supplier.get(); + stopWatch.stop(); + log.info("{}-Cost:{}, Result: {}", operatorDesc, + "API StopWatch '" + stopWatch.getId() + "': running time = " + stopWatch.getTotalTimeSeconds() + " 's", + JSONUtil.toJsonStr(result)); + try { + if (stopWatch.getTotalTimeSeconds() > refreshProperties.getApiTimeout() && Boolean.TRUE.equals(refreshProperties.getSendDingTalk())) { + DingTalkUtils.sendDingTalkForSlowUrl(applicationContext.getEnvironment() + .getProperty("spring.profiles.active"), + stopWatch.getTotalTimeSeconds(), + extInfo, + param, + result); + } + } catch (Exception e) { + // ignore + } + Assert.notNull(result, "服务调用异常"); + // 200自定义处理 + if (HttpStatus.HTTP_OK != result.getCode()) { + throw new WorkflowEngineException(CALC_TASK_ASSIGNEE_ERROR, "[API:" + extInfo + "]" + result.getMsg()); + } + return result.getData(); + } + + protected final T parseApiResult(Supplier> supplier, String operatorDesc, String extInfo, Object... param) { return parseApiResult(supplier, operatorDesc, extInfo, refreshProperties, applicationContext, param); diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedFixedPersonTaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedFixedPersonTaskAssigneeSelector.java index 861fa29d6..11e1e678a 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedFixedPersonTaskAssigneeSelector.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedFixedPersonTaskAssigneeSelector.java @@ -1,11 +1,11 @@ package cn.axzo.workflow.server.controller.delegate; -import cn.axzo.maokai.api.client.OrganizationalNodeUserApi; -import cn.axzo.maokai.api.vo.request.OrganizationalNodeUserSearchReq; -import cn.axzo.maokai.api.vo.response.OrganizationalNodeUserVO; +import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi; +import cn.axzo.orggateway.api.nodeuser.req.ListOrgNodeUserReq; +import cn.axzo.orggateway.api.nodeuser.resp.OrganizationalNodeUserDTO; import cn.axzo.workflow.common.enums.ApproverSpecifyEnum; -import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.common.exception.WorkflowEngineException; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper; import com.alibaba.fastjson.JSON; import org.apache.commons.collections4.ListUtils; @@ -16,11 +16,7 @@ import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_USER_TASK_CALC_ERROR; @@ -34,7 +30,7 @@ import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_USER_TA @Component public class BasedFixedPersonTaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector { @Resource - private OrganizationalNodeUserApi organizationalNodeUserApi; + private OrgNodeUserApi orgNodeUserApi; @Override public String getType() { @@ -54,30 +50,30 @@ public class BasedFixedPersonTaskAssigneeSelector extends AbstractBpmnTaskAssign return super.select(flowElement, execution, throwException); } BpmnMetaParserHelper.getApproverSpecifyValue((UserTask) flowElement) - .ifPresent(s -> assigners.addAll(JSON.parseArray(s, BpmnTaskDelegateAssigner.class))); + .ifPresent(s -> assigners.addAll(JSON.parseArray(s, BpmnTaskDelegateAssigner.class))); Set workspaceIds = assigners.stream() - .map(BpmnTaskDelegateAssigner::getTenantId) - .filter(StringUtils::hasText) - .map(Long::parseLong) - .collect(Collectors.toSet()); + .map(BpmnTaskDelegateAssigner::getTenantId) + .filter(StringUtils::hasText) + .map(Long::parseLong) + .collect(Collectors.toSet()); List personIds = assigners.stream() - .map(BpmnTaskDelegateAssigner::getPersonId) - .filter(StringUtils::hasText) - .map(Long::parseLong) - .collect(Collectors.toList()); - List onlineUsers = new ArrayList<>(); + .map(BpmnTaskDelegateAssigner::getPersonId) + .filter(StringUtils::hasText) + .map(Long::parseLong) + .collect(Collectors.toList()); + List onlineUsers = new ArrayList<>(); try { - OrganizationalNodeUserSearchReq searchReq = new OrganizationalNodeUserSearchReq(); + ListOrgNodeUserReq searchReq = new ListOrgNodeUserReq(); searchReq.setWorkspaceIds(workspaceIds); - searchReq.setPersonIdList(personIds); - onlineUsers = parseApiResult(() -> organizationalNodeUserApi.list(searchReq), "查询指定人员是否在职", - "cn.axzo.maokai.api.client.OrganizationalNodeUserApi#list", searchReq); + searchReq.setPersonIds(personIds); + onlineUsers = parseFoundationApiResult(() -> orgNodeUserApi.list(searchReq), "查询指定人员是否在职", + "cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.list", searchReq).getData(); } catch (Exception e) { if (throwException) { throw new WorkflowEngineException(ENGINE_USER_TASK_CALC_ERROR, flowElement.getId(), - this.getType(), e.getMessage()); + this.getType(), e.getMessage()); } else { return Collections.emptyList(); } @@ -85,8 +81,8 @@ public class BasedFixedPersonTaskAssigneeSelector extends AbstractBpmnTaskAssign // 只要有在职的人,不会走审批人为空 if (ListUtils.emptyIfNull(onlineUsers).stream().filter(i -> Objects.equals(i.getIsDelete(), 0L)) - .anyMatch(u -> assigners.stream().anyMatch(i -> Objects.equals(i.getPersonId(), String.valueOf(u.getPersonId())) - && Objects.equals(i.getOuId(), String.valueOf(u.getOrganizationalUnitId()))))) { + .anyMatch(u -> assigners.stream().anyMatch(i -> Objects.equals(i.getPersonId(), String.valueOf(u.getPersonId())) + && Objects.equals(i.getOuId(), String.valueOf(u.getOrganizationalUnitId()))))) { return assigners; } diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedInitiatorLeaderTaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedInitiatorLeaderTaskAssigneeSelector.java index ac803b1b4..a7fdfab50 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedInitiatorLeaderTaskAssigneeSelector.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedInitiatorLeaderTaskAssigneeSelector.java @@ -1,9 +1,8 @@ package cn.axzo.workflow.server.controller.delegate; -import cn.axzo.maokai.api.client.OrganizationalNodeUserApi; -import cn.axzo.maokai.api.vo.request.FlowTaskAssignerReq; -import cn.axzo.maokai.api.vo.request.FlowTaskAssignerReq.IdentityPair; -import cn.axzo.maokai.api.vo.response.FlowTaskAssigner; +import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi; +import cn.axzo.orggateway.api.nodeuser.req.FlowTaskAssignerReq; +import cn.axzo.orggateway.api.nodeuser.resp.FlowTaskAssigner; import cn.axzo.workflow.common.enums.ApproverSpecifyEnum; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.core.deletage.approverscope.ApproverScopeDTO; @@ -33,7 +32,7 @@ import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR; public class BasedInitiatorLeaderTaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector { @Resource - private OrganizationalNodeUserApi organizationalNodeUserApi; + private OrgNodeUserApi orgNodeUserApi; @Override public String getType() { @@ -64,15 +63,15 @@ public class BasedInitiatorLeaderTaskAssigneeSelector extends AbstractBpmnTaskAs .orgScopes(ListUtils.emptyIfNull(scopeDto.getOrgScopes()).stream() .map(e -> BeanUtil.copyProperties(e, FlowTaskAssignerReq.OrgScope.class)) .collect(Collectors.toList())) - .sponsor(IdentityPair.builder() + .sponsor(FlowTaskAssignerReq.IdentityPair.builder() .identityId(Long.valueOf(initiator.getAssignee())) .identityType(Integer.valueOf(initiator.getAssigneeType())).build()) .build(); req.setProcInstId(execution.getProcessInstanceId()); List flowTaskAssigners = - parseApiResult(() -> organizationalNodeUserApi.listFlowTaskAssigner(req), + parseFoundationApiResult(() -> orgNodeUserApi.listFlowTaskAssigner(req), "审批节点: " + flowElement.getId() + ", 通过发起人主管查询审批人", - "cn.axzo.maokai.api.client.OrganizationalNodeUserApi#listFlowTaskAssigner", req); + "cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.listFlowTaskAssigner", req); if (CollUtil.isEmpty(flowTaskAssigners)) { return super.invokeService(flowElement, execution, scopeDto); diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedPositionTaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedPositionTaskAssigneeSelector.java index b799530d4..b708547b7 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedPositionTaskAssigneeSelector.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedPositionTaskAssigneeSelector.java @@ -1,8 +1,8 @@ package cn.axzo.workflow.server.controller.delegate; -import cn.axzo.maokai.api.client.OrganizationalNodeUserApi; -import cn.axzo.maokai.api.vo.request.FlowTaskAssignerReq; -import cn.axzo.maokai.api.vo.response.FlowTaskAssigner; +import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi; +import cn.axzo.orggateway.api.nodeuser.req.FlowTaskAssignerReq; +import cn.axzo.orggateway.api.nodeuser.resp.FlowTaskAssigner; import cn.axzo.workflow.common.enums.ApproverSpecifyEnum; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.core.deletage.approverscope.ApproverScopeDTO; @@ -29,7 +29,7 @@ import java.util.stream.Collectors; public class BasedPositionTaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector { @Autowired - private OrganizationalNodeUserApi organizationalNodeUserApi; + private OrgNodeUserApi orgNodeUserApi; @Override public String getType() { @@ -62,9 +62,9 @@ public class BasedPositionTaskAssigneeSelector extends AbstractBpmnTaskAssigneeS req.getOrgScopes().addAll(workerTeamScopes); req.setProcInstId(execution.getProcessInstanceId()); List flowTaskAssigners = - parseApiResult(() -> organizationalNodeUserApi.listFlowTaskAssigner(req), + parseFoundationApiResult(() -> orgNodeUserApi.listFlowTaskAssigner(req), "审批节点: " + flowElement.getId() + ", 通过岗位查询审批人", - "cn.axzo.maokai.api.client.OrganizationalNodeUserApi#listFlowTaskAssigner", req); + "cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.listFlowTaskAssigner", req); if (CollUtil.isEmpty(flowTaskAssigners)) { return super.invokeService(flowElement, execution, scopeDto); From b2b772a87e80a983316abdb5fb08fb8ff3051af2 Mon Sep 17 00:00:00 2001 From: yangqicheng Date: Tue, 24 Dec 2024 17:28:50 +0800 Subject: [PATCH 02/11] =?UTF-8?q?REQ-3288-=E8=B0=83=E6=95=B4=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BasedFixedPersonTaskAssigneeSelector.java | 12 +++++++----- .../BasedInitiatorLeaderTaskAssigneeSelector.java | 3 ++- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedFixedPersonTaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedFixedPersonTaskAssigneeSelector.java index 11e1e678a..33df42577 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedFixedPersonTaskAssigneeSelector.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedFixedPersonTaskAssigneeSelector.java @@ -1,8 +1,8 @@ package cn.axzo.workflow.server.controller.delegate; import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi; +import cn.axzo.orggateway.api.nodeuser.dto.OrgNodeUserDTO; import cn.axzo.orggateway.api.nodeuser.req.ListOrgNodeUserReq; -import cn.axzo.orggateway.api.nodeuser.resp.OrganizationalNodeUserDTO; import cn.axzo.workflow.common.enums.ApproverSpecifyEnum; import cn.axzo.workflow.common.exception.WorkflowEngineException; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; @@ -63,7 +63,7 @@ public class BasedFixedPersonTaskAssigneeSelector extends AbstractBpmnTaskAssign .filter(StringUtils::hasText) .map(Long::parseLong) .collect(Collectors.toList()); - List onlineUsers = new ArrayList<>(); + List onlineUsers = new ArrayList<>(); try { ListOrgNodeUserReq searchReq = new ListOrgNodeUserReq(); searchReq.setWorkspaceIds(workspaceIds); @@ -80,9 +80,11 @@ public class BasedFixedPersonTaskAssigneeSelector extends AbstractBpmnTaskAssign } // 只要有在职的人,不会走审批人为空 - if (ListUtils.emptyIfNull(onlineUsers).stream().filter(i -> Objects.equals(i.getIsDelete(), 0L)) - .anyMatch(u -> assigners.stream().anyMatch(i -> Objects.equals(i.getPersonId(), String.valueOf(u.getPersonId())) - && Objects.equals(i.getOuId(), String.valueOf(u.getOrganizationalUnitId()))))) { + if (ListUtils.emptyIfNull(onlineUsers).stream() + .filter(i -> Objects.equals(i.getIsDelete(), 0L)) + .anyMatch(u -> assigners.stream() + .anyMatch(i -> Objects.equals(i.getPersonId(), String.valueOf(u.getPersonId())) + && Objects.equals(i.getOuId(), String.valueOf(u.getOrganizationalUnitId()))))) { return assigners; } diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedInitiatorLeaderTaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedInitiatorLeaderTaskAssigneeSelector.java index a7fdfab50..040b802c7 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedInitiatorLeaderTaskAssigneeSelector.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedInitiatorLeaderTaskAssigneeSelector.java @@ -2,6 +2,7 @@ package cn.axzo.workflow.server.controller.delegate; import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi; import cn.axzo.orggateway.api.nodeuser.req.FlowTaskAssignerReq; +import cn.axzo.orggateway.api.nodeuser.req.IdentityPair; import cn.axzo.orggateway.api.nodeuser.resp.FlowTaskAssigner; import cn.axzo.workflow.common.enums.ApproverSpecifyEnum; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; @@ -63,7 +64,7 @@ public class BasedInitiatorLeaderTaskAssigneeSelector extends AbstractBpmnTaskAs .orgScopes(ListUtils.emptyIfNull(scopeDto.getOrgScopes()).stream() .map(e -> BeanUtil.copyProperties(e, FlowTaskAssignerReq.OrgScope.class)) .collect(Collectors.toList())) - .sponsor(FlowTaskAssignerReq.IdentityPair.builder() + .sponsor(IdentityPair.builder() .identityId(Long.valueOf(initiator.getAssignee())) .identityType(Integer.valueOf(initiator.getAssigneeType())).build()) .build(); From 96f9404d30ef736ea573295a1c0ba95a951db0f1 Mon Sep 17 00:00:00 2001 From: yangqicheng Date: Wed, 25 Dec 2024 16:50:27 +0800 Subject: [PATCH 03/11] =?UTF-8?q?REQ-3828=20=E8=B0=83=E6=95=B4=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/engine/cmd/CustomForecastUserTaskAssigneeCmd.java | 7 +++---- .../delegate/AbstractBpmnTaskAssigneeSelector.java | 4 ++-- .../delegate/TransferToAdminTaskAssigneeSelector.java | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomForecastUserTaskAssigneeCmd.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomForecastUserTaskAssigneeCmd.java index dbca84d2c..c127eaadb 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomForecastUserTaskAssigneeCmd.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/cmd/CustomForecastUserTaskAssigneeCmd.java @@ -34,6 +34,7 @@ import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.getLimite */ @Slf4j public class CustomForecastUserTaskAssigneeCmd extends AbstractCommand> implements Serializable { + private static final long serialVersionUID = 2217101915677599319L; private final String processInstanceId; private final UserTask userTask; private final EngineExecutionStartListener engineExecutionStartListener; @@ -62,10 +63,8 @@ public class CustomForecastUserTaskAssigneeCmd extends AbstractCommand forecastAssigners = new ArrayList<>(); - getApproverSpecify(userTask).ifPresent(specify -> { - forecastAssigners.addAll(engineExecutionStartListener.approverSelect(specify.getType(), userTask, - (DelegateExecution) list.get(0), false)); - }); + getApproverSpecify(userTask).ifPresent(specify -> forecastAssigners.addAll(engineExecutionStartListener.approverSelect(specify.getType(), userTask, + (DelegateExecution) list.get(0), false))); // 如果没找到审批人,加载管理员 if (CollectionUtils.isEmpty(forecastAssigners)) { diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/AbstractBpmnTaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/AbstractBpmnTaskAssigneeSelector.java index 6327648f8..2920b4119 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/AbstractBpmnTaskAssigneeSelector.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/AbstractBpmnTaskAssigneeSelector.java @@ -93,7 +93,7 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign ApproverScopeDTO scopeDto = processor.build(flowElement, execution); if (CollectionUtils.isEmpty(scopeDto.getOrgScopes()) && CollectionUtils.isEmpty(scopeDto.getWorkerTeamScopes())) { - if (throwException) { + if (Boolean.TRUE.equals(throwException)) { throw new WorkflowEngineException(ENGINE_USER_TASK_PARAM_ERROR, flowElement.getId(), processorType.getDesc()); } @@ -101,7 +101,7 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign try { return populateNameAndAvatar(invokeService(flowElement, execution, scopeDto), flowSupportApi, refreshProperties, applicationContext); } catch (Throwable t) { - if (throwException) { + if (Boolean.TRUE.equals(throwException)) { log.warn("执行查询候选审批人时发现异常, 审批节点:{}, 异常信息:{}", flowElement.getId(), t.getMessage()); if (!(t instanceof WorkflowEngineException)) { throw new WorkflowEngineException(ENGINE_USER_TASK_CALC_ERROR, flowElement.getId(), diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/TransferToAdminTaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/TransferToAdminTaskAssigneeSelector.java index 75ece3542..20089b4e6 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/TransferToAdminTaskAssigneeSelector.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/TransferToAdminTaskAssigneeSelector.java @@ -70,7 +70,7 @@ public class TransferToAdminTaskAssigneeSelector extends AbstractBpmnTaskAssigne protected List invokeService(FlowElement flowElement, DelegateExecution execution, ApproverScopeDTO scopeDto) { - if(supportRefreshProperties.getUseNewToAdminApi()) { + if(Boolean.TRUE.equals(supportRefreshProperties.getUseNewToAdminApi())) { return invokeNewQuery(flowElement, execution, scopeDto); } else { return invokeOldQuery(flowElement, execution, scopeDto); From 84924e578d0c5eedeb507f66f2cb85de993856cc Mon Sep 17 00:00:00 2001 From: yangqicheng Date: Wed, 25 Dec 2024 17:36:46 +0800 Subject: [PATCH 04/11] =?UTF-8?q?REQ-3828=20=E4=BF=AE=E5=A4=8D=E5=90=AF?= =?UTF-8?q?=E5=8A=A8=E6=B5=81=E7=A8=8B=E5=8F=98=E9=87=8F=E6=9C=AA=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/service/impl/BpmnProcessInstanceServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java index 4c92112b3..d768c744f 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnProcessInstanceServiceImpl.java @@ -373,7 +373,6 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic ProcessInstanceBuilder instanceBuilder = runtimeService.createProcessInstanceBuilder() .processDefinitionId(definition.getId()) .businessKey(dto.getBusinessKey()) - .variables(dto.getVariables()) .name(name) .tenantId(definition.getTenantId()) .overrideProcessDefinitionTenantId(dto.getTenantId()); @@ -401,8 +400,9 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic .outcome(dto.getOutcome()); } dto.getVariables().put(CREATE_INSTANCE_PARAMS, JSONUtil.toJsonStr(dto)); + instanceBuilder.variables(dto.getVariables()); ProcessInstance instance; - if (dto.getAsync()) { + if (Boolean.TRUE.equals(dto.getAsync())) { // 异步开始 instance = instanceBuilder.startAsync(); } else { From 17d55fc9955cd4fc7eb86e95cd657524cafaa58b Mon Sep 17 00:00:00 2001 From: yangqicheng Date: Wed, 25 Dec 2024 18:26:32 +0800 Subject: [PATCH 05/11] =?UTF-8?q?REQ-3282=20=E8=B0=83=E6=95=B4=E4=BA=BA?= =?UTF-8?q?=E5=91=98=E6=9F=A5=E8=AF=A2=E6=8E=A5=E5=8F=A3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BasedFixedPersonTaskAssigneeSelector.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedFixedPersonTaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedFixedPersonTaskAssigneeSelector.java index 33df42577..b3131e81c 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedFixedPersonTaskAssigneeSelector.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedFixedPersonTaskAssigneeSelector.java @@ -1,5 +1,6 @@ package cn.axzo.workflow.server.controller.delegate; +import cn.axzo.foundation.page.PageResp; import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi; import cn.axzo.orggateway.api.nodeuser.dto.OrgNodeUserDTO; import cn.axzo.orggateway.api.nodeuser.req.ListOrgNodeUserReq; @@ -8,6 +9,7 @@ import cn.axzo.workflow.common.exception.WorkflowEngineException; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper; import com.alibaba.fastjson.JSON; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; import org.flowable.bpmn.model.FlowElement; import org.flowable.bpmn.model.UserTask; @@ -63,15 +65,23 @@ public class BasedFixedPersonTaskAssigneeSelector extends AbstractBpmnTaskAssign .filter(StringUtils::hasText) .map(Long::parseLong) .collect(Collectors.toList()); + if (CollectionUtils.isEmpty(personIds)) { + return Collections.emptyList(); + } List onlineUsers = new ArrayList<>(); try { ListOrgNodeUserReq searchReq = new ListOrgNodeUserReq(); searchReq.setWorkspaceIds(workspaceIds); searchReq.setPersonIds(personIds); - onlineUsers = parseFoundationApiResult(() -> orgNodeUserApi.list(searchReq), "查询指定人员是否在职", - "cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.list", searchReq).getData(); + searchReq.setPage(0); + searchReq.setPageSize(personIds.size()); + PageResp pageResp = parseFoundationApiResult(() -> orgNodeUserApi.list(searchReq), "查询指定人员是否在职", + "cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.list", searchReq); + if (pageResp != null) { + onlineUsers = pageResp.getData(); + } } catch (Exception e) { - if (throwException) { + if (Boolean.TRUE.equals(throwException)) { throw new WorkflowEngineException(ENGINE_USER_TASK_CALC_ERROR, flowElement.getId(), this.getType(), e.getMessage()); } else { From 45ef878ec2f9b90e76ccf6ed1fc8d658476f1d5f Mon Sep 17 00:00:00 2001 From: yangqicheng Date: Wed, 25 Dec 2024 18:39:19 +0800 Subject: [PATCH 06/11] =?UTF-8?q?REQ-3282=20=E5=88=86=E9=A1=B5=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E4=BA=BA=E5=91=98=E4=BF=A1=E6=81=AF=EF=BC=8C=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE=E8=B5=B7=E5=A7=8B=E9=A1=B5=E7=A0=81=E4=B8=BA1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../delegate/BasedFixedPersonTaskAssigneeSelector.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedFixedPersonTaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedFixedPersonTaskAssigneeSelector.java index b3131e81c..53be28175 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedFixedPersonTaskAssigneeSelector.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedFixedPersonTaskAssigneeSelector.java @@ -73,7 +73,7 @@ public class BasedFixedPersonTaskAssigneeSelector extends AbstractBpmnTaskAssign ListOrgNodeUserReq searchReq = new ListOrgNodeUserReq(); searchReq.setWorkspaceIds(workspaceIds); searchReq.setPersonIds(personIds); - searchReq.setPage(0); + searchReq.setPage(1); searchReq.setPageSize(personIds.size()); PageResp pageResp = parseFoundationApiResult(() -> orgNodeUserApi.list(searchReq), "查询指定人员是否在职", "cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.list", searchReq); From b32e287fc90cfb065f1081cb514bb4aad11a82d0 Mon Sep 17 00:00:00 2001 From: yangqicheng Date: Thu, 26 Dec 2024 16:07:51 +0800 Subject: [PATCH 07/11] =?UTF-8?q?REQ-3282=20=E4=BF=AE=E5=A4=8D=E8=BD=AC?= =?UTF-8?q?=E4=BA=A4=E6=8C=87=E5=AE=9A=E4=BA=BA=E9=94=99=E8=AF=AF=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EngineExecutionStartListener.java | 40 +++----- .../AbstractBpmnTaskAssigneeSelector.java | 75 ++++++++------- .../SpecifyAssigneeTaskAssigneeSelector.java | 91 +++++++++++++++++++ 3 files changed, 139 insertions(+), 67 deletions(-) create mode 100644 workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/SpecifyAssigneeTaskAssigneeSelector.java diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineExecutionStartListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineExecutionStartListener.java index bfd275ae3..433de5f05 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineExecutionStartListener.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineExecutionStartListener.java @@ -34,30 +34,12 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import javax.annotation.Resource; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; +import java.util.*; -import static cn.axzo.workflow.common.constant.BpmnConstants.APPROVAL_ASSIGNER_LIMIT_NUMBER; -import static cn.axzo.workflow.common.constant.BpmnConstants.BIZ_ORG_RELATION; -import static cn.axzo.workflow.common.constant.BpmnConstants.BPM_ALLOW_SKIP_USER_TASK; -import static cn.axzo.workflow.common.constant.BpmnConstants.DUMMY_ASSIGNEE; -import static cn.axzo.workflow.common.constant.BpmnConstants.DUMMY_ASSIGNEE_TYPE; -import static cn.axzo.workflow.common.constant.BpmnConstants.FLOW_SERVER_VERSION_121; -import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_ACTIVITY_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT; -import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR; -import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO; -import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_BUSINESS; -import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_STARTER; -import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.NODE_TASK; +import static cn.axzo.workflow.common.constant.BpmnConstants.*; +import static cn.axzo.workflow.common.enums.BpmnFlowNodeType.*; import static cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner.buildDummyAssigner; -import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApprovalMethod; -import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverEmptyHandleType; -import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getApproverSpecify; -import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getNodeType; -import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.getProcessServerVersion; +import static cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper.*; import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.getLimitedElementList; import static cn.axzo.workflow.core.engine.cmd.helper.CustomTaskHelper.removeDuplicateByPersonId; @@ -204,14 +186,16 @@ public class EngineExecutionStartListener implements ExecutionListener { } private void finalEmptyAssigneeHandle(List assigners, UserTask userTask, DelegateExecution execution, String operationDesc) { - if (CollectionUtils.isEmpty(assigners) && refreshProperties.getSendDingTalk()) { - CooperationOrgDTO orgScopes = execution.getVariable(BIZ_ORG_RELATION, CooperationOrgDTO.class); - DingTalkUtils.sendDingTalkForTransferToAdminError(profile, execution.getProcessInstanceId(), userTask.getId(), orgScopes); + if (CollectionUtils.isEmpty(assigners)) { + //发送钉钉消息 + if (Boolean.TRUE.equals(refreshProperties.getSendDingTalk())) { + CooperationOrgDTO orgScopes = execution.getVariable(BIZ_ORG_RELATION, CooperationOrgDTO.class); + DingTalkUtils.sendDingTalkForTransferToAdminError(profile, execution.getProcessInstanceId(), userTask.getId(), orgScopes); + } BpmnProcessInstanceAbortDTO abortDTO = new BpmnProcessInstanceAbortDTO(); abortDTO.setProcessInstanceId(execution.getProcessInstanceId()); - abortDTO.setReason("转交管理员失败,系统中止"); - CommandContextUtil.getProcessEngineConfiguration().getCommandExecutor() - .execute(new CustomAbortProcessInstanceAsyncCmd(abortDTO)); + abortDTO.setReason(operationDesc); + CommandContextUtil.getProcessEngineConfiguration().getCommandExecutor().execute(new CustomAbortProcessInstanceAsyncCmd(abortDTO)); } } diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/AbstractBpmnTaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/AbstractBpmnTaskAssigneeSelector.java index 2920b4119..22ee2f85c 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/AbstractBpmnTaskAssigneeSelector.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/AbstractBpmnTaskAssigneeSelector.java @@ -69,15 +69,15 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign List assigners = new ArrayList<>(); if (flowElement instanceof UserTask) { assigners.addAll(BpmnMetaParserHelper.getApproverScope((UserTask) flowElement) - .map(approverScopeEnum -> privateSelector(approverScopeEnum, flowElement, execution, - throwException)) - .orElseGet(Collections::emptyList)); + .map(approverScopeEnum -> privateSelector(approverScopeEnum, flowElement, execution, + throwException)) + .orElseGet(Collections::emptyList)); } else if (flowElement instanceof ServiceTask) { List customProperties = ((ServiceTask) flowElement).getCustomProperties(); if (!CollectionUtils.isEmpty(customProperties)) { String processor = CarbonCopyObjectType.valueOfType(customProperties.get(0).getName()).getProcessor(); assigners.addAll(privateSelector(ApproverScopeEnum.valueOfProcessor(processor), flowElement, - execution, throwException)); + execution, throwException)); } } else if (flowElement instanceof NoticeFlowElement) { ApproverScopeEnum processor = ((NoticeFlowElement) flowElement).getProcessor(); @@ -89,14 +89,11 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign private List privateSelector(ApproverScopeEnum processorType, FlowElement flowElement, DelegateExecution execution, Boolean throwException) { ApproverScopeProcessor processor = applicationContext.getBean(processorType.getProcessor(), - ApproverScopeProcessor.class); + ApproverScopeProcessor.class); ApproverScopeDTO scopeDto = processor.build(flowElement, execution); if (CollectionUtils.isEmpty(scopeDto.getOrgScopes()) - && CollectionUtils.isEmpty(scopeDto.getWorkerTeamScopes())) { - if (Boolean.TRUE.equals(throwException)) { - throw new WorkflowEngineException(ENGINE_USER_TASK_PARAM_ERROR, flowElement.getId(), - processorType.getDesc()); - } + && CollectionUtils.isEmpty(scopeDto.getWorkerTeamScopes()) && Boolean.TRUE.equals(throwException)) { + throw new WorkflowEngineException(ENGINE_USER_TASK_PARAM_ERROR, flowElement.getId(), processorType.getDesc()); } try { return populateNameAndAvatar(invokeService(flowElement, execution, scopeDto), flowSupportApi, refreshProperties, applicationContext); @@ -105,7 +102,7 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign log.warn("执行查询候选审批人时发现异常, 审批节点:{}, 异常信息:{}", flowElement.getId(), t.getMessage()); if (!(t instanceof WorkflowEngineException)) { throw new WorkflowEngineException(ENGINE_USER_TASK_CALC_ERROR, flowElement.getId(), - this.getType(), t.getMessage()); + this.getType(), t.getMessage()); } throw t; } else { @@ -120,7 +117,7 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign } protected final T parseFoundationApiResult(Supplier> supplier, String operatorDesc, - String extInfo, Object... param) { + String extInfo, Object... param) { StopWatch stopWatch = new StopWatch(operatorDesc); log.info("{}-Param: {}", operatorDesc, JSONUtil.toJsonStr(param)); stopWatch.start(); @@ -151,12 +148,12 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign protected final T parseApiResult(Supplier> supplier, String operatorDesc, - String extInfo, Object... param) { + String extInfo, Object... param) { return parseApiResult(supplier, operatorDesc, extInfo, refreshProperties, applicationContext, param); } public static T parseApiResult(Supplier> supplier, String operatorDesc, - String extInfo, SupportRefreshProperties refreshProperties, + String extInfo, SupportRefreshProperties refreshProperties, ApplicationContext context, Object... param) { StopWatch stopWatch = new StopWatch(operatorDesc); log.info("{}-Param: {}", operatorDesc, JSONUtil.toJsonStr(param)); @@ -164,16 +161,16 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign ApiResult result = supplier.get(); stopWatch.stop(); log.info("{}-Cost:{}, Result: {}", operatorDesc, - "API StopWatch '" + stopWatch.getId() + "': running time = " + stopWatch.getTotalTimeSeconds() + " 's", - JSONUtil.toJsonStr(result)); + "API StopWatch '" + stopWatch.getId() + "': running time = " + stopWatch.getTotalTimeSeconds() + " 's", + JSONUtil.toJsonStr(result)); try { if (stopWatch.getTotalTimeSeconds() > refreshProperties.getApiTimeout() && refreshProperties.getSendDingTalk()) { DingTalkUtils.sendDingTalkForSlowUrl(context.getEnvironment() - .getProperty("spring.profiles.active"), - stopWatch.getTotalTimeSeconds(), - extInfo, - param, - result); + .getProperty("spring.profiles.active"), + stopWatch.getTotalTimeSeconds(), + extInfo, + param, + result); } } catch (Exception e) { // ignore @@ -192,26 +189,26 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign try { if (flowElement instanceof UserTask) { return BpmnMetaParserHelper.getApproverSpecifyValue((UserTask) flowElement) - .map(value -> JSON.parseArray(value, String.class).stream().map(JSON::parseObject) - .map(i -> i.getString("value")) - .collect(Collectors.toList())) - .orElse(Collections.emptyList()); + .map(value -> JSON.parseArray(value, String.class).stream().map(JSON::parseObject) + .map(i -> i.getString("value")) + .collect(Collectors.toList())) + .orElse(Collections.emptyList()); } else if (flowElement instanceof ServiceTask) { List customProperties = ((ServiceTask) flowElement).getCustomProperties(); if (CollectionUtils.isEmpty(customProperties)) { return Collections.emptyList(); } return JSON.parseArray(customProperties.get(0).getSimpleValue(), String.class) - .stream().map(JSON::parseObject) - .map(i -> i.getString("value")) - .collect(Collectors.toList()); + .stream().map(JSON::parseObject) + .map(i -> i.getString("value")) + .collect(Collectors.toList()); } else if (flowElement instanceof NoticeFlowElement) { String customValues = ((NoticeFlowElement) flowElement).getCustomValues(); if (StringUtils.hasText(customValues)) { return JSON.parseArray(customValues, String.class) - .stream().map(JSON::parseObject) - .map(i -> i.getString("value")) - .collect(Collectors.toList()); + .stream().map(JSON::parseObject) + .map(i -> i.getString("value")) + .collect(Collectors.toList()); } return Collections.emptyList(); } else { @@ -219,7 +216,7 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign } } catch (Exception e) { throw new WorkflowEngineException(CONVERTOR_META_DATA_FORMAT_ERROR, "AbstractBpmnTaskAssigneeSelector" + - "#getTypes", e.getMessage()); + "#getTypes", e.getMessage()); } } @@ -231,16 +228,16 @@ public abstract class AbstractBpmnTaskAssigneeSelector implements BpmnTaskAssign return assigners; } List personIds = assigners.stream() - .map(BpmnTaskDelegateAssigner::getPersonId) - .filter(e-> Objects.nonNull(e) && StringUtils.hasText(e) && !Objects.equals("null", e)) - .map(Long::parseLong) - .distinct().collect(Collectors.toList()); - if(CollectionUtils.isEmpty(personIds)) { + .map(BpmnTaskDelegateAssigner::getPersonId) + .filter(e -> Objects.nonNull(e) && StringUtils.hasText(e) && !Objects.equals("null", e)) + .map(Long::parseLong) + .distinct().collect(Collectors.toList()); + if (CollectionUtils.isEmpty(personIds)) { return assigners; } Map personProfileMap = parseApiResult(() -> flowSupportApi.listPersons(PersonProfileQueryReq.builder().personIds(personIds).build()), - "根据 PersonId 查询自然人档案", "cn.axzo.karma.client.feign.FlowSupportApi.listPersons", refreshProperties, context, personIds) - .stream().collect(Collectors.toMap(PersonProfileResp::getId, Function.identity(), (s, t) -> s)); + "根据 PersonId 查询自然人档案", "cn.axzo.karma.client.feign.FlowSupportApi.listPersons", refreshProperties, context, personIds) + .stream().collect(Collectors.toMap(PersonProfileResp::getId, Function.identity(), (s, t) -> s)); assigners.forEach(assigner -> { if (!StringUtils.hasText(assigner.getPersonId()) || Objects.equals("null", assigner.getPersonId())) { return; diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/SpecifyAssigneeTaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/SpecifyAssigneeTaskAssigneeSelector.java new file mode 100644 index 000000000..f940f1ac7 --- /dev/null +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/SpecifyAssigneeTaskAssigneeSelector.java @@ -0,0 +1,91 @@ +package cn.axzo.workflow.server.controller.delegate; + +import cn.axzo.foundation.page.PageResp; +import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi; +import cn.axzo.orggateway.api.nodeuser.dto.OrgNodeUserDTO; +import cn.axzo.orggateway.api.nodeuser.req.ListOrgNodeUserReq; +import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; +import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper; +import cn.axzo.workflow.core.deletage.approverscope.ApproverScopeDTO; +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.ListUtils; +import org.flowable.bpmn.model.FlowElement; +import org.flowable.bpmn.model.UserTask; +import org.flowable.engine.delegate.DelegateExecution; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * 转交指定人查询人 + */ +@Slf4j +@Component +public class SpecifyAssigneeTaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelector { + + @Resource + private OrgNodeUserApi orgNodeUserApi; + + @Override + public String getType() { + return ApproverEmptyHandleTypeEnum.specifyAssignee.getType(); + } + + @Override + public boolean support(String param) { + return getType().equals(param); + } + + @Override + protected List invokeService(FlowElement flowElement, DelegateExecution execution, ApproverScopeDTO scopeDto) { + if (!(flowElement instanceof UserTask)) { + return Collections.emptyList(); + } + + List emptyAssignees = + BpmnMetaParserHelper.getEmptyApproverSpecify((UserTask) flowElement) + .map(listStr -> JSON.parseArray(listStr, BpmnTaskDelegateAssigner.class)) + .orElse(Collections.emptyList()); + if (CollectionUtils.isEmpty(emptyAssignees)) { + return Collections.emptyList(); + } + List onlineUsers = new ArrayList<>(); + Set workspaceIds = emptyAssignees.stream() + .map(BpmnTaskDelegateAssigner::getTenantId) + .filter(StringUtils::hasText) + .map(Long::parseLong) + .collect(Collectors.toSet()); + + List personIds = emptyAssignees.stream() + .map(BpmnTaskDelegateAssigner::getPersonId) + .filter(StringUtils::hasText) + .map(Long::parseLong) + .collect(Collectors.toList()); + ListOrgNodeUserReq searchReq = new ListOrgNodeUserReq(); + searchReq.setWorkspaceIds(workspaceIds); + searchReq.setPersonIds(personIds); + searchReq.setPage(1); + searchReq.setPageSize(personIds.size()); + PageResp pageResp = parseFoundationApiResult(() -> orgNodeUserApi.list(searchReq), "查询指定人员是否在职", + "cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.list", searchReq); + if (pageResp != null) { + onlineUsers = pageResp.getData(); + } + // 只要有在职的人,不会走审批人为空 + if (ListUtils.emptyIfNull(onlineUsers).stream() + .filter(i -> Objects.equals(i.getIsDelete(), 0L)) + .anyMatch(u -> emptyAssignees.stream() + .anyMatch(i -> Objects.equals(i.getPersonId(), String.valueOf(u.getPersonId())) + && Objects.equals(i.getOuId(), String.valueOf(u.getOrganizationalUnitId()))))) { + return emptyAssignees; + } + return Collections.emptyList(); + } + +} From f15b6abb677f796c341d1086549922eb1735385a Mon Sep 17 00:00:00 2001 From: yangqicheng Date: Thu, 26 Dec 2024 16:38:35 +0800 Subject: [PATCH 08/11] =?UTF-8?q?REQ-3282=20=E8=B0=83=E6=95=B4=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SpecifyAssigneeTaskAssigneeSelector.java | 76 +++++++++++-------- 1 file changed, 43 insertions(+), 33 deletions(-) diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/SpecifyAssigneeTaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/SpecifyAssigneeTaskAssigneeSelector.java index f940f1ac7..29179d144 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/SpecifyAssigneeTaskAssigneeSelector.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/SpecifyAssigneeTaskAssigneeSelector.java @@ -5,23 +5,25 @@ import cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi; import cn.axzo.orggateway.api.nodeuser.dto.OrgNodeUserDTO; import cn.axzo.orggateway.api.nodeuser.req.ListOrgNodeUserReq; import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum; +import cn.axzo.workflow.common.exception.WorkflowEngineException; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper; -import cn.axzo.workflow.core.deletage.approverscope.ApproverScopeDTO; import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; +import org.apache.commons.lang3.math.NumberUtils; import org.flowable.bpmn.model.FlowElement; import org.flowable.bpmn.model.UserTask; import org.flowable.engine.delegate.DelegateExecution; import org.springframework.stereotype.Component; -import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.util.*; import java.util.stream.Collectors; +import static cn.axzo.workflow.common.code.FlowableEngineRespCode.ENGINE_USER_TASK_CALC_ERROR; + /** * 转交指定人查询人 */ @@ -43,7 +45,7 @@ public class SpecifyAssigneeTaskAssigneeSelector extends AbstractBpmnTaskAssigne } @Override - protected List invokeService(FlowElement flowElement, DelegateExecution execution, ApproverScopeDTO scopeDto) { + public List select(FlowElement flowElement, DelegateExecution execution, Boolean throwException) { if (!(flowElement instanceof UserTask)) { return Collections.emptyList(); } @@ -55,37 +57,45 @@ public class SpecifyAssigneeTaskAssigneeSelector extends AbstractBpmnTaskAssigne if (CollectionUtils.isEmpty(emptyAssignees)) { return Collections.emptyList(); } - List onlineUsers = new ArrayList<>(); - Set workspaceIds = emptyAssignees.stream() - .map(BpmnTaskDelegateAssigner::getTenantId) - .filter(StringUtils::hasText) - .map(Long::parseLong) - .collect(Collectors.toSet()); + try { + List onlineUsers = new ArrayList<>(); + Set workspaceIds = emptyAssignees.stream() + .map(BpmnTaskDelegateAssigner::getTenantId) + .filter(NumberUtils::isDigits) + .map(Long::parseLong) + .collect(Collectors.toSet()); - List personIds = emptyAssignees.stream() - .map(BpmnTaskDelegateAssigner::getPersonId) - .filter(StringUtils::hasText) - .map(Long::parseLong) - .collect(Collectors.toList()); - ListOrgNodeUserReq searchReq = new ListOrgNodeUserReq(); - searchReq.setWorkspaceIds(workspaceIds); - searchReq.setPersonIds(personIds); - searchReq.setPage(1); - searchReq.setPageSize(personIds.size()); - PageResp pageResp = parseFoundationApiResult(() -> orgNodeUserApi.list(searchReq), "查询指定人员是否在职", - "cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.list", searchReq); - if (pageResp != null) { - onlineUsers = pageResp.getData(); + List personIds = emptyAssignees.stream() + .map(BpmnTaskDelegateAssigner::getPersonId) + .filter(NumberUtils::isDigits) + .map(Long::parseLong) + .collect(Collectors.toList()); + ListOrgNodeUserReq searchReq = new ListOrgNodeUserReq(); + searchReq.setWorkspaceIds(workspaceIds); + searchReq.setPersonIds(personIds); + searchReq.setPage(1); + searchReq.setPageSize(personIds.size()); + PageResp pageResp = parseFoundationApiResult(() -> orgNodeUserApi.list(searchReq), "SpecifyAssigneeTaskAssigneeSelector#查询指定人员是否在职", + "cn.axzo.orggateway.api.nodeuser.OrgNodeUserApi.list", searchReq); + if (pageResp != null) { + onlineUsers = pageResp.getData(); + } + // 只要有在职的人,不会走审批人为空 + if (ListUtils.emptyIfNull(onlineUsers).stream() + .filter(i -> Objects.equals(i.getIsDelete(), 0L)) + .anyMatch(u -> emptyAssignees.stream() + .anyMatch(i -> Objects.equals(i.getPersonId(), String.valueOf(u.getPersonId())) + && Objects.equals(i.getOuId(), String.valueOf(u.getOrganizationalUnitId()))))) { + return emptyAssignees; + } + return Collections.emptyList(); + } catch (Exception e) { + if (Boolean.TRUE.equals(throwException)) { + throw new WorkflowEngineException(ENGINE_USER_TASK_CALC_ERROR, flowElement.getId(), + this.getType(), e.getMessage()); + } else { + return Collections.emptyList(); + } } - // 只要有在职的人,不会走审批人为空 - if (ListUtils.emptyIfNull(onlineUsers).stream() - .filter(i -> Objects.equals(i.getIsDelete(), 0L)) - .anyMatch(u -> emptyAssignees.stream() - .anyMatch(i -> Objects.equals(i.getPersonId(), String.valueOf(u.getPersonId())) - && Objects.equals(i.getOuId(), String.valueOf(u.getOrganizationalUnitId()))))) { - return emptyAssignees; - } - return Collections.emptyList(); } - } From e65a39ab680c7c8a0de9dc6aeeab0bde2633ded3 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 8 Jan 2025 14:18:55 +0800 Subject: [PATCH 09/11] =?UTF-8?q?fix=20-=20=E8=B0=83=E6=95=B4=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E7=9A=84=E5=8C=85=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/workflow/form/service/FormModelService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflow-engine-form/src/main/java/cn/axzo/workflow/form/service/FormModelService.java b/workflow-engine-form/src/main/java/cn/axzo/workflow/form/service/FormModelService.java index 14eae4d0e..64d816b23 100644 --- a/workflow-engine-form/src/main/java/cn/axzo/workflow/form/service/FormModelService.java +++ b/workflow-engine-form/src/main/java/cn/axzo/workflow/form/service/FormModelService.java @@ -1,4 +1,4 @@ -package cn.axzo.workflow.core.service; +package cn.axzo.workflow.form.service; import cn.axzo.workflow.common.model.request.bpmn.model.BpmnModelSearchDTO; From ec713161e5ff260e5c081e6931fe6495e488ede5 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Wed, 8 Jan 2025 14:25:01 +0800 Subject: [PATCH 10/11] =?UTF-8?q?fix=20-=20=E8=B0=83=E6=95=B4=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E7=9A=84=E5=8C=85=E8=B7=AF=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/core/service/impl/AggregateModelServiceImpl.java | 2 +- .../axzo/workflow/form/service/impl/FormModelServiceImpl.java | 2 +- .../server/controller/web/form/FormModelController.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/AggregateModelServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/AggregateModelServiceImpl.java index caccee1c0..1bb533a61 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/AggregateModelServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/AggregateModelServiceImpl.java @@ -8,7 +8,7 @@ import cn.axzo.workflow.common.model.request.form.model.FormModelUpdateDTO; import cn.axzo.workflow.core.service.AggregateModelService; import cn.axzo.workflow.core.service.BpmnProcessModelService; import cn.axzo.workflow.core.service.ExtAxBpmnFormRelationService; -import cn.axzo.workflow.core.service.FormModelService; +import cn.axzo.workflow.form.service.FormModelService; import lombok.extern.slf4j.Slf4j; import org.flowable.engine.RepositoryService; import org.flowable.engine.repository.Model; diff --git a/workflow-engine-form/src/main/java/cn/axzo/workflow/form/service/impl/FormModelServiceImpl.java b/workflow-engine-form/src/main/java/cn/axzo/workflow/form/service/impl/FormModelServiceImpl.java index a66ff4d69..8bbdeb2cf 100644 --- a/workflow-engine-form/src/main/java/cn/axzo/workflow/form/service/impl/FormModelServiceImpl.java +++ b/workflow-engine-form/src/main/java/cn/axzo/workflow/form/service/impl/FormModelServiceImpl.java @@ -8,7 +8,7 @@ import cn.axzo.workflow.common.model.request.form.model.FormModelCreateDTO; import cn.axzo.workflow.common.model.request.form.model.FormModelUpdateDTO; import cn.axzo.workflow.common.model.response.BpmPageResult; import cn.axzo.workflow.common.model.response.form.model.FormModelBaseVO; -import cn.axzo.workflow.core.service.FormModelService; +import cn.axzo.workflow.form.service.FormModelService; import cn.axzo.workflow.form.service.converter.FormModelConverter; import cn.hutool.json.JSONUtil; import lombok.extern.slf4j.Slf4j; diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/form/FormModelController.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/form/FormModelController.java index 299e09f4e..c7073ef4b 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/form/FormModelController.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/web/form/FormModelController.java @@ -5,7 +5,7 @@ import cn.axzo.workflow.common.model.request.form.model.FormModelCreateDTO; import cn.axzo.workflow.common.model.request.form.model.FormModelUpdateDTO; import cn.axzo.workflow.common.model.response.BpmPageResult; import cn.axzo.workflow.common.model.response.form.model.FormModelBaseVO; -import cn.axzo.workflow.core.service.FormModelService; +import cn.axzo.workflow.form.service.FormModelService; import cn.axzo.workflow.server.common.annotation.ErrorReporter; import cn.azxo.framework.common.model.CommonResponse; import io.swagger.annotations.ApiParam; From 6ad8469ae060b838cd9a7fd76e98cfadeeea363d Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Tue, 21 Jan 2025 18:42:17 +0800 Subject: [PATCH 11/11] =?UTF-8?q?hotfix=20-=20=E8=B0=83=E6=95=B4=E8=BF=87?= =?UTF-8?q?=E6=9C=9F=E6=96=B9=E6=B3=95=E5=BF=85=E9=A1=BB=E8=B5=B0=E5=90=8C?= =?UTF-8?q?=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../axzo/workflow/client/feign/bpmn/ProcessActivityApi.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessActivityApi.java b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessActivityApi.java index 7cdfa0b6c..f7d41fcfc 100644 --- a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessActivityApi.java +++ b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/feign/bpmn/ProcessActivityApi.java @@ -1,7 +1,9 @@ package cn.axzo.workflow.client.feign.bpmn; import cn.axzo.workflow.client.annotation.WorkflowEngineFeignClient; +import cn.axzo.workflow.common.annotation.InvokeMode; import cn.axzo.workflow.common.annotation.Manageable; +import cn.axzo.workflow.common.enums.RpcInvokeModeEnum; import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutCallbackDTO; import cn.axzo.workflow.common.model.request.bpmn.activity.BpmnActivityTimeoutTriggerDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnActivitySetAssigneeDTO; @@ -16,6 +18,8 @@ import org.springframework.web.bind.annotation.RequestParam; import javax.validation.constraints.NotBlank; +import static cn.axzo.workflow.common.enums.RpcInvokeModeEnum.SYNC; + /** * 流程活动的 API * @@ -33,6 +37,7 @@ public interface ProcessActivityApi { */ @Deprecated @GetMapping("/api/process/activity/trigger") + @InvokeMode(SYNC) CommonResponse trigger(@NotBlank(message = "触发 ID 不能为空") @RequestParam String triggerId); /**