From 5eb4fbd5b998ac87b2a174d1a14c3fe9b7ec4655 Mon Sep 17 00:00:00 2001 From: wangli <274027703@qq.com> Date: Thu, 23 Nov 2023 18:43:47 +0800 Subject: [PATCH] =?UTF-8?q?update=20-=20=E5=A4=84=E7=90=86=E6=B6=88?= =?UTF-8?q?=E6=81=AF=E6=8E=A8=E9=80=81=E7=9A=84=E4=BA=8B=E4=BB=B6=E4=B8=AD?= =?UTF-8?q?=E7=9A=84=E5=8F=98=E9=87=8F=E9=9B=86=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/BpmnConstants.java | 14 +++ .../common/constant/MetaInfoConstants.java | 2 - .../engine/event/MessagePushEventImpl.java | 12 +++ .../RocketMqBpmActivityEventListener.java | 18 ---- .../notice/MessagePushEventListener.java | 89 ++++++++++++++++--- 5 files changed, 101 insertions(+), 34 deletions(-) diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/BpmnConstants.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/BpmnConstants.java index 062dc507b..5f60e0a68 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/BpmnConstants.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/BpmnConstants.java @@ -107,4 +107,18 @@ public interface BpmnConstants { * 全局的停用/下架等状态描述 */ Integer DISABLED = 0; + + //=============== 消息推送时的变量集合中 key 的命名 ================= + String VAR_INITIATOR_USER_NAME = "initiatorUserName"; + String VAR_PROCESS_INSTANCE_NAME = "processInstanceName"; + String VAR_PROCESS_INSTANCE_ID = "processInstanceId"; + String VAR_PROCESS_START_TIME = "processStartTime"; + String VAR_PROCESS_END_TIME = "processEndTime"; + String VAR_BUSINESS_NAME = "businessName"; + + String VAR_TASK_USER_NAME = "taskUserName"; + String VAR_ACTIVITY_NAME = "activityName"; + String VAR_TASK_START_TIME = "taskStartTime"; + String VAR_PROCESS_RESULT = "processResult"; + String VAR_OPERATOR_TYPE = "operatorType"; } diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/MetaInfoConstants.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/MetaInfoConstants.java index c46891342..7d5706069 100644 --- a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/MetaInfoConstants.java +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/constant/MetaInfoConstants.java @@ -11,7 +11,5 @@ public interface MetaInfoConstants { String MODEL_TYPE = "modelType"; String MODEL_TYPE_PROCESS = "MODEL_PROCESS"; String MODEL_TYPE_FORM = "MODEL_FORM"; - - String MODEL_DESCRIPTION = "modelDescription"; } diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/event/MessagePushEventImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/event/MessagePushEventImpl.java index e892eacb8..d81342a04 100644 --- a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/event/MessagePushEventImpl.java +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/event/MessagePushEventImpl.java @@ -27,6 +27,18 @@ public class MessagePushEventImpl implements MessagePushEvent { this.type = type; } + /** + * 使用该对象时需遵守,如果是 task 级的,一定要传 taskId, 其他参数则都是必传 + *

+ * 该对象的消费场景会对 taskId 做条件判断 + * + * @param type + * @param assigner + * @param noticeConfig + * @param processInstanceId + * @param tenantId + * @param taskId + */ public MessagePushEventImpl(FlowableEventType type, BpmnTaskDelegateAssigner assigner, BpmnNoticeConf noticeConfig, String processInstanceId, String tenantId, String taskId) { this.type = type; diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/activity/RocketMqBpmActivityEventListener.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/activity/RocketMqBpmActivityEventListener.java index 53ebe574d..96b5fb3f4 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/activity/RocketMqBpmActivityEventListener.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/activity/RocketMqBpmActivityEventListener.java @@ -10,9 +10,6 @@ import lombok.extern.slf4j.Slf4j; import org.flowable.common.engine.api.delegate.event.FlowableEngineEvent; import org.flowable.engine.delegate.event.FlowableActivityCancelledEvent; import org.flowable.engine.delegate.event.FlowableActivityEvent; -import org.flowable.engine.delegate.event.FlowableMultiInstanceActivityCancelledEvent; -import org.flowable.engine.delegate.event.FlowableMultiInstanceActivityCompletedEvent; -import org.flowable.engine.delegate.event.FlowableMultiInstanceActivityEvent; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; @@ -52,11 +49,6 @@ public class RocketMqBpmActivityEventListener implements BpmnActivityEventListen FlowableActivityEvent flowableEvent = (FlowableActivityEvent) event; dto.setActivityId(flowableEvent.getActivityId()); dto.setActivityName(flowableEvent.getActivityName()); - - } else if (event instanceof FlowableMultiInstanceActivityEvent) { - FlowableMultiInstanceActivityEvent flowableEvent = (FlowableMultiInstanceActivityEvent) event; - dto.setActivityId(flowableEvent.getActivityId()); - dto.setActivityName(flowableEvent.getActivityName()); } log.info("RocketMqBpmActivityEventListener#onStarted MQ.Data: {}", JSON.toJSONString(dto)); sendMessageQueue(dto, PROCESS_ACTIVITY_STARTED); @@ -77,11 +69,6 @@ public class RocketMqBpmActivityEventListener implements BpmnActivityEventListen FlowableActivityEvent flowableEvent = (FlowableActivityEvent) event; dto.setActivityId(flowableEvent.getActivityId()); dto.setActivityName(flowableEvent.getActivityName()); - } else if (event instanceof FlowableMultiInstanceActivityCompletedEvent) { - FlowableMultiInstanceActivityCompletedEvent flowableEvent = - (FlowableMultiInstanceActivityCompletedEvent) event; - dto.setActivityId(flowableEvent.getActivityId()); - dto.setActivityName(flowableEvent.getActivityName()); } log.info("RocketMqBpmActivityEventListener#onCompleted MQ.Data: {}", JSON.toJSONString(dto)); sendMessageQueue(dto, PROCESS_ACTIVITY_COMPLETED); @@ -102,11 +89,6 @@ public class RocketMqBpmActivityEventListener implements BpmnActivityEventListen FlowableActivityCancelledEvent flowableEvent = (FlowableActivityCancelledEvent) event; dto.setActivityId(flowableEvent.getActivityId()); dto.setActivityName(flowableEvent.getActivityName()); - } else if (event instanceof FlowableMultiInstanceActivityCancelledEvent) { - FlowableMultiInstanceActivityCancelledEvent flowableEvent = - (FlowableMultiInstanceActivityCancelledEvent) event; - dto.setActivityId(flowableEvent.getActivityId()); - dto.setActivityName(flowableEvent.getActivityName()); } log.info("RocketMqBpmActivityEventListener#onCancelled MQ.Data: {}", JSON.toJSONString(dto)); diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/notice/MessagePushEventListener.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/notice/MessagePushEventListener.java index 130298a9d..08b1d3618 100644 --- a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/notice/MessagePushEventListener.java +++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/notice/MessagePushEventListener.java @@ -4,6 +4,7 @@ import cn.axzo.framework.rocketmq.Event; import cn.axzo.framework.rocketmq.EventProducer; import cn.axzo.workflow.common.enums.MessagePushEventEnum; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceQueryDTO; +import cn.axzo.workflow.common.model.request.bpmn.task.BpmnTaskDelegateAssigner; import cn.axzo.workflow.common.model.response.bpmn.process.BpmnProcessInstanceVO; import cn.axzo.workflow.common.model.response.mq.MessagePushDTO; import cn.axzo.workflow.core.engine.event.MessagePushEvent; @@ -12,12 +13,33 @@ import cn.axzo.workflow.core.service.BpmnProcessInstanceService; import com.alibaba.fastjson.JSON; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.HistoryService; +import org.flowable.task.api.history.HistoricTaskInstance; import org.springframework.core.Ordered; import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; +import java.text.SimpleDateFormat; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.Objects; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_INITIATOR; +import static cn.axzo.workflow.common.constant.BpmnConstants.INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT; +import static cn.axzo.workflow.common.constant.BpmnConstants.VAR_ACTIVITY_NAME; +import static cn.axzo.workflow.common.constant.BpmnConstants.VAR_BUSINESS_NAME; +import static cn.axzo.workflow.common.constant.BpmnConstants.VAR_INITIATOR_USER_NAME; +import static cn.axzo.workflow.common.constant.BpmnConstants.VAR_OPERATOR_TYPE; +import static cn.axzo.workflow.common.constant.BpmnConstants.VAR_PROCESS_END_TIME; +import static cn.axzo.workflow.common.constant.BpmnConstants.VAR_PROCESS_INSTANCE_ID; +import static cn.axzo.workflow.common.constant.BpmnConstants.VAR_PROCESS_INSTANCE_NAME; +import static cn.axzo.workflow.common.constant.BpmnConstants.VAR_PROCESS_RESULT; +import static cn.axzo.workflow.common.constant.BpmnConstants.VAR_PROCESS_START_TIME; +import static cn.axzo.workflow.common.constant.BpmnConstants.VAR_TASK_START_TIME; +import static cn.axzo.workflow.common.constant.BpmnConstants.VAR_TASK_USER_NAME; import static cn.axzo.workflow.common.enums.MessagePushEventEnum.PROCESS_PUSH_NOTICE; import static cn.axzo.workflow.common.enums.MessagePushEventEnum.PROCESS_PUSH_PENDING; import static cn.axzo.workflow.common.enums.MessagePushEventEnum.PROCESS_PUSH_SMS; @@ -35,15 +57,15 @@ public class MessagePushEventListener implements BpmnMessagePushEventListener, O private final EventProducer eventProducer; private final BpmnProcessInstanceService processInstanceService; + private final HistoryService historyService; @Override public void onNotice(MessagePushEvent event) { if (Objects.isNull(event.getNoticeConfig()) || !StringUtils.hasLength(event.getNoticeConfig().getNoticeMessageId()) || Objects.isNull(event.getAssigner())) { return; } - BpmnProcessInstanceVO processInstanceVO = getBpmnProcessInstanceVO(event); - MessagePushDTO dto = build(event.getNoticeConfig().getNoticeMessageId(), PROCESS_PUSH_NOTICE, - processInstanceVO, event); + MessagePushDTO dto = build(event.getNoticeConfig().getNoticeMessageId(), PROCESS_PUSH_NOTICE, event, + collectionVariable(event)); log.info("MessagePushEventListener#onNotice MQ.Data: {}", JSON.toJSONString(dto)); sendMessageQueue(dto, PROCESS_PUSH_NOTICE); } @@ -54,9 +76,8 @@ public class MessagePushEventListener implements BpmnMessagePushEventListener, O if (Objects.isNull(event.getNoticeConfig()) || !StringUtils.hasLength(event.getNoticeConfig().getPendingMessageId()) || Objects.isNull(event.getAssigner())) { return; } - BpmnProcessInstanceVO processInstanceVO = getBpmnProcessInstanceVO(event); - MessagePushDTO dto = build(event.getNoticeConfig().getNoticeMessageId(), PROCESS_PUSH_PENDING, - processInstanceVO, event); + MessagePushDTO dto = build(event.getNoticeConfig().getNoticeMessageId(), PROCESS_PUSH_PENDING, event, + collectionVariable(event)); log.info("MessagePushEventListener#onPending MQ.Data: {}", JSON.toJSONString(dto)); sendMessageQueue(dto, PROCESS_PUSH_PENDING); } @@ -66,28 +87,68 @@ public class MessagePushEventListener implements BpmnMessagePushEventListener, O if (Objects.isNull(event.getNoticeConfig()) || !StringUtils.hasLength(event.getNoticeConfig().getSmsId()) || Objects.isNull(event.getAssigner())) { return; } - BpmnProcessInstanceVO processInstanceVO = getBpmnProcessInstanceVO(event); - MessagePushDTO dto = build(event.getNoticeConfig().getNoticeMessageId(), PROCESS_PUSH_SMS, - processInstanceVO, event); + MessagePushDTO dto = build(event.getNoticeConfig().getNoticeMessageId(), PROCESS_PUSH_SMS, event, + collectionVariable(event)); log.info("MessagePushEventListener#onSms MQ.Data: {}", JSON.toJSONString(dto)); sendMessageQueue(dto, PROCESS_PUSH_SMS); } + private Map collectionVariable(MessagePushEvent event) { + Map variables = new HashMap<>(); + + BpmnProcessInstanceVO processInstance = getBpmnProcessInstanceVO(event); + Map originVariables = processInstance.getVariables(); + BpmnTaskDelegateAssigner initiator = (BpmnTaskDelegateAssigner) originVariables.getOrDefault(INTERNAL_INITIATOR, + new BpmnTaskDelegateAssigner()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + variables.put(VAR_INITIATOR_USER_NAME, initiator.getAssignerName()); + variables.put(VAR_PROCESS_INSTANCE_NAME, processInstance.getName()); + variables.put(VAR_PROCESS_INSTANCE_ID, processInstance.getId()); + variables.put(VAR_PROCESS_START_TIME, sdf.format(processInstance.getCreateAt())); + variables.put(VAR_PROCESS_END_TIME, sdf.format(processInstance.getEndTime())); + variables.put(VAR_PROCESS_RESULT, processInstance.getResult().getDesc()); + // 业务名称 + variables.put(VAR_BUSINESS_NAME, ""); + + if (!StringUtils.hasLength(event.getTaskId())) { + return variables; + } + List tasks = + historyService.createHistoricTaskInstanceQuery().taskId(event.getTaskId()).list(); + if (CollectionUtils.isEmpty(tasks)) { + return variables; + } + // 应该只有 1 个, 但是为了防止有多个, 这里只取第一个 + List assigners = + (List) originVariables.getOrDefault(INTERNAL_TASK_RELATION_ASSIGNEE_LIST_INFO_SNAPSHOT + tasks.get(0).getTaskDefinitionKey(), Collections.emptyList()); + assigners.stream().filter(i -> Objects.equals(i.buildAssigneeId(), tasks.get(0).getAssignee())).findAny() + .ifPresent(i -> { + variables.put(VAR_TASK_USER_NAME, i.getAssignerName()); + }); + variables.put(VAR_ACTIVITY_NAME, tasks.get(0).getName()); + variables.put(VAR_TASK_START_TIME, sdf.format(tasks.get(0).getCreateTime())); + // TODO 操作类型 同意、驳回、加签、评论、转交等 + variables.put(VAR_OPERATOR_TYPE, ""); + return variables; + } + private BpmnProcessInstanceVO getBpmnProcessInstanceVO(MessagePushEvent event) { BpmnProcessInstanceQueryDTO queryDTO = new BpmnProcessInstanceQueryDTO(); queryDTO.setProcessInstanceId(event.getProcessInstanceId()); queryDTO.setTenantId(event.getTenantId()); queryDTO.setHasVariable(true); - BpmnProcessInstanceVO processInstanceVO = processInstanceService.getProcessInstanceVO(queryDTO); - return processInstanceVO; + return processInstanceService.getProcessInstanceVO(queryDTO); } - public MessagePushDTO build(String templateId, MessagePushEventEnum type, BpmnProcessInstanceVO instance, - MessagePushEvent event) { + public MessagePushDTO build(String templateId, MessagePushEventEnum type, MessagePushEvent event, Map variables) { return new MessagePushDTO() + .setId(event.getProcessInstanceId()) .setType(type) .setTemplateId(templateId) - .setReceivePerson(event.getAssigner()); + .setReceivePerson(event.getAssigner()) + .setVariables(variables); + } public void sendMessageQueue(MessagePushDTO dto, MessagePushEventEnum eventEnum) {