From e83715ae8460282dd2136df5b675b1decce2329b Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Sun, 8 Oct 2023 16:24:04 +0800 Subject: [PATCH 1/3] =?UTF-8?q?update=20-=20=E8=B0=83=E6=95=B4=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E5=86=85=E9=83=A8=E7=9A=84=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/BpmConstants.java | 6 +- .../request/bpmn/task/BpmnTaskAuditDTO.java | 3 +- .../bpmn/task/BpmnTaskInstanceVO.java | 4 +- .../core/common/utils/BpmTransformUtil.java | 3 +- .../core/listener/BpmTaskEventListener.java | 8 +-- .../service/converter/BpmnTaskConverter.java | 1 - .../engine/EngineExecutionStartListener.java | 32 +++++---- .../impl/BpmnProcessInstanceServiceImpl.java | 10 +-- .../service/impl/BpmnTaskServiceImpl.java | 19 ++--- .../delegate/BpmnDefaultTaskDelegateImpl.java | 65 +++++++++++++++++ .../CustomBpmTaskTaskEventListener.java | 22 +++++- .../RocketMqBpmProcessEventListener.java | 70 ++++++++----------- .../RocketMqBpmTaskEventListener.java | 9 ++- 13 files changed, 168 insertions(+), 84 deletions(-) diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/BpmConstants.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/BpmConstants.java index 7fb16200f..39ad3cb44 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/BpmConstants.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/BpmConstants.java @@ -25,8 +25,12 @@ public interface BpmConstants { String INTERNAL_PROCESS_TYPE_CANCEL = "_INTERNAL_PROCESS_TYPE_CANCEL"; String INTERNAL_PROCESS_TYPE_REJECT = "_INTERNAL_PROCESS_TYPE_REJECT"; String INTERNAL_SPECIFY_NEXT_APPROVER = "_INTERNAL_SPECIFY_NEXT_APPROVER"; - String INTERNAL_TASK_RELATION_ASSIGNEE_INFO = "[_ASSIGNEE_INFO_]"; + // String INTERNAL_TASK_RELATION_ASSIGNEE_INFO = "[_ASSIGNEE_INFO_]"; + // 用于多实例审批时,保存计算出来的审批人 + String INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO = "[_ASSIGNEE_LIST_INFO_]"; + // 单任务节点, String INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT = "[_ASSIGNEE_INFO_SNAPSHOT_]"; + String INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT = "[_ASSIGNEE_LIST_INFO_SNAPSHOT_]"; String PROCESS_PREFIX = "Flowable"; diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskAuditDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskAuditDTO.java index ff0403f66..9067c8b3c 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskAuditDTO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnTaskAuditDTO.java @@ -35,7 +35,6 @@ public class BpmnTaskAuditDTO { /** * 下级审批人 */ - @ApiModelProperty(value = "下级审批人", notes = "可为空,定义选择审批人,如果不为空,则覆盖下一级任务的审核人") - @NotNull(message = "下级审批不能为空", groups = ValidGroup.Insert.class) + @ApiModelProperty(value = "下级审批人信息", notes = "可为空,定义选择审批人,如果不为空,则覆盖下一级任务的审核人") private BpmnTaskDelegateAssigner nextApprover; } diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskInstanceVO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskInstanceVO.java index df10405e5..38ff603b6 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskInstanceVO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/response/bpmn/task/BpmnTaskInstanceVO.java @@ -1,5 +1,6 @@ package cn.axzo.workflow.common.model.response.bpmn.task; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -29,8 +30,7 @@ public class BpmnTaskInstanceVO { @ApiModelProperty(value = "任务归属人") private String owner; @ApiModelProperty(value = "任务审批人") - // TODO 调整审批人 - private String assignee; + private BpmnTaskDelegateAssigner assigner; @ApiModelProperty(value = "任务创建时间") private Date createTime; @ApiModelProperty(value = "租户") diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmTransformUtil.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmTransformUtil.java index 97bf6edb1..5394ea39c 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmTransformUtil.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmTransformUtil.java @@ -38,6 +38,7 @@ import java.util.stream.Collectors; import static cn.axzo.workflow.common.constant.BpmConstants.AND_SIGN_EXPRESSION; import static cn.axzo.workflow.common.constant.BpmConstants.BPM_ALLOW_SKIP_USER_TASK; import static cn.axzo.workflow.common.constant.BpmConstants.END_EVENT_ID; +import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO; import static cn.axzo.workflow.common.constant.BpmConstants.OR_SIGN_EXPRESSION; import static cn.axzo.workflow.core.common.enums.BpmErrorCode.CONVERTOR_META_DATA_FORMAT_ERROR; import static cn.axzo.workflow.core.common.enums.BpmErrorCode.CONVERTOR_UNKNOW_NODE_TYPE; @@ -373,7 +374,7 @@ public class BpmTransformUtil { MultiInstanceLoopCharacteristics multiInstanceLoopCharacteristics = new MultiInstanceLoopCharacteristics(); // 审批人集合参数 - multiInstanceLoopCharacteristics.setInputDataItem(userTask.getId() + "_assigneeList"); + multiInstanceLoopCharacteristics.setInputDataItem(INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO + userTask.getId()); // 迭代集合 multiInstanceLoopCharacteristics.setElementVariable("assigneeName"); // 并行 diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmTaskEventListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmTaskEventListener.java index 5ea0893ec..998ae8d01 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmTaskEventListener.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/listener/BpmTaskEventListener.java @@ -11,22 +11,22 @@ public interface BpmTaskEventListener extends Ordered { /** * 用户任务已创建,未指派审核人 */ - void onCreated(DelegateTask delegateTask); + default void onCreated(DelegateTask delegateTask) {} /** * 用户任务已指派审核人 */ - void onAssigned(DelegateTask delegateTask); + default void onAssigned(DelegateTask delegateTask) {} /** * 用户任务已通过 *

* 仅审核通过一个用户任务时触发, 如果任务是拒绝了, 则直接走实例取消事件 */ - void onCompleted(DelegateTask delegateTask); + default void onCompleted(DelegateTask delegateTask) {} /** * 用户任务已删除 */ - void onDeleted(DelegateTask delegateTask); + default void onDeleted(DelegateTask delegateTask) {} } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/converter/BpmnTaskConverter.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/converter/BpmnTaskConverter.java index 7bc1d2ca0..76df145a9 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/converter/BpmnTaskConverter.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/converter/BpmnTaskConverter.java @@ -27,7 +27,6 @@ public interface BpmnTaskConverter extends EntityConverter vos = bpmnTaskConverter.toVos(query.list()); + List snapshotTaskIds = + vos.stream().map(i -> INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT + i.getTaskId()).collect(Collectors.toList()); + Map instanceMap = runtimeService.getVariableInstances(processInstanceId, + snapshotTaskIds); + vos.forEach(i -> i.setAssigner((BpmnTaskDelegateAssigner) instanceMap.get(INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT + i.getTaskId()).getValue())); + return vos; } /** @@ -535,18 +541,13 @@ public class BpmnTaskServiceImpl implements BpmnTaskService { if (Objects.isNull(dto.getTargetAssigner())) { taskService.setAssignee(task.getId(), ""); runtimeService.removeVariable(task.getProcessInstanceId(), INTERNAL_SPECIFY_NEXT_APPROVER); - runtimeService.removeVariable(task.getProcessInstanceId() + task.getTaskDefinitionKey(), - INTERNAL_TASK_RELATION_ASSIGNEE_INFO); - runtimeService.removeVariable(task.getProcessInstanceId() + task.getTaskDefinitionKey(), + runtimeService.removeVariable(task.getProcessInstanceId() + task.getId(), INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT); } else { runtimeService.setVariable(task.getProcessInstanceId(), INTERNAL_SPECIFY_NEXT_APPROVER, dto.getTargetAssigner()); runtimeService.setVariable(task.getProcessInstanceId(), - INTERNAL_TASK_RELATION_ASSIGNEE_INFO + task.getTaskDefinitionKey(), - dto.getTargetAssigner().buildAssigneeId()); - runtimeService.setVariable(task.getProcessInstanceId(), - INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT + task.getTaskDefinitionKey(), + INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT + task.getId(), dto.getTargetAssigner()); taskService.setAssignee(task.getId(), dto.getTargetAssigner().buildAssigneeId()); diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BpmnDefaultTaskDelegateImpl.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BpmnDefaultTaskDelegateImpl.java index 55a26d34e..43f539385 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BpmnDefaultTaskDelegateImpl.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/delegate/BpmnDefaultTaskDelegateImpl.java @@ -6,9 +6,11 @@ import cn.axzo.workflow.core.deletage.BpmTaskDelegate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.Optional; import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_SPECIFY_NEXT_APPROVER; @@ -29,6 +31,69 @@ public class BpmnDefaultTaskDelegateImpl implements BpmTaskDelegate { Optional.ofNullable(delegateTask.getVariables().get(INTERNAL_SPECIFY_NEXT_APPROVER)).ifPresent(next -> { assigners.add((BpmnTaskDelegateAssigner) next); }); + + if (CollectionUtils.isEmpty(assigners)) { + if (Objects.equals("NODE1694773129716_0.9426625492049914_1", delegateTask.getTaskDefinitionKey())) { + // 或签 + BpmnTaskDelegateAssigner assigner1 = new BpmnTaskDelegateAssigner(); + assigner1.setAssignee("1"); + assigner1.setAssigneeType("5"); + assigner1.setAssignerName("或签人1"); + assigner1.setPersonId("100001"); + assigner1.setTenantId("296"); + assigners.add(assigner1); + } else if (Objects.equals("NODE1695291557658_0.7106808048056956_1", delegateTask.getTaskDefinitionKey())) { + // 会签节点 + BpmnTaskDelegateAssigner assigner1 = new BpmnTaskDelegateAssigner(); + assigner1.setAssignee("1"); + assigner1.setAssigneeType("5"); + assigner1.setAssignerName("会签人1"); + assigner1.setPersonId("100001"); + assigner1.setTenantId("296"); + assigners.add(assigner1); + + BpmnTaskDelegateAssigner assigner2 = new BpmnTaskDelegateAssigner(); + assigner2.setAssignee("2"); + assigner2.setAssigneeType("5"); + assigner2.setAssignerName("会签人2"); + assigner2.setPersonId("100002"); + assigner2.setTenantId("296"); + assigners.add(assigner2); + + BpmnTaskDelegateAssigner assigner3 = new BpmnTaskDelegateAssigner(); + assigner3.setAssignee("3"); + assigner3.setAssigneeType("5"); + assigner3.setAssignerName("会签人3"); + assigner3.setPersonId("100003"); + assigner3.setTenantId("296"); + assigners.add(assigner3); + + BpmnTaskDelegateAssigner assigner4 = new BpmnTaskDelegateAssigner(); + assigner4.setAssignee("4"); + assigner4.setAssigneeType("5"); + assigner4.setAssignerName("会签人4"); + assigner4.setPersonId("100004"); + assigner4.setTenantId("296"); + assigners.add(assigner4); + } else if (Objects.equals("NODE1694770290894_0.4227607475273871_1", delegateTask.getTaskDefinitionKey())) { + // 或签节点 + BpmnTaskDelegateAssigner assigner1 = new BpmnTaskDelegateAssigner(); + assigner1.setAssignee("1"); + assigner1.setAssigneeType("5"); + assigner1.setAssignerName("或签人1"); + assigner1.setPersonId("100001"); + assigner1.setTenantId("296"); + assigners.add(assigner1); + + BpmnTaskDelegateAssigner assigner2 = new BpmnTaskDelegateAssigner(); + assigner2.setAssignee("2"); + assigner2.setAssigneeType("5"); + assigner2.setAssignerName("或签人2"); + assigner2.setPersonId("100001"); + assigner2.setTenantId("296"); + assigners.add(assigner2); + } + } return assigners; } } diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/CustomBpmTaskTaskEventListener.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/CustomBpmTaskTaskEventListener.java index 4de032eb9..f70e7162b 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/CustomBpmTaskTaskEventListener.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/CustomBpmTaskTaskEventListener.java @@ -1,8 +1,17 @@ package cn.axzo.workflow.server.controller.listener; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.core.listener.BpmTaskEventListener; import lombok.extern.slf4j.Slf4j; import org.flowable.task.service.delegate.DelegateTask; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.Objects; + +import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT; +import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT; /** * 自定义实现的流程监听器, 实现了 Ordered 接口 @@ -13,7 +22,7 @@ import org.flowable.task.service.delegate.DelegateTask; * @since 2023/9/25 18:50 */ @Slf4j -//@Component +@Component public class CustomBpmTaskTaskEventListener implements BpmTaskEventListener { @Override public void onCreated(DelegateTask delegateTask) { @@ -22,6 +31,17 @@ public class CustomBpmTaskTaskEventListener implements BpmTaskEventListener { @Override public void onAssigned(DelegateTask delegateTask) { + List assignerList = + (List) delegateTask.getVariable(INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + delegateTask.getTaskDefinitionKey()); + if (CollectionUtils.isEmpty(assignerList)) { + return; + } + // identityId_identityType + String assignee = delegateTask.getAssignee(); + assignerList.stream().filter(i -> Objects.equals(assignee, i.buildAssigneeId())).findFirst().ifPresent(i -> { + // 保存每个 taskId 的审批人 + delegateTask.setVariable(INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT + delegateTask.getId(), i); + }); log.info("task assigned..."); } diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/RocketMqBpmProcessEventListener.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/RocketMqBpmProcessEventListener.java index ad1e79d06..047165be5 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/RocketMqBpmProcessEventListener.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/RocketMqBpmProcessEventListener.java @@ -2,6 +2,7 @@ package cn.axzo.workflow.server.controller.listener; import cn.axzo.framework.rocketmq.Event; import cn.axzo.framework.rocketmq.EventProducer; +import cn.axzo.workflow.common.enums.ProcessInstanceEventEnum; import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.common.model.response.mq.ProcessInstanceDTO; import cn.axzo.workflow.core.listener.BpmProcessEventListener; @@ -19,7 +20,11 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_INITIATOR; -import static cn.axzo.workflow.common.enums.ProcessInstanceEventEnum.*; +import static cn.axzo.workflow.common.enums.ProcessInstanceEventEnum.PROCESS_INSTANCE_CANCELLED; +import static cn.axzo.workflow.common.enums.ProcessInstanceEventEnum.PROCESS_INSTANCE_COMPLETED; +import static cn.axzo.workflow.common.enums.ProcessInstanceEventEnum.PROCESS_INSTANCE_CREATED; +import static cn.axzo.workflow.common.enums.ProcessInstanceEventEnum.PROCESS_INSTANCE_REJECTED; +import static cn.axzo.workflow.common.enums.ProcessInstanceEventEnum.PROCESS_INSTANCE_STARTED; /** @@ -61,13 +66,7 @@ public class RocketMqBpmProcessEventListener implements BpmProcessEventListener .setBusinessKey(((ExecutionEntityImpl) event.getEntity()).getBusinessKey()) .setBusinessProcessInstanceName(((ExecutionEntityImpl) event.getEntity()).getName()); log.info("RocketMqBpmProcessEventListener#onCreated MQ.Data: {}", JSON.toJSONString(dto)); - eventProducer.send(Event.builder() - .shardingKey(event.getProcessInstanceId()) - .eventCode(PROCESS_INSTANCE_CREATED.getEventCode()) - .targetId(event.getProcessInstanceId()) - .targetType(PROCESS_INSTANCE_CREATED.getTag()) - .data(dto) - .build()); + sendMessageQueue(dto, PROCESS_INSTANCE_CREATED); } @Override @@ -95,13 +94,7 @@ public class RocketMqBpmProcessEventListener implements BpmProcessEventListener .setBusinessKey(((ExecutionEntityImpl) event.getEntity()).getProcessInstance().getBusinessKey()) .setBusinessProcessInstanceName(((ExecutionEntityImpl) event.getEntity()).getProcessInstance().getName()); log.info("RocketMqBpmProcessEventListener#onStarted MQ.Data: {}", JSON.toJSONString(dto)); - eventProducer.send(Event.builder() - .shardingKey(((ExecutionEntityImpl) event.getEntity()).getProcessInstanceId()) - .eventCode(PROCESS_INSTANCE_STARTED.getEventCode()) - .targetId(((ExecutionEntityImpl) event.getEntity()).getProcessInstanceId()) - .targetType(PROCESS_INSTANCE_STARTED.getTag()) - .data(dto) - .build()); + sendMessageQueue(dto, PROCESS_INSTANCE_STARTED); } @Override @@ -129,13 +122,7 @@ public class RocketMqBpmProcessEventListener implements BpmProcessEventListener .setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName()) .setCancelReason(String.valueOf(event.getCause())); log.info("RocketMqBpmProcessEventListener#onCancelled MQ.Data: {}", JSON.toJSONString(dto)); - eventProducer.send(Event.builder() - .shardingKey(event.getProcessInstanceId()) - .eventCode(PROCESS_INSTANCE_CANCELLED.getEventCode()) - .targetId(event.getProcessInstanceId()) - .targetType(PROCESS_INSTANCE_CANCELLED.getTag()) - .data(dto) - .build()); + sendMessageQueue(dto, PROCESS_INSTANCE_CANCELLED); } /** @@ -168,13 +155,7 @@ public class RocketMqBpmProcessEventListener implements BpmProcessEventListener .setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName()) .setCancelReason(String.valueOf(event.getCause())); log.info("RocketMqBpmProcessEventListener#onRejected MQ.Data: {}", JSON.toJSONString(dto)); - eventProducer.send(Event.builder() - .shardingKey(event.getProcessInstanceId()) - .eventCode(PROCESS_INSTANCE_REJECTED.getEventCode()) - .targetId(event.getProcessInstanceId()) - .targetType(PROCESS_INSTANCE_REJECTED.getTag()) - .data(dto) - .build()); + sendMessageQueue(dto, PROCESS_INSTANCE_REJECTED); } @Override @@ -184,7 +165,7 @@ public class RocketMqBpmProcessEventListener implements BpmProcessEventListener JSON.toJSONString(event)); } Deployment deployment = - repositoryService.createDeploymentQuery().deploymentId(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getDeploymentId()) + repositoryService.createDeploymentQuery().deploymentId(((ExecutionEntityImpl) event.getEntity()).getDeploymentId()) .singleResult(); ProcessInstanceDTO dto = new ProcessInstanceDTO() .setType(PROCESS_INSTANCE_COMPLETED) @@ -192,20 +173,25 @@ public class RocketMqBpmProcessEventListener implements BpmProcessEventListener .setProcessInstanceId(event.getProcessInstanceId()) .setCurrentElementKey("取消流程实例无节点信息") .setProcessDefinitionId(event.getProcessDefinitionId()) - .setProcessDefinitionKey(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getProcessDefinitionKey()) - .setProcessDefinitionVersion(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getProcessDefinitionVersion()) - .setInitiator(((FlowableProcessCancelledEventImpl) event).getExecution().getVariable(INTERNAL_INITIATOR, BpmnTaskDelegateAssigner.class)) - .setVariables(((FlowableProcessCancelledEventImpl) event).getExecution().getVariables()) - .setStartTime(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getStartTime()) - .setTenantId(((FlowableProcessCancelledEventImpl) event).getExecution().getTenantId()) - .setBusinessKey(((FlowableProcessCancelledEventImpl) event).getExecution().getProcessInstanceBusinessKey()) - .setBusinessProcessInstanceName(((ExecutionEntityImpl) ((FlowableProcessCancelledEventImpl) event).getExecution()).getName()); + .setProcessDefinitionKey(((ExecutionEntityImpl) event.getEntity()).getProcessDefinitionKey()) + .setProcessDefinitionVersion(((ExecutionEntityImpl) event.getEntity()).getProcessDefinitionVersion()) + .setInitiator(((ExecutionEntityImpl) event.getEntity()).getVariable(INTERNAL_INITIATOR, + BpmnTaskDelegateAssigner.class)) + .setVariables(((ExecutionEntityImpl) event.getEntity()).getVariables()) + .setStartTime(((ExecutionEntityImpl) event.getEntity()).getStartTime()) + .setTenantId(((ExecutionEntityImpl) event.getEntity()).getTenantId()) + .setBusinessKey(((ExecutionEntityImpl) event.getEntity()).getProcessInstanceBusinessKey()) + .setBusinessProcessInstanceName(((ExecutionEntityImpl) event.getEntity()).getName()); log.info("RocketMqBpmProcessEventListener#onCompleted MQ.Data: {}", JSON.toJSONString(dto)); + sendMessageQueue(dto, PROCESS_INSTANCE_COMPLETED); + } + + private void sendMessageQueue(ProcessInstanceDTO dto, ProcessInstanceEventEnum eventEnum) { eventProducer.send(Event.builder() - .shardingKey(event.getProcessInstanceId()) - .eventCode(PROCESS_INSTANCE_COMPLETED.getEventCode()) - .targetId(event.getProcessInstanceId()) - .targetType(PROCESS_INSTANCE_COMPLETED.getTag()) + .shardingKey(dto.getProcessInstanceId()) + .eventCode(eventEnum.getEventCode()) + .targetId(dto.getProcessInstanceId()) + .targetType(eventEnum.getTag()) .data(dto) .build()); } diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/RocketMqBpmTaskEventListener.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/RocketMqBpmTaskEventListener.java index 96857e5d0..73580a00d 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/RocketMqBpmTaskEventListener.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/RocketMqBpmTaskEventListener.java @@ -17,8 +17,11 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_INITIATOR; -import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_SPECIFY_NEXT_APPROVER; -import static cn.axzo.workflow.common.enums.ProcessTaskEventEnum.*; +import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT; +import static cn.axzo.workflow.common.enums.ProcessTaskEventEnum.PROCESS_TASK_ASSIGNED; +import static cn.axzo.workflow.common.enums.ProcessTaskEventEnum.PROCESS_TASK_COMPLETED; +import static cn.axzo.workflow.common.enums.ProcessTaskEventEnum.PROCESS_TASK_CREATED; +import static cn.axzo.workflow.common.enums.ProcessTaskEventEnum.PROCESS_TASK_DELETED; /** @@ -94,7 +97,7 @@ public class RocketMqBpmTaskEventListener implements BpmTaskEventListener { .setCurrentElementName(delegateTask.getName()) .setProcessDefinitionId(delegateTask.getProcessDefinitionId()) .setInitiator(delegateTask.getVariable(INTERNAL_INITIATOR, BpmnTaskDelegateAssigner.class)) - .setApprover(delegateTask.getVariable(INTERNAL_SPECIFY_NEXT_APPROVER, BpmnTaskDelegateAssigner.class)) + .setApprover(delegateTask.getVariable(INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT + delegateTask.getId(), BpmnTaskDelegateAssigner.class)) .setVariables(delegateTask.getVariables()) .setStartTime(delegateTask.getCreateTime()) .setTenantId(delegateTask.getTenantId()); From 078cdf6045e76175af1588639a30ec2e50cd09e1 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Sun, 8 Oct 2023 18:17:01 +0800 Subject: [PATCH 2/3] =?UTF-8?q?update=20-=20=E8=B0=83=E6=95=B4=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E5=86=85=E9=83=A8=E7=9A=84=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E5=85=B3=E4=BA=8E=E4=BA=BA=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../process/BpmnProcessInstanceCancelDTO.java | 21 ------------------- .../core/common/utils/BpmTransformUtil.java | 2 +- .../engine/EngineExecutionStartListener.java | 2 +- .../impl/BpmnProcessInstanceServiceImpl.java | 4 ++-- .../service/impl/BpmnTaskServiceImpl.java | 12 +++++------ .../CustomBpmTaskTaskEventListener.java | 16 +------------- 6 files changed, 10 insertions(+), 47 deletions(-) diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCancelDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCancelDTO.java index 5a9ea55eb..9f91bf6e9 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCancelDTO.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/process/BpmnProcessInstanceCancelDTO.java @@ -42,25 +42,4 @@ public class BpmnProcessInstanceCancelDTO { @NotNull(message = "审批流程的发起人不能为空") private BpmnTaskDelegateAssigner initiator; - // /** - // * 租户 ID - // */ - // @NotBlank(message = "租户不能为空") - // @ApiModelProperty(value = "租户编号") - // private String tenantId; - // - // /** - // * 用户 ID - // */ - // @NotBlank(message = "用户编号不能为空") - // @ApiModelProperty(value = "操作人标识") - // private String userId; - // - // /** - // * 用户姓名 - // */ - // @ApiModelProperty(value = "操作人姓名") - // @NotBlank(message = "用户姓名不能为空") - // private String userName; - } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmTransformUtil.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmTransformUtil.java index 5394ea39c..13aab40f3 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmTransformUtil.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/common/utils/BpmTransformUtil.java @@ -141,7 +141,7 @@ public class BpmTransformUtil { public static StartEvent createStartEvent(String id, String formKey) { StartEvent startEvent = new StartEvent(); startEvent.setId(id); - startEvent.setInitiator("applyUserId"); + // startEvent.setInitiator("applyUserId"); if (Objects.nonNull(formKey) && !formKey.trim().isEmpty()) { startEvent.setFormKey(formKey); } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/engine/EngineExecutionStartListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/engine/EngineExecutionStartListener.java index 8dadf4ac7..c3a6fb54f 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/engine/EngineExecutionStartListener.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/engine/EngineExecutionStartListener.java @@ -85,7 +85,7 @@ public class EngineExecutionStartListener implements ExecutionListener { execution.setVariable(variable, assigneeIdList); } // 将当次审批节点下计算出来的人存储起来,方便后续对 task 保持审批人快照 - execution.setVariable(INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + currentActivityId, + execution.setVariableLocal(INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + currentActivityId, assigners); }); } 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 4afd302e0..82598af1b 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 @@ -254,8 +254,8 @@ public class BpmnProcessInstanceServiceImpl implements BpmnProcessInstanceServic } // 创建流程实例 - // 设置流程实例的开始人,参考https://wenku.baidu.com/view/5538062e7a563c1ec5da50e2524de518964bd3f9.html - Authentication.setAuthenticatedUserId(dto.getInitiator().buildAssigneeId()); + // 设置流程实例的开始人,参考 https://wenku.baidu.com/view/5538062e7a563c1ec5da50e2524de518964bd3f9.html + // Authentication.setAuthenticatedUserId(dto.getInitiator().buildAssigneeId()); String name = StringUtils.isNotBlank(dto.getCustomProcessInstanceName()) ? dto.getCustomProcessInstanceName() : definition.getName(); diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnTaskServiceImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnTaskServiceImpl.java index 703181d39..e3f82456c 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnTaskServiceImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/service/impl/BpmnTaskServiceImpl.java @@ -298,7 +298,9 @@ public class BpmnTaskServiceImpl implements BpmnTaskService { Authentication.setAuthenticatedUserId(dto.getApprover().buildAssigneeId()); taskService.addComment(dto.getTaskId(), instance.getId(), COMMENT_TYPE_ADVICE, dto.getAdvice()); } - runtimeService.setVariable(task.getExecutionId(), INTERNAL_SPECIFY_NEXT_APPROVER, dto.getNextApprover()); + if (Objects.nonNull(dto.getNextApprover())) { + runtimeService.setVariable(task.getExecutionId(), INTERNAL_SPECIFY_NEXT_APPROVER, dto.getNextApprover()); + } // 主动设置下级审批人 // 完成任务,审批通过 // FIXME 如果 task 被重复删除会抛出异常 @@ -540,16 +542,12 @@ public class BpmnTaskServiceImpl implements BpmnTaskService { if (Objects.isNull(dto.getTargetAssigner())) { taskService.setAssignee(task.getId(), ""); - runtimeService.removeVariable(task.getProcessInstanceId(), INTERNAL_SPECIFY_NEXT_APPROVER); - runtimeService.removeVariable(task.getProcessInstanceId() + task.getId(), - INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT); + runtimeService.removeVariable(task.getProcessInstanceId(), + INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT + task.getId()); } else { - runtimeService.setVariable(task.getProcessInstanceId(), INTERNAL_SPECIFY_NEXT_APPROVER, - dto.getTargetAssigner()); runtimeService.setVariable(task.getProcessInstanceId(), INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT + task.getId(), dto.getTargetAssigner()); - taskService.setAssignee(task.getId(), dto.getTargetAssigner().buildAssigneeId()); } } diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/CustomBpmTaskTaskEventListener.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/CustomBpmTaskTaskEventListener.java index f70e7162b..ef21db591 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/CustomBpmTaskTaskEventListener.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/CustomBpmTaskTaskEventListener.java @@ -24,10 +24,6 @@ import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_TASK_RELATI @Slf4j @Component public class CustomBpmTaskTaskEventListener implements BpmTaskEventListener { - @Override - public void onCreated(DelegateTask delegateTask) { - log.info("task created..."); - } @Override public void onAssigned(DelegateTask delegateTask) { @@ -45,18 +41,8 @@ public class CustomBpmTaskTaskEventListener implements BpmTaskEventListener { log.info("task assigned..."); } - @Override - public void onCompleted(DelegateTask delegateTask) { - log.info("task completed..."); - } - - @Override - public void onDeleted(DelegateTask delegateTask) { - log.info("task deleted..."); - } - @Override public int getOrder() { - return 99; + return Integer.MIN_VALUE + 1; } } From f3c1bcfe1fe4b432b3f212883b5ab0141393150d Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Sun, 8 Oct 2023 18:18:47 +0800 Subject: [PATCH 3/3] =?UTF-8?q?update=20-=20=E8=B0=83=E6=95=B4=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E6=B5=81=E5=86=85=E9=83=A8=E7=9A=84=E4=B8=80=E4=BA=9B?= =?UTF-8?q?=E5=85=B3=E4=BA=8E=E4=BA=BA=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...istener.java => SnapshotBpmTaskTaskEventListener.java} | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) rename workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/{CustomBpmTaskTaskEventListener.java => SnapshotBpmTaskTaskEventListener.java} (80%) diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/CustomBpmTaskTaskEventListener.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/SnapshotBpmTaskTaskEventListener.java similarity index 80% rename from workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/CustomBpmTaskTaskEventListener.java rename to workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/SnapshotBpmTaskTaskEventListener.java index ef21db591..9c55123d8 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/CustomBpmTaskTaskEventListener.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/SnapshotBpmTaskTaskEventListener.java @@ -14,7 +14,7 @@ import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_TASK_RELATI import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT; /** - * 自定义实现的流程监听器, 实现了 Ordered 接口 + * 任务节点关联的处理人快照保持 *

* 注意:Order 值越小,优先级越高 * @@ -23,7 +23,7 @@ import static cn.axzo.workflow.common.constant.BpmConstants.INTERNAL_TASK_RELATI */ @Slf4j @Component -public class CustomBpmTaskTaskEventListener implements BpmTaskEventListener { +public class SnapshotBpmTaskTaskEventListener implements BpmTaskEventListener { @Override public void onAssigned(DelegateTask delegateTask) { @@ -33,12 +33,10 @@ public class CustomBpmTaskTaskEventListener implements BpmTaskEventListener { return; } // identityId_identityType - String assignee = delegateTask.getAssignee(); - assignerList.stream().filter(i -> Objects.equals(assignee, i.buildAssigneeId())).findFirst().ifPresent(i -> { + assignerList.stream().filter(i -> Objects.equals(delegateTask.getAssignee(), i.buildAssigneeId())).findFirst().ifPresent(i -> { // 保存每个 taskId 的审批人 delegateTask.setVariable(INTERNAL_TASK_RELATION_ASSIGNEE_INFO_SNAPSHOT + delegateTask.getId(), i); }); - log.info("task assigned..."); } @Override