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 7990cf413..4c60faea3 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 @@ -4,6 +4,7 @@ import cn.axzo.workflow.common.constant.BpmnConstants; import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum; import cn.axzo.workflow.common.enums.ApproverSpecifyEnum; import cn.axzo.workflow.common.enums.BpmnFlowNodeType; +import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.core.common.utils.BpmnMetaParserHelper; import cn.axzo.workflow.core.conf.SupportRefreshProperties; @@ -11,6 +12,8 @@ import cn.axzo.workflow.core.deletage.BpmnTaskAssigneeSelector; import cn.axzo.workflow.core.deletage.BpmnTaskCalculateDTO; import cn.axzo.workflow.core.deletage.BpmnTaskDelegate; import cn.axzo.workflow.core.deletage.MockTaskAssigneeSelector; +import cn.axzo.workflow.core.engine.cmd.CustomAbortProcessInstanceAsyncCmd; +import cn.axzo.workflow.core.service.ExtAxHiTaskInstService; import cn.hutool.json.JSONUtil; import com.alibaba.fastjson.JSON; import com.google.common.collect.Lists; @@ -21,9 +24,9 @@ import org.flowable.bpmn.model.Process; import org.flowable.bpmn.model.UserTask; import org.flowable.engine.delegate.DelegateExecution; import org.flowable.engine.delegate.ExecutionListener; +import org.flowable.engine.impl.util.CommandContextUtil; import org.flowable.engine.impl.util.ProcessDefinitionUtil; import org.springframework.beans.factory.ObjectProvider; -import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; @@ -183,6 +186,13 @@ public class EngineExecutionStartListener implements ExecutionListener { case transferToAdmin: assigners.addAll(approverSelect(ApproverEmptyHandleTypeEnum.transferToAdmin.getType(), userTask, execution, true)); + if (CollectionUtils.isEmpty(assigners)) { + BpmnProcessInstanceAbortDTO abortDTO = new BpmnProcessInstanceAbortDTO(); + abortDTO.setProcessInstanceId(execution.getProcessInstanceId()); + abortDTO.setReason("转交管理员失败,系统中止"); + CommandContextUtil.getProcessEngineConfiguration().getCommandExecutor() + .execute(new CustomAbortProcessInstanceAsyncCmd(abortDTO)); + } break; case specifyAssignee: List emptyAssignees = diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedIdentityTaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedIdentityTaskAssigneeSelector.java index d137fa30f..7caae6178 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedIdentityTaskAssigneeSelector.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedIdentityTaskAssigneeSelector.java @@ -54,7 +54,7 @@ public class BasedIdentityTaskAssigneeSelector extends AbstractBpmnTaskAssigneeS .collect(Collectors.toList())) .identityCodes(super.getTypes(flowElement)) .build(); - + req.setProcInstId(execution.getProcessInstanceId()); List flowTaskAssigners = parseApiResult(() -> flowSupportApi.listTaskAssignerByIdentity(req), "审批节点: " + flowElement.getId() + ", 通过身份查询审批人", 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 66b0835d6..2b8b8aa0d 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 @@ -68,7 +68,6 @@ public class BasedInitiatorLeaderTaskAssigneeSelector extends AbstractBpmnTaskAs .identityId(Long.valueOf(initiator.getAssignee())) .identityType(Integer.valueOf(initiator.getAssigneeType())).build()) .build(); - List flowTaskAssigners = parseApiResult(() -> organizationalNodeUserApi.listFlowTaskAssigner(req), "审批节点: " + flowElement.getId() + ", 通过发起人主管查询审批人", diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedRoleTaskAssigneeSelector.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedRoleTaskAssigneeSelector.java index 9932c4c3c..14d42252d 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedRoleTaskAssigneeSelector.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BasedRoleTaskAssigneeSelector.java @@ -88,6 +88,7 @@ public class BasedRoleTaskAssigneeSelector extends AbstractBpmnTaskAssigneeSelec .variables(variables) .build(); + req.setProcInstId(execution.getProcessInstanceId()); List flowTaskAssigners = parseApiResult(() -> flowSupportApi.listTaskAssignerByRoles(req), "审批节点: " + flowElement.getId() + ", 通过角色查询审批人", "cn.axzo.karma.client.feign.FlowSupportApi.listTaskAssignerByRoles", req); 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 a282e55c5..76c29318e 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 @@ -4,11 +4,13 @@ import cn.axzo.karma.client.model.request.ListFlowTaskAssignerReq; import cn.axzo.karma.client.model.response.FlowTaskAssignerResp; import cn.axzo.workflow.common.enums.ApproverEmptyHandleTypeEnum; import cn.axzo.workflow.common.enums.ApproverScopeEnum; +import cn.axzo.workflow.common.enums.ApproverSpecifyEnum; 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 cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; +import com.alibaba.fastjson.JSON; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.ListUtils; import org.flowable.bpmn.model.FlowElement; @@ -17,8 +19,12 @@ import org.flowable.engine.delegate.DelegateExecution; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; +import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; /** @@ -51,6 +57,13 @@ public class TransferToAdminTaskAssigneeSelector extends AbstractBpmnTaskAssigne protected List invokeService(FlowElement flowElement, DelegateExecution execution, ApproverScopeDTO scopeDto) { + Optional optSpecify = BpmnMetaParserHelper.getApproverSpecify((UserTask) flowElement); + if (optSpecify.isPresent() + && !Objects.equals(ApproverSpecifyEnum.position, optSpecify.get()) + && !Objects.equals(ApproverSpecifyEnum.role, optSpecify.get())) { + return Collections.emptyList(); + } + ListFlowTaskAssignerReq.ListFlowTaskAssignerReqBuilder builder = ListFlowTaskAssignerReq.builder(); if (!CollectionUtils.isEmpty(scopeDto.getOrgScopes())) { builder.orgScopes(ListUtils.emptyIfNull(scopeDto.getOrgScopes()).stream() @@ -63,6 +76,8 @@ public class TransferToAdminTaskAssigneeSelector extends AbstractBpmnTaskAssigne .collect(Collectors.toList())); } ListFlowTaskAssignerReq req = builder.workspaceAdmin(false).build(); + req.setProcInstId(execution.getProcessInstanceId()); + req.setCooperateTypes(getCooperationTypes(flowElement)); BpmnMetaParserHelper.getApproverScope((UserTask) flowElement) .ifPresent(i -> { if (Objects.equals(i, ApproverScopeEnum.projectWorkspace)) { @@ -80,4 +95,19 @@ public class TransferToAdminTaskAssigneeSelector extends AbstractBpmnTaskAssigne } return BeanUtil.copyToList(flowTaskAssigners, BpmnTaskDelegateAssigner.class); } + + public Set getCooperationTypes(FlowElement flowElement) { + return BpmnMetaParserHelper.getApproverSpecifyValue((UserTask) flowElement) + .map(value -> JSON.parseArray(value, String.class) + .stream().map(JSON::parseObject) + .map(i -> i.getString("type")) + .collect(Collectors.toList()) + .stream() + .flatMap(s -> Arrays.stream(s.split(","))) + .map(Integer::parseInt) + .collect(Collectors.toSet()) + ) + .orElse(Collections.emptySet()); + } + }