大声道撒旦

This commit is contained in:
dengqichen 2024-12-27 18:54:40 +08:00
parent 7652a9ad27
commit f6e19d7c24
5 changed files with 203 additions and 3 deletions

View File

@ -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<ApprovalNodePanelVariables, ApprovalNodeLocalVariables> {
@Resource
private TaskService taskService;
@Override
protected Class<ApprovalNodePanelVariables> getPanelVariablesClass() {
return ApprovalNodePanelVariables.class;
}
@Override
protected Class<ApprovalNodeLocalVariables> 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());
}
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
/**
* 工作<EFBFBD><EFBFBD>节点类型枚举
* 工作节点类型枚举
* 定义了工作流中所有可用的节点类型及其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 {
// * 脚本任务节点
// * 执行自定义脚本的任务节点
// * 特点:
// * - 支持多种脚本语言如ShellPython等
// * - 支持多种脚本语言如ShellPython等<EFBFBD><EFBFBD><EFBFBD>
// * - 可以执行自定义业务逻辑
// * - 适合复杂的数据处理和计算
// */
@ -191,7 +205,7 @@ public enum NodeTypeEnums {
// PARALLEL_GATEWAY(
// "PARALLEL_GATEWAY",
// "并行网关",
// "行分支控制",
// "<EFBFBD><EFBFBD>行分支控制",
// new WorkflowNodeGraph()
// .setShape("diamond")
// .setSize(50, 50)