update - 处理消息推送的事件中的变量集合

This commit is contained in:
wangli 2023-11-23 18:43:47 +08:00
parent bb776fd0f2
commit 5eb4fbd5b9
5 changed files with 101 additions and 34 deletions

View File

@ -107,4 +107,18 @@ public interface BpmnConstants {
* 全局的停用/下架等状态描述 * 全局的停用/下架等状态描述
*/ */
Integer DISABLED = 0; 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";
} }

View File

@ -11,7 +11,5 @@ public interface MetaInfoConstants {
String MODEL_TYPE = "modelType"; String MODEL_TYPE = "modelType";
String MODEL_TYPE_PROCESS = "MODEL_PROCESS"; String MODEL_TYPE_PROCESS = "MODEL_PROCESS";
String MODEL_TYPE_FORM = "MODEL_FORM"; String MODEL_TYPE_FORM = "MODEL_FORM";
String MODEL_DESCRIPTION = "modelDescription"; String MODEL_DESCRIPTION = "modelDescription";
} }

View File

@ -27,6 +27,18 @@ public class MessagePushEventImpl implements MessagePushEvent {
this.type = type; this.type = type;
} }
/**
* 使用该对象时需遵守,如果是 task 级的,一定要传 taskId, 其他参数则都是必传
* <p>
* 该对象的消费场景会对 taskId 做条件判断
*
* @param type
* @param assigner
* @param noticeConfig
* @param processInstanceId
* @param tenantId
* @param taskId
*/
public MessagePushEventImpl(FlowableEventType type, BpmnTaskDelegateAssigner assigner, public MessagePushEventImpl(FlowableEventType type, BpmnTaskDelegateAssigner assigner,
BpmnNoticeConf noticeConfig, String processInstanceId, String tenantId, String taskId) { BpmnNoticeConf noticeConfig, String processInstanceId, String tenantId, String taskId) {
this.type = type; this.type = type;

View File

@ -10,9 +10,6 @@ import lombok.extern.slf4j.Slf4j;
import org.flowable.common.engine.api.delegate.event.FlowableEngineEvent; import org.flowable.common.engine.api.delegate.event.FlowableEngineEvent;
import org.flowable.engine.delegate.event.FlowableActivityCancelledEvent; import org.flowable.engine.delegate.event.FlowableActivityCancelledEvent;
import org.flowable.engine.delegate.event.FlowableActivityEvent; 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.core.Ordered;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
@ -52,11 +49,6 @@ public class RocketMqBpmActivityEventListener implements BpmnActivityEventListen
FlowableActivityEvent flowableEvent = (FlowableActivityEvent) event; FlowableActivityEvent flowableEvent = (FlowableActivityEvent) event;
dto.setActivityId(flowableEvent.getActivityId()); dto.setActivityId(flowableEvent.getActivityId());
dto.setActivityName(flowableEvent.getActivityName()); 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)); log.info("RocketMqBpmActivityEventListener#onStarted MQ.Data: {}", JSON.toJSONString(dto));
sendMessageQueue(dto, PROCESS_ACTIVITY_STARTED); sendMessageQueue(dto, PROCESS_ACTIVITY_STARTED);
@ -77,11 +69,6 @@ public class RocketMqBpmActivityEventListener implements BpmnActivityEventListen
FlowableActivityEvent flowableEvent = (FlowableActivityEvent) event; FlowableActivityEvent flowableEvent = (FlowableActivityEvent) event;
dto.setActivityId(flowableEvent.getActivityId()); dto.setActivityId(flowableEvent.getActivityId());
dto.setActivityName(flowableEvent.getActivityName()); 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)); log.info("RocketMqBpmActivityEventListener#onCompleted MQ.Data: {}", JSON.toJSONString(dto));
sendMessageQueue(dto, PROCESS_ACTIVITY_COMPLETED); sendMessageQueue(dto, PROCESS_ACTIVITY_COMPLETED);
@ -102,11 +89,6 @@ public class RocketMqBpmActivityEventListener implements BpmnActivityEventListen
FlowableActivityCancelledEvent flowableEvent = (FlowableActivityCancelledEvent) event; FlowableActivityCancelledEvent flowableEvent = (FlowableActivityCancelledEvent) event;
dto.setActivityId(flowableEvent.getActivityId()); dto.setActivityId(flowableEvent.getActivityId());
dto.setActivityName(flowableEvent.getActivityName()); 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)); log.info("RocketMqBpmActivityEventListener#onCancelled MQ.Data: {}", JSON.toJSONString(dto));

View File

@ -4,6 +4,7 @@ import cn.axzo.framework.rocketmq.Event;
import cn.axzo.framework.rocketmq.EventProducer; import cn.axzo.framework.rocketmq.EventProducer;
import cn.axzo.workflow.common.enums.MessagePushEventEnum; 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.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.bpmn.process.BpmnProcessInstanceVO;
import cn.axzo.workflow.common.model.response.mq.MessagePushDTO; import cn.axzo.workflow.common.model.response.mq.MessagePushDTO;
import cn.axzo.workflow.core.engine.event.MessagePushEvent; 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 com.alibaba.fastjson.JSON;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j; 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.core.Ordered;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils; 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 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_NOTICE;
import static cn.axzo.workflow.common.enums.MessagePushEventEnum.PROCESS_PUSH_PENDING; import static cn.axzo.workflow.common.enums.MessagePushEventEnum.PROCESS_PUSH_PENDING;
import static cn.axzo.workflow.common.enums.MessagePushEventEnum.PROCESS_PUSH_SMS; 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 EventProducer<?> eventProducer;
private final BpmnProcessInstanceService processInstanceService; private final BpmnProcessInstanceService processInstanceService;
private final HistoryService historyService;
@Override @Override
public void onNotice(MessagePushEvent event) { public void onNotice(MessagePushEvent event) {
if (Objects.isNull(event.getNoticeConfig()) || !StringUtils.hasLength(event.getNoticeConfig().getNoticeMessageId()) || Objects.isNull(event.getAssigner())) { if (Objects.isNull(event.getNoticeConfig()) || !StringUtils.hasLength(event.getNoticeConfig().getNoticeMessageId()) || Objects.isNull(event.getAssigner())) {
return; return;
} }
BpmnProcessInstanceVO processInstanceVO = getBpmnProcessInstanceVO(event); MessagePushDTO dto = build(event.getNoticeConfig().getNoticeMessageId(), PROCESS_PUSH_NOTICE, event,
MessagePushDTO dto = build(event.getNoticeConfig().getNoticeMessageId(), PROCESS_PUSH_NOTICE, collectionVariable(event));
processInstanceVO, event);
log.info("MessagePushEventListener#onNotice MQ.Data: {}", JSON.toJSONString(dto)); log.info("MessagePushEventListener#onNotice MQ.Data: {}", JSON.toJSONString(dto));
sendMessageQueue(dto, PROCESS_PUSH_NOTICE); 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())) { if (Objects.isNull(event.getNoticeConfig()) || !StringUtils.hasLength(event.getNoticeConfig().getPendingMessageId()) || Objects.isNull(event.getAssigner())) {
return; return;
} }
BpmnProcessInstanceVO processInstanceVO = getBpmnProcessInstanceVO(event); MessagePushDTO dto = build(event.getNoticeConfig().getNoticeMessageId(), PROCESS_PUSH_PENDING, event,
MessagePushDTO dto = build(event.getNoticeConfig().getNoticeMessageId(), PROCESS_PUSH_PENDING, collectionVariable(event));
processInstanceVO, event);
log.info("MessagePushEventListener#onPending MQ.Data: {}", JSON.toJSONString(dto)); log.info("MessagePushEventListener#onPending MQ.Data: {}", JSON.toJSONString(dto));
sendMessageQueue(dto, PROCESS_PUSH_PENDING); 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())) { if (Objects.isNull(event.getNoticeConfig()) || !StringUtils.hasLength(event.getNoticeConfig().getSmsId()) || Objects.isNull(event.getAssigner())) {
return; return;
} }
BpmnProcessInstanceVO processInstanceVO = getBpmnProcessInstanceVO(event); MessagePushDTO dto = build(event.getNoticeConfig().getNoticeMessageId(), PROCESS_PUSH_SMS, event,
MessagePushDTO dto = build(event.getNoticeConfig().getNoticeMessageId(), PROCESS_PUSH_SMS, collectionVariable(event));
processInstanceVO, event);
log.info("MessagePushEventListener#onSms MQ.Data: {}", JSON.toJSONString(dto)); log.info("MessagePushEventListener#onSms MQ.Data: {}", JSON.toJSONString(dto));
sendMessageQueue(dto, PROCESS_PUSH_SMS); sendMessageQueue(dto, PROCESS_PUSH_SMS);
} }
private Map<String, Object> collectionVariable(MessagePushEvent event) {
Map<String, Object> variables = new HashMap<>();
BpmnProcessInstanceVO processInstance = getBpmnProcessInstanceVO(event);
Map<String, Object> 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<HistoricTaskInstance> tasks =
historyService.createHistoricTaskInstanceQuery().taskId(event.getTaskId()).list();
if (CollectionUtils.isEmpty(tasks)) {
return variables;
}
// 应该只有 1 , 但是为了防止有多个, 这里只取第一个
List<BpmnTaskDelegateAssigner> assigners =
(List<BpmnTaskDelegateAssigner>) 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) { private BpmnProcessInstanceVO getBpmnProcessInstanceVO(MessagePushEvent event) {
BpmnProcessInstanceQueryDTO queryDTO = new BpmnProcessInstanceQueryDTO(); BpmnProcessInstanceQueryDTO queryDTO = new BpmnProcessInstanceQueryDTO();
queryDTO.setProcessInstanceId(event.getProcessInstanceId()); queryDTO.setProcessInstanceId(event.getProcessInstanceId());
queryDTO.setTenantId(event.getTenantId()); queryDTO.setTenantId(event.getTenantId());
queryDTO.setHasVariable(true); queryDTO.setHasVariable(true);
BpmnProcessInstanceVO processInstanceVO = processInstanceService.getProcessInstanceVO(queryDTO); return processInstanceService.getProcessInstanceVO(queryDTO);
return processInstanceVO;
} }
public MessagePushDTO build(String templateId, MessagePushEventEnum type, BpmnProcessInstanceVO instance, public MessagePushDTO build(String templateId, MessagePushEventEnum type, MessagePushEvent event, Map<String,
MessagePushEvent event) { Object> variables) {
return new MessagePushDTO() return new MessagePushDTO()
.setId(event.getProcessInstanceId())
.setType(type) .setType(type)
.setTemplateId(templateId) .setTemplateId(templateId)
.setReceivePerson(event.getAssigner()); .setReceivePerson(event.getAssigner())
.setVariables(variables);
} }
public void sendMessageQueue(MessagePushDTO dto, MessagePushEventEnum eventEnum) { public void sendMessageQueue(MessagePushDTO dto, MessagePushEventEnum eventEnum) {