From f6e19d7c24d27d096880ba6f18ee442504c9dadc Mon Sep 17 00:00:00 2001 From: dengqichen Date: Fri, 27 Dec 2024 18:54:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A4=A7=E5=A3=B0=E9=81=93=E6=92=92=E6=97=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../delegate/ApprovalNodeDelegate.java | 85 +++++++++++++++++++ .../ApprovalNodeFormVariables.java | 29 +++++++ .../ApprovalNodeLocalVariables.java | 31 +++++++ .../ApprovalNodePanelVariables.java | 41 +++++++++ .../backend/workflow/enums/NodeTypeEnums.java | 20 ++++- 5 files changed, 203 insertions(+), 3 deletions(-) create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/ApprovalNodeDelegate.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/fromVariables/ApprovalNodeFormVariables.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/localVariables/ApprovalNodeLocalVariables.java create mode 100644 backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/panelVariables/ApprovalNodePanelVariables.java diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/ApprovalNodeDelegate.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/ApprovalNodeDelegate.java new file mode 100644 index 00000000..629cb89c --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/delegate/ApprovalNodeDelegate.java @@ -0,0 +1,85 @@ +package com.qqchen.deploy.backend.workflow.delegate; + +import com.qqchen.deploy.backend.workflow.constants.WorkFlowConstants; +import com.qqchen.deploy.backend.workflow.dto.definition.node.localVariables.ApprovalNodeLocalVariables; +import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.ApprovalNodePanelVariables; +import jakarta.annotation.Resource; +import lombok.extern.slf4j.Slf4j; +import org.flowable.engine.TaskService; +import org.flowable.engine.delegate.BpmnError; +import org.flowable.engine.delegate.DelegateExecution; +import org.flowable.task.api.Task; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; +import java.util.Date; + +/** + * 审批节点的委派者实现 + */ +@Slf4j +@Component +public class ApprovalNodeDelegate extends BaseNodeDelegate { + + @Resource + private TaskService taskService; + + @Override + protected Class getPanelVariablesClass() { + return ApprovalNodePanelVariables.class; + } + + @Override + protected Class getLocalVariablesClass() { + return ApprovalNodeLocalVariables.class; + } + + @Override + protected void executeInternal(DelegateExecution execution, ApprovalNodePanelVariables panelVariables, ApprovalNodeLocalVariables localVariables) { + if (panelVariables == null) { + throw new BpmnError(WorkFlowConstants.WORKFLOW_EXEC_ERROR, "Panel variables are required but not provided"); + } + + try { + // 创建用户任务 + Task task = taskService.createTaskQuery() + .processInstanceId(execution.getProcessInstanceId()) + .taskDefinitionKey(execution.getCurrentActivityId()) + .singleResult(); + + if (task == null) { + throw new BpmnError(WorkFlowConstants.WORKFLOW_EXEC_ERROR, "Failed to create approval task"); + } + + // 设置任务属性 + task.setName(panelVariables.getName()); + task.setDescription(panelVariables.getDescription()); + + // 设置审批人 + if (panelVariables.getAssignee() != null) { + task.setAssignee(panelVariables.getAssignee()); + } + + // 设置候选组 + if (panelVariables.getCandidateGroup() != null) { + taskService.addCandidateGroup(task.getId(), panelVariables.getCandidateGroup()); + } + + // 设置超时时间 + if (panelVariables.getTimeoutHours() != null) { + Date dueDate = java.sql.Timestamp.valueOf(LocalDateTime.now().plusHours(panelVariables.getTimeoutHours())); + task.setDueDate(dueDate); + } + + // 更新任务 + taskService.saveTask(task); + + log.info("Created approval task: {}, assignee: {}, candidateGroup: {}", + task.getId(), panelVariables.getAssignee(), panelVariables.getCandidateGroup()); + + } catch (Exception e) { + log.error("Failed to create approval task", e); + throw new BpmnError(WorkFlowConstants.WORKFLOW_EXEC_ERROR, "Failed to create approval task: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/fromVariables/ApprovalNodeFormVariables.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/fromVariables/ApprovalNodeFormVariables.java new file mode 100644 index 00000000..35c7d83b --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/fromVariables/ApprovalNodeFormVariables.java @@ -0,0 +1,29 @@ +package com.qqchen.deploy.backend.workflow.dto.definition.node.fromVariables; + +import com.qqchen.deploy.backend.workflow.annotation.SchemaProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 审批节点表单变量 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ApprovalNodeFormVariables extends BaseNodeFormVariables { + + @SchemaProperty( + title = "审批意见", + description = "请填写审批意见", + required = true + ) + private String comment; + + @SchemaProperty( + title = "审批结果", + description = "请选择审批结果", + required = true, + enumValues = {"APPROVED", "REJECTED"}, + enumNames = {"同意", "拒绝"} + ) + private String approvalResult; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/localVariables/ApprovalNodeLocalVariables.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/localVariables/ApprovalNodeLocalVariables.java new file mode 100644 index 00000000..df2b59aa --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/localVariables/ApprovalNodeLocalVariables.java @@ -0,0 +1,31 @@ +package com.qqchen.deploy.backend.workflow.dto.definition.node.localVariables; + +import com.qqchen.deploy.backend.workflow.annotation.SchemaProperty; +import lombok.Data; + +/** + * 审批节点运行时变量 + */ +@Data +public class ApprovalNodeLocalVariables { + + @SchemaProperty( + title = "审批意见", + description = "审批人填写的意见" + ) + private String comment; + + @SchemaProperty( + title = "审批结果", + description = "审批结果", + enumValues = {"APPROVED", "REJECTED"}, + enumNames = {"同意", "拒绝"} + ) + private String approvalResult; + + @SchemaProperty( + title = "审批时间", + description = "审批完成时间" + ) + private String approvalTime; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/panelVariables/ApprovalNodePanelVariables.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/panelVariables/ApprovalNodePanelVariables.java new file mode 100644 index 00000000..c0a30378 --- /dev/null +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/dto/definition/node/panelVariables/ApprovalNodePanelVariables.java @@ -0,0 +1,41 @@ +package com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables; + +import com.qqchen.deploy.backend.workflow.annotation.SchemaProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 审批节点配置 + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class ApprovalNodePanelVariables extends BaseNodePanelVariables { + + @SchemaProperty( + title = "审批人", + description = "审批人用户ID", + required = true + ) + private String assignee; + + @SchemaProperty( + title = "审批组", + description = "审批组ID" + ) + private String candidateGroup; + + @SchemaProperty( + title = "超时时间(小时)", + description = "审批超时时间,单位小时", + required = true, + defaultValue = "24" + ) + private Integer timeoutHours; + + @SchemaProperty( + title = "是否需要会签", + description = "是否需要所有审批人同意", + defaultValue = "false" + ) + private Boolean needAllApprove; +} \ No newline at end of file diff --git a/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeTypeEnums.java b/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeTypeEnums.java index 3c5d8d45..44cd6782 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeTypeEnums.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/workflow/enums/NodeTypeEnums.java @@ -3,20 +3,23 @@ package com.qqchen.deploy.backend.workflow.enums; import com.fasterxml.jackson.annotation.JsonValue; import com.qqchen.deploy.backend.workflow.dto.definition.node.fromVariables.DeployNodeFormVariables; import com.qqchen.deploy.backend.workflow.dto.definition.node.fromVariables.ScriptNodeFormVariables; +import com.qqchen.deploy.backend.workflow.dto.definition.node.fromVariables.ApprovalNodeFormVariables; import com.qqchen.deploy.backend.workflow.dto.definition.node.localVariables.DeployNodeLocalVariables; import com.qqchen.deploy.backend.workflow.dto.definition.node.localVariables.NotificationNodeLocalVariables; import com.qqchen.deploy.backend.workflow.dto.definition.node.localVariables.ScriptNodeLocalVariables; +import com.qqchen.deploy.backend.workflow.dto.definition.node.localVariables.ApprovalNodeLocalVariables; import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.DeployNodePanelVariables; import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.EndNodePanelVariables; import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.GatewayNodePanelVariables; import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.NotificationNodePanelVariables; import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.ScriptNodePanelVariables; import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.StartNodePanelVariables; +import com.qqchen.deploy.backend.workflow.dto.definition.node.panelVariables.ApprovalNodePanelVariables; import com.qqchen.deploy.backend.workflow.dto.definition.node.uiVariables.NodeUiVariables; import lombok.Getter; /** - * 工作��节点类型枚举 + * 工作节点类型枚举 * 定义了工作流中所有可用的节点类型及其UI配置 */ @Getter @@ -102,6 +105,17 @@ public enum NodeTypeEnums { BpmnNodeTypeEnums.SERVICE_TASK, NodeCategoryEnums.TASK, "通知节点" + ), + APPROVAL_NODE( + "APPROVAL_NODE", + "审批节点", + ApprovalNodeLocalVariables.class, + ApprovalNodePanelVariables.class, + ApprovalNodeFormVariables.class, + NodeUiVariables.class, + BpmnNodeTypeEnums.USER_TASK, + NodeCategoryEnums.TASK, + "审批任务" ); // // /** @@ -146,7 +160,7 @@ public enum NodeTypeEnums { // * 脚本任务节点 // * 执行自定义脚本的任务节点 // * 特点: -// * - 支持多种脚本语言(如Shell、Python等) +// * - 支持多种脚本语言(如Shell、Python等��� // * - 可以执行自定义业务逻辑 // * - 适合复杂的数据处理和计算 // */ @@ -191,7 +205,7 @@ public enum NodeTypeEnums { // PARALLEL_GATEWAY( // "PARALLEL_GATEWAY", // "并行网关", -// "并行分支控制", +// "��行分支控制", // new WorkflowNodeGraph() // .setShape("diamond") // .setSize(50, 50)