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/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-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..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 @@ -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; @@ -140,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); } @@ -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
- * 注意:Order 值越小,优先级越高
- *
- * @author wangli
- * @since 2023/9/25 18:50
- */
-@Slf4j
-//@Component
-public class CustomBpmTaskTaskEventListener implements BpmTaskEventListener {
- @Override
- public void onCreated(DelegateTask delegateTask) {
- log.info("task created...");
- }
-
- @Override
- public void onAssigned(DelegateTask delegateTask) {
- 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;
- }
-}
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());
diff --git a/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/SnapshotBpmTaskTaskEventListener.java b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/SnapshotBpmTaskTaskEventListener.java
new file mode 100644
index 000000000..9c55123d8
--- /dev/null
+++ b/workflow-engine-server/src/main/java/cn/axzo/workflow/server/controller/listener/SnapshotBpmTaskTaskEventListener.java
@@ -0,0 +1,46 @@
+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;
+
+/**
+ * 任务节点关联的处理人快照保持
+ *
+ * 注意:Order 值越小,优先级越高
+ *
+ * @author wangli
+ * @since 2023/9/25 18:50
+ */
+@Slf4j
+@Component
+public class SnapshotBpmTaskTaskEventListener implements BpmTaskEventListener {
+
+ @Override
+ public void onAssigned(DelegateTask delegateTask) {
+ List