diff --git a/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnActivitySetAssigneeDTO.java b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnActivitySetAssigneeDTO.java new file mode 100644 index 000000000..a8e0a48d1 --- /dev/null +++ b/workflow-engine-common/src/main/java/cn/axzo/workflow/common/model/request/bpmn/task/BpmnActivitySetAssigneeDTO.java @@ -0,0 +1,48 @@ +package cn.axzo.workflow.common.model.request.bpmn.task; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; +import java.util.List; + +/** + * 业务节点设置审批人 + * + * @author wangli + * @since 2023/12/21 13:57 + */ +@ApiModel("业务节点设置审批人") +@Data +public class BpmnActivitySetAssigneeDTO { + /** + * PROCESS_ACTIVITY_WAIT_ASSIGNEE 事件中的触发 ID + */ + @ApiModelProperty(value = "等待业务推送审批的事件中的触发 ID", notes = "参考 PROCESS_ACTIVITY_WAIT_ASSIGNEE 事件") + @NotBlank(message = "节点的触发 ID 不能为空") + private String triggerId; + + /** + * 指定的活动节点 ID + */ + @ApiModelProperty(value = "指定的活动节点 ID", notes = "流程定义中节点的 ID") + private String activityId; + + /** + * 实例 ID + */ + @ApiModelProperty(value = "实例 ID") + private String processInstanceId; + + /** + * 需要设置的审批人, 业务侧自行去重 + */ + @ApiModelProperty(value = "审批人集合信息", notes = "业务传参时,需要注意去重") + @Valid + @NotEmpty(message = "审批人不能为空") + private List assigners; + +} diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/event/BizSpecifyAssigneeEventImpl.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/event/BizSpecifyAssigneeEventImpl.java new file mode 100644 index 000000000..ad082e065 --- /dev/null +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/event/BizSpecifyAssigneeEventImpl.java @@ -0,0 +1,64 @@ +package cn.axzo.workflow.core.engine.event; + +import org.flowable.common.engine.api.delegate.event.FlowableEventType; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.impl.persistence.entity.ExecutionEntityImpl; + +import java.util.Map; + +/** + * 业务节点通知业务传递审批人的事件 + * + * @author wangli + * @since 2023/12/21 11:36 + */ +public class BizSpecifyAssigneeEventImpl implements BizSpecifyAssigneeEvent { + + private final BizSpecifyAssigneeEventType type; + private final String activityId; + private final String activityName; + private final String processInstanceId; + private final String processDefinitionId; + private final String executionId; + private final Map variables; + + public BizSpecifyAssigneeEventImpl(BizSpecifyAssigneeEventType bizSpecifyAssigneeEventType, + DelegateExecution execution) { + this.type = bizSpecifyAssigneeEventType; + this.activityId = execution.getCurrentActivityId(); + this.activityName = ((ExecutionEntityImpl) execution).getCurrentActivityName(); + this.processInstanceId = execution.getProcessInstanceId(); + this.processDefinitionId = execution.getProcessDefinitionId(); + this.executionId = execution.getId(); + this.variables = execution.getVariables(); + } + + @Override + public FlowableEventType getType() { + return type; + } + + public String getActivityId() { + return activityId; + } + + public String getActivityName() { + return activityName; + } + + public String getProcessInstanceId() { + return processInstanceId; + } + + public String getProcessDefinitionId() { + return processDefinitionId; + } + + public String getExecutionId() { + return executionId; + } + + public Map getVariables() { + return variables; + } +} diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineActivityExtEventListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineActivityExtEventListener.java new file mode 100644 index 000000000..2357be0a2 --- /dev/null +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineActivityExtEventListener.java @@ -0,0 +1,76 @@ +package cn.axzo.workflow.core.engine.listener; + +import cn.axzo.framework.jackson.utility.JSON; +import cn.axzo.workflow.core.engine.event.BizSpecifyAssigneeEvent; +import cn.axzo.workflow.core.engine.event.BizSpecifyAssigneeEventType; +import cn.axzo.workflow.core.listener.BpmnActivityEventListener; +import com.google.common.collect.ImmutableSet; +import lombok.extern.slf4j.Slf4j; +import org.flowable.common.engine.api.delegate.event.AbstractFlowableEventListener; +import org.flowable.common.engine.api.delegate.event.FlowableEvent; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import static cn.axzo.workflow.core.engine.event.BizSpecifyAssigneeEventType.ADD_ASSIGNEE; +import static cn.axzo.workflow.core.engine.event.BizSpecifyAssigneeEventType.REMOVE_ASSIGNEE; +import static cn.axzo.workflow.core.engine.event.BizSpecifyAssigneeEventType.UPDATE_ASSIGNEE; + +/** + * Activity 节点的扩展事件, 用于处理业务节点通知业务添加审批人 + * + * @author wangli + * @since 2023/12/21 11:25 + */ +@Slf4j +@Component +public class EngineActivityExtEventListener extends AbstractFlowableEventListener { + + @Resource + ObjectProvider> activityListeners; + + public static final Set BIZ_SPECIFY_ASSIGNEE_EVENTS = + ImmutableSet.builder() + .add(ADD_ASSIGNEE) + .add(UPDATE_ASSIGNEE) + .add(REMOVE_ASSIGNEE) + .build(); + + @Override + public void onEvent(FlowableEvent flowableEvent) { + if (flowableEvent instanceof BizSpecifyAssigneeEvent) { + BizSpecifyAssigneeEvent event = (BizSpecifyAssigneeEvent) flowableEvent; + BizSpecifyAssigneeEventType type = (BizSpecifyAssigneeEventType) event.getType(); + if (BIZ_SPECIFY_ASSIGNEE_EVENTS.contains(type)) { + switch (type) { + case ADD_ASSIGNEE: + getOrderedListeners().forEach(i -> i.onWaitAssignee(event)); + break; + case UPDATE_ASSIGNEE: + break; + case REMOVE_ASSIGNEE: + break; + default: + } + } + } + } + + private List getOrderedListeners() { + List orderListeners = new ArrayList<>(); + activityListeners.ifAvailable(orderListeners::addAll); + if (log.isDebugEnabled()) { + log.debug("Order Lists: {}", JSON.toJSONString(orderListeners)); + } + return orderListeners; + } + + @Override + public boolean isFailOnException() { + return true; + } +} diff --git a/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineActivityTakeEventListener.java b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineActivityTakeEventListener.java new file mode 100644 index 000000000..87764ec17 --- /dev/null +++ b/workflow-engine-core/src/main/java/cn/axzo/workflow/core/engine/listener/EngineActivityTakeEventListener.java @@ -0,0 +1,42 @@ +package cn.axzo.workflow.core.engine.listener; + +import cn.axzo.framework.jackson.utility.JSON; +import cn.axzo.workflow.core.listener.BpmnActivityEventListener; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.engine.delegate.ExecutionListener; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * 活动节点开始事件监听器 + * + * @author wangli + * @since 2023/12/21 16:55 + */ +@Component +@Slf4j +public class EngineActivityTakeEventListener implements ExecutionListener { + + @Resource + ObjectProvider> activityListeners; + + @Override + public void notify(DelegateExecution execution) { + log.info("EngineActivityTakeEventListener Event: {}", execution.getEventName()); + getOrderedListeners().forEach(i -> i.onTake(execution)); + } + + private List getOrderedListeners() { + List orderListeners = new ArrayList<>(); + activityListeners.ifAvailable(orderListeners::addAll); + if (log.isDebugEnabled()) { + log.debug("Order Lists: {}", JSON.toJSONString(orderListeners)); + } + return orderListeners; + } +}