From 20ca3788dda28df4cd5a8684c1172e93596b955b Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Fri, 28 Jun 2024 17:43:08 +0800 Subject: [PATCH 1/6] =?UTF-8?q?update=20-=20Client=20API=20Feign=20?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E5=A2=9E=E5=8A=A0=20header?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WorkflowEngineClientAutoConfiguration.java | 5 +++-- .../client/config/WorkflowRequestInterceptor.java | 12 ++++++++---- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/config/WorkflowEngineClientAutoConfiguration.java b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/config/WorkflowEngineClientAutoConfiguration.java index 18029b184..abfde80e5 100644 --- a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/config/WorkflowEngineClientAutoConfiguration.java +++ b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/config/WorkflowEngineClientAutoConfiguration.java @@ -5,6 +5,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; import org.springframework.util.StringUtils; import javax.annotation.Nullable; @@ -199,8 +200,8 @@ public class WorkflowEngineClientAutoConfiguration { } @Bean - public RequestInterceptor workflowRequestInterceptor(String serviceVersion) { - return new WorkflowRequestInterceptor(serviceVersion); + public RequestInterceptor workflowRequestInterceptor(String serviceVersion, Environment environment) { + return new WorkflowRequestInterceptor(serviceVersion, environment); } } diff --git a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/config/WorkflowRequestInterceptor.java b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/config/WorkflowRequestInterceptor.java index ea35fc79f..a5c831343 100644 --- a/workflow-engine-api/src/main/java/cn/axzo/workflow/client/config/WorkflowRequestInterceptor.java +++ b/workflow-engine-api/src/main/java/cn/axzo/workflow/client/config/WorkflowRequestInterceptor.java @@ -3,6 +3,7 @@ package cn.axzo.workflow.client.config; import feign.RequestInterceptor; import feign.RequestTemplate; import feign.Target; +import org.springframework.core.env.Environment; /** * 通用的 Feign 请求拦截器 @@ -12,14 +13,16 @@ import feign.Target; */ public class WorkflowRequestInterceptor implements RequestInterceptor { private final String serviceVersion; + private final Environment environment; - public WorkflowRequestInterceptor(String serviceVersion) { + public WorkflowRequestInterceptor(String serviceVersion, Environment environment) { this.serviceVersion = serviceVersion; + this.environment = environment; } - public static final String HEADER_HTTP_CLIENT = "http-client"; - public static final String HEADER_HTTP_CLIENT_VALUE = "workflowEngine-feign"; - public static final String HEADER_API_VERSION = "service-version"; + public static final String HEADER_HTTP_CLIENT = "Http-Client"; + public static final String HEADER_HTTP_CLIENT_VALUE = "WorkflowEngine-Feign"; + public static final String HEADER_API_VERSION = "Service-Version"; public static final String HEADER_SERVER_NAME = "X-SERVER-NAME"; @@ -31,6 +34,7 @@ public class WorkflowRequestInterceptor implements RequestInterceptor { || apiClassPath.contains("cn.axzo.workflow.client.feign.manage")) { requestTemplate.header(HEADER_HTTP_CLIENT, HEADER_HTTP_CLIENT_VALUE); requestTemplate.header(HEADER_API_VERSION, serviceVersion); + requestTemplate.header(HEADER_SERVER_NAME, environment.getProperty("spring.application.name")); } } } From c35949088e238d30e49f12c8eb80b932549c9f7c Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Fri, 9 May 2025 16:36:15 +0800 Subject: [PATCH 2/6] =?UTF-8?q?fix=20-=20=E5=A2=9E=E5=8A=A0=20BpmnFlowNode?= =?UTF-8?q?Type=20=E6=9E=9A=E4=B8=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/axzo/workflow/common/enums/BpmnFlowNodeType.java | 1 + 1 file changed, 1 insertion(+) diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeType.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeType.java index 1dc7eb85d..c03147331 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeType.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnFlowNodeType.java @@ -19,6 +19,7 @@ public enum BpmnFlowNodeType { NODE_ROBOT("NODE_ROBOT", "机器人节点"), NODE_COMMENT("NODE_COMMENT", "评论节点"), NODE_ABORT("NODE_ABORT", "中止节点"), + NODE_ALTER("NODE_ALTER", "告警节点"), NODE_CANCEL("NODE_CANCEL", "撤回节点"), NODE_EMPTY("NODE_EMPTY", "空节点"), ; From fe5cf9ecf7e7b02c46530ae0f34a17073083b95b Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Thu, 21 Aug 2025 10:44:21 +0800 Subject: [PATCH 3/6] =?UTF-8?q?11.3.2-u1-SNAPSHOT=20=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../workflow/common/enums/BpmnProcessInstanceResultEnum.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnProcessInstanceResultEnum.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnProcessInstanceResultEnum.java index 81ba92e01..aa29c667a 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnProcessInstanceResultEnum.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/enums/BpmnProcessInstanceResultEnum.java @@ -6,10 +6,12 @@ public enum BpmnProcessInstanceResultEnum { PROCESSING("PROCESSING", "审批中"), APPROVED("APPROVED", "已通过"), REJECTED("REJECTED", "已驳回"), + BACKED("BACKED", "已回退"), CANCELLED("CANCELLED", "已撤回"), ABORTED("ABORTED", "已中止"), TRANSFER("TRANSFER", "已转交"), COUNTERSIGN("COUNTERSIGN", "已加签"), + UPGRADED("UPGRADED", "已提级"), COMMENTED("COMMENTED", "已评论"), DELETED("DELETED", "已删除"), ; From f0d4c528aa3e1a990f96d0655f4fc9efafcf07eb Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Thu, 28 Aug 2025 14:48:53 +0800 Subject: [PATCH 4/6] =?UTF-8?q?feat(REQ-4418)=20-=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E8=BF=87=E5=AE=A1=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../listener/task/service/impl/CheckApproverServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/service/impl/CheckApproverServiceImpl.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/service/impl/CheckApproverServiceImpl.java index 983907017..88a541253 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/service/impl/CheckApproverServiceImpl.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/service/impl/CheckApproverServiceImpl.java @@ -88,7 +88,8 @@ public class CheckApproverServiceImpl implements CheckApproverService { .filter(i -> !Objects.equals(i.getActivityId(), userTask.getId())) .filter(i -> !Objects.equals(i.getActivityType(), "exclusiveGateway")) .filter(i -> !Objects.equals(i.getActivityType(), "sequenceFlow")) - .max(Comparator.comparing(ActivityInstanceEntity::getStartTime)) + .filter(i -> !Objects.equals(i.getActivityType(), "startEvent")) + .max(Comparator.comparing(ActivityInstanceEntity::getEndTime)) .ifPresent(i -> { // 与发起人比对 if (Objects.equals(NODE_STARTER.getType(), i.getActivityId())) { From eb1b4e8e78c05acd8d538823eede98bad37f6ff4 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Thu, 28 Aug 2025 14:18:53 +0800 Subject: [PATCH 5/6] =?UTF-8?q?feat(REQ-4418)=20-=20=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E8=BF=87=E5=AE=A1=E6=B7=BB=E5=8A=A0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/CheckApproverServiceImpl.java | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/service/impl/CheckApproverServiceImpl.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/service/impl/CheckApproverServiceImpl.java index 88a541253..861d4052a 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/service/impl/CheckApproverServiceImpl.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/service/impl/CheckApproverServiceImpl.java @@ -1,5 +1,6 @@ package cn.axzo.workflow.server.controller.listener.task.service.impl; +import cn.axzo.framework.jackson.utility.JSON; import cn.axzo.workflow.common.enums.BpmnButtonEnum; import cn.axzo.workflow.common.enums.BpmnFlowNodeType; import cn.axzo.workflow.common.model.request.bpmn.BpmnButtonConf; @@ -12,6 +13,7 @@ import cn.axzo.workflow.core.repository.entity.ExtAxHiTaskInst; import cn.axzo.workflow.core.service.ExtAxHiTaskInstService; import cn.axzo.workflow.server.controller.listener.task.service.CheckApproverService; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.flowable.bpmn.model.FlowElement; import org.flowable.bpmn.model.Process; @@ -45,6 +47,7 @@ import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.APPROV * b. 连续节点 * c. 当前节点有同意按钮 */ +@Slf4j @Component @AllArgsConstructor public class CheckApproverServiceImpl implements CheckApproverService { @@ -58,27 +61,31 @@ public class CheckApproverServiceImpl implements CheckApproverService { //业务节点,指定业务审批人,或者业务设置了审批人,也要参与自动过审,node_type为NODE_BUSINESS,节点元素类型为UserTask //业务节点审批人为空,或者人员未指定,此时不进行自动过审操作,需要再业务指定审批人后,再做自动过审动作 if (!(Objects.equals(currentNodeType, NODE_TASK) || Objects.equals(currentNodeType, NODE_BUSINESS)) || - !StringUtils.hasText(delegateTask.getAssignee()) || - delegateTask.getAssignee().equals(NO_ASSIGNEE)) { + !StringUtils.hasText(delegateTask.getAssignee()) || + delegateTask.getAssignee().equals(NO_ASSIGNEE)) { + log.info("CheckApproverServiceImpl#checkApproverExists...节点类型:{},审批人:{}", currentNodeType, delegateTask.getAssignee()); return exists.get(); } Optional optConfig = BpmnMetaParserHelper.getButtonConfig(mainProcess, delegateTask.getTaskDefinitionKey()); if (!optConfig.isPresent()) { + log.info("CheckApproverServiceImpl#checkApproverExists...节点未配置按钮,节点ID:{}", delegateTask.getTaskDefinitionKey()); return exists.get(); } BpmnButtonConf bpmnButtonConf = optConfig.get(); List currentButtons = bpmnButtonConf.getCurrent(); if (CollectionUtils.isEmpty(currentButtons)) { + log.info("CheckApproverServiceImpl#checkApproverExists...节点按钮配置为空,节点ID:{}", delegateTask.getTaskDefinitionKey()); return exists.get(); } Optional agreeButton = currentButtons.stream() - .filter(button -> button.getType().equals("SYSTEM") //系统按钮 - && button.getChecked() != null && button.getChecked() //选中 - && (button.getDisabled() == null || !button.getDisabled()) //没用禁用 - && button.getBtnKey().equals(BpmnButtonEnum.BPMN_APPROVE.getBtnKey())) //类型为同意 - .findFirst(); + .filter(button -> button.getType().equals("SYSTEM") //系统按钮 + && button.getChecked() != null && button.getChecked() //选中 + && (button.getDisabled() == null || !button.getDisabled()) //没用禁用 + && button.getBtnKey().equals(BpmnButtonEnum.BPMN_APPROVE.getBtnKey())) //类型为同意 + .findFirst(); //不存在同意按钮 if (!agreeButton.isPresent()) { + log.info("CheckApproverServiceImpl#checkApproverExists...节点未配置同意按钮,节点ID:{}", delegateTask.getTaskDefinitionKey()); return exists.get(); } ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(); @@ -91,21 +98,26 @@ public class CheckApproverServiceImpl implements CheckApproverService { .filter(i -> !Objects.equals(i.getActivityType(), "startEvent")) .max(Comparator.comparing(ActivityInstanceEntity::getEndTime)) .ifPresent(i -> { + log.info("CheckApproverServiceImpl#checkApproverExists...上一个节点ID:{},类型:{}", i.getActivityId(), i.getActivityType()); // 与发起人比对 if (Objects.equals(NODE_STARTER.getType(), i.getActivityId())) { + log.info("CheckApproverServiceImpl#checkApproverExists...与发起人比对"); BpmnTaskDelegateAssigner initiator = BpmnTaskDelegateAssigner.toObjectCompatible(delegateTask.getVariable(INTERNAL_INITIATOR)); if (Objects.nonNull(initiator) && initiator.comparePersonIdToOther(delegateTask.getAssignee())) { exists.compareAndSet(false, true); } } else { + log.info("CheckApproverServiceImpl#checkApproverExists...与历史审批人比对, 上节点ID:{}", i.getActivityId()); FlowElement flowElement = mainProcess.getFlowElement(i.getActivityId()); BpmnMetaParserHelper.getNodeType(flowElement).ifPresent(j -> { + log.info("CheckApproverServiceImpl#checkApproverExists...上一个节点类型:{}", j); //上一节点如果是业务节点,但是是人员审批,也需要加入到自动过审 if (Objects.equals(NODE_TASK, j) || (Objects.equals(NODE_BUSINESS, j) && flowElement.getClass().isAssignableFrom(UserTask.class))) { ExtHiTaskSearchDTO searchDTO = new ExtHiTaskSearchDTO(); searchDTO.setProcessInstanceId(delegateTask.getProcessInstanceId()); List extAxHiTaskInsts = extAxHiTaskInstService.queryList(searchDTO); extAxHiTaskInsts.sort(Comparator.comparing(ExtAxHiTaskInst::getCreateAt)); + log.info("CheckApproverServiceImpl#checkApproverExists...历史审批任务列表:{}", JSON.toJSONString(extAxHiTaskInsts)); List previousTasks = new ArrayList<>(); for (int k = extAxHiTaskInsts.size() - 1; k > 0; k--) { ExtAxHiTaskInst extAxHiTaskInst = extAxHiTaskInsts.get(k); @@ -116,6 +128,7 @@ public class CheckApproverServiceImpl implements CheckApproverService { previousTasks.add(extAxHiTaskInst); } } + log.info("CheckApproverServiceImpl#checkApproverExists...待比对的历史审批任务列表:{}", JSON.toJSONString(previousTasks)); previousTasks.stream() .filter(e -> Objects.equals(e.getStatus(), APPROVED.getStatus())) .map(ExtAxHiTaskInst::getAssignee) From 3cb82baf659865cdc318a68cc30f174ec433b743 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Thu, 28 Aug 2025 14:52:00 +0800 Subject: [PATCH 6/6] =?UTF-8?q?feat(REQ-4418)=20-=20=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E8=BF=87=E5=AE=A1=E6=B7=BB=E5=8A=A0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/CheckApproverServiceImpl.java | 94 +++++++++---------- 1 file changed, 47 insertions(+), 47 deletions(-) diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/service/impl/CheckApproverServiceImpl.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/service/impl/CheckApproverServiceImpl.java index 861d4052a..1abe6f472 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/service/impl/CheckApproverServiceImpl.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/task/service/impl/CheckApproverServiceImpl.java @@ -90,56 +90,56 @@ public class CheckApproverServiceImpl implements CheckApproverService { } ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(); processEngineConfiguration.getActivityInstanceEntityManager() - .findActivityInstancesByProcessInstanceId(delegateTask.getProcessInstanceId(), false) - .stream() - .filter(i -> !Objects.equals(i.getActivityId(), userTask.getId())) - .filter(i -> !Objects.equals(i.getActivityType(), "exclusiveGateway")) - .filter(i -> !Objects.equals(i.getActivityType(), "sequenceFlow")) + .findActivityInstancesByProcessInstanceId(delegateTask.getProcessInstanceId(), false) + .stream() + .filter(i -> !Objects.equals(i.getActivityId(), userTask.getId())) + .filter(i -> !Objects.equals(i.getActivityType(), "exclusiveGateway")) + .filter(i -> !Objects.equals(i.getActivityType(), "sequenceFlow")) .filter(i -> !Objects.equals(i.getActivityType(), "startEvent")) .max(Comparator.comparing(ActivityInstanceEntity::getEndTime)) - .ifPresent(i -> { - log.info("CheckApproverServiceImpl#checkApproverExists...上一个节点ID:{},类型:{}", i.getActivityId(), i.getActivityType()); - // 与发起人比对 - if (Objects.equals(NODE_STARTER.getType(), i.getActivityId())) { - log.info("CheckApproverServiceImpl#checkApproverExists...与发起人比对"); - BpmnTaskDelegateAssigner initiator = BpmnTaskDelegateAssigner.toObjectCompatible(delegateTask.getVariable(INTERNAL_INITIATOR)); - if (Objects.nonNull(initiator) && initiator.comparePersonIdToOther(delegateTask.getAssignee())) { - exists.compareAndSet(false, true); - } - } else { - log.info("CheckApproverServiceImpl#checkApproverExists...与历史审批人比对, 上节点ID:{}", i.getActivityId()); - FlowElement flowElement = mainProcess.getFlowElement(i.getActivityId()); - BpmnMetaParserHelper.getNodeType(flowElement).ifPresent(j -> { - log.info("CheckApproverServiceImpl#checkApproverExists...上一个节点类型:{}", j); - //上一节点如果是业务节点,但是是人员审批,也需要加入到自动过审 - if (Objects.equals(NODE_TASK, j) || (Objects.equals(NODE_BUSINESS, j) && flowElement.getClass().isAssignableFrom(UserTask.class))) { - ExtHiTaskSearchDTO searchDTO = new ExtHiTaskSearchDTO(); - searchDTO.setProcessInstanceId(delegateTask.getProcessInstanceId()); - List extAxHiTaskInsts = extAxHiTaskInstService.queryList(searchDTO); - extAxHiTaskInsts.sort(Comparator.comparing(ExtAxHiTaskInst::getCreateAt)); - log.info("CheckApproverServiceImpl#checkApproverExists...历史审批任务列表:{}", JSON.toJSONString(extAxHiTaskInsts)); - List previousTasks = new ArrayList<>(); - for (int k = extAxHiTaskInsts.size() - 1; k > 0; k--) { - ExtAxHiTaskInst extAxHiTaskInst = extAxHiTaskInsts.get(k); - if (!extAxHiTaskInst.getTaskDefinitionKey().equals(i.getActivityId()) && !CollectionUtils.isEmpty(previousTasks)) { - break; - } - if (extAxHiTaskInst.getTaskDefinitionKey().equals(i.getActivityId())) { - previousTasks.add(extAxHiTaskInst); - } - } - log.info("CheckApproverServiceImpl#checkApproverExists...待比对的历史审批任务列表:{}", JSON.toJSONString(previousTasks)); - previousTasks.stream() - .filter(e -> Objects.equals(e.getStatus(), APPROVED.getStatus())) - .map(ExtAxHiTaskInst::getAssignee) - .filter(Objects::nonNull) - .filter(StringUtils::hasText) - .filter(k -> specialApproverComparison(k, delegateTask.getAssignee())) - .findAny().ifPresent(k -> exists.compareAndSet(false, true)); + .ifPresent(i -> { + log.info("CheckApproverServiceImpl#checkApproverExists...上一个节点ID:{},类型:{}", i.getActivityId(), i.getActivityType()); + // 与发起人比对 + if (Objects.equals(NODE_STARTER.getType(), i.getActivityId())) { + log.info("CheckApproverServiceImpl#checkApproverExists...与发起人比对"); + BpmnTaskDelegateAssigner initiator = BpmnTaskDelegateAssigner.toObjectCompatible(delegateTask.getVariable(INTERNAL_INITIATOR)); + if (Objects.nonNull(initiator) && initiator.comparePersonIdToOther(delegateTask.getAssignee())) { + exists.compareAndSet(false, true); } - }); - } - }); + } else { + log.info("CheckApproverServiceImpl#checkApproverExists...与历史审批人比对, 上节点ID:{}", i.getActivityId()); + FlowElement flowElement = mainProcess.getFlowElement(i.getActivityId()); + BpmnMetaParserHelper.getNodeType(flowElement).ifPresent(j -> { + log.info("CheckApproverServiceImpl#checkApproverExists...上一个节点类型:{}", j); + //上一节点如果是业务节点,但是是人员审批,也需要加入到自动过审 + if (Objects.equals(NODE_TASK, j) || (Objects.equals(NODE_BUSINESS, j) && flowElement.getClass().isAssignableFrom(UserTask.class))) { + ExtHiTaskSearchDTO searchDTO = new ExtHiTaskSearchDTO(); + searchDTO.setProcessInstanceId(delegateTask.getProcessInstanceId()); + List extAxHiTaskInsts = extAxHiTaskInstService.queryList(searchDTO); + extAxHiTaskInsts.sort(Comparator.comparing(ExtAxHiTaskInst::getCreateAt)); + log.info("CheckApproverServiceImpl#checkApproverExists...历史审批任务列表:{}", JSON.toJSONString(extAxHiTaskInsts)); + List previousTasks = new ArrayList<>(); + for (int k = extAxHiTaskInsts.size() - 1; k > 0; k--) { + ExtAxHiTaskInst extAxHiTaskInst = extAxHiTaskInsts.get(k); + if (!extAxHiTaskInst.getTaskDefinitionKey().equals(i.getActivityId()) && !CollectionUtils.isEmpty(previousTasks)) { + break; + } + if (extAxHiTaskInst.getTaskDefinitionKey().equals(i.getActivityId())) { + previousTasks.add(extAxHiTaskInst); + } + } + log.info("CheckApproverServiceImpl#checkApproverExists...待比对的历史审批任务列表:{}", JSON.toJSONString(previousTasks)); + previousTasks.stream() + .filter(e -> Objects.equals(e.getStatus(), APPROVED.getStatus())) + .map(ExtAxHiTaskInst::getAssignee) + .filter(Objects::nonNull) + .filter(StringUtils::hasText) + .filter(k -> specialApproverComparison(k, delegateTask.getAssignee())) + .findAny().ifPresent(k -> exists.compareAndSet(false, true)); + } + }); + } + }); return exists.get(); }