diff --git a/src/components/SimpleProcessDesignerV2/src/ProcessNodeTree.vue b/src/components/SimpleProcessDesignerV2/src/ProcessNodeTree.vue
index dddeda690bd534eac0540ec954e3d00d4a96afaa..3975c242feda9c6306e7a9b2c3d75e7d5eccfdbf 100644
--- a/src/components/SimpleProcessDesignerV2/src/ProcessNodeTree.vue
+++ b/src/components/SimpleProcessDesignerV2/src/ProcessNodeTree.vue
@@ -81,6 +81,7 @@
/>
diff --git a/src/components/SimpleProcessDesignerV2/src/consts.ts b/src/components/SimpleProcessDesignerV2/src/consts.ts
index c7285f93f5f02e3eefaea3b940afd55e26a6ac03..389c9cde738e836d652ffd46c9582e20492b556f 100644
--- a/src/components/SimpleProcessDesignerV2/src/consts.ts
+++ b/src/components/SimpleProcessDesignerV2/src/consts.ts
@@ -240,6 +240,8 @@ export type TimeoutHandler = {
timeDuration?: string
// 执行动作是自动提醒, 最大提醒次数
maxRemindCount?: number
+ // 执行动作是自动跳转时,跳转的节点ID
+ returnNodeId?: string
}
/**
@@ -298,6 +300,16 @@ export enum RejectHandlerType {
*/
RETURN_USER_TASK = 2
}
+export enum DelaySettingType {
+ /**
+ * 默认开启
+ */
+ FINISH_PROCESS = 1,
+ /**
+ * 延迟器指定节点
+ */
+ RETURN_USER_TASK = 2
+}
// 用户任务超时处理类型枚举
export enum TimeoutHandlerType {
/**
@@ -311,7 +323,11 @@ export enum TimeoutHandlerType {
/**
* 自动拒绝
*/
- REJECT = 3
+ REJECT = 3,
+ /**
+ * 自动跳转
+ */
+ AUTO_JUMP = 4
}
// 用户任务的审批人为空时,处理类型枚举
export enum AssignEmptyHandlerType {
@@ -579,7 +595,8 @@ export const TIME_UNIT_TYPES: DictDataVO[] = [
export const TIMEOUT_HANDLER_TYPES: DictDataVO[] = [
{ label: '自动提醒', value: 1 },
{ label: '自动同意', value: 2 },
- { label: '自动拒绝', value: 3 }
+ { label: '自动拒绝', value: 3 },
+ { label: '自动跳转', value: 4 }
]
export const REJECT_HANDLER_TYPES: DictDataVO[] = [
{ label: '终止流程', value: RejectHandlerType.FINISH_PROCESS },
@@ -704,11 +721,11 @@ export enum ProcessVariableEnum {
/**
* 延迟设置
*/
-export type DelaySetting = {
- // 延迟类型
- delayType: number
- // 延迟时间表达式
+export interface DelaySetting {
+ delayType: DelayTypeEnum
delayTime: string
+ autoJumpEnable?: boolean
+ returnNodeId?: string
}
/**
* 延迟类型
diff --git a/src/components/SimpleProcessDesignerV2/src/node.ts b/src/components/SimpleProcessDesignerV2/src/node.ts
index e3ac7c263d4a0ef31a4027b2753ef7b283b09bce..bbbca9855895d83a807695cdba1b5c2be9dc42a2 100644
--- a/src/components/SimpleProcessDesignerV2/src/node.ts
+++ b/src/components/SimpleProcessDesignerV2/src/node.ts
@@ -156,6 +156,7 @@ export type UserTaskFormType = {
assignStartUserHandlerType?: AssignStartUserHandlerType
timeDuration?: number
maxRemindCount?: number
+ timeoutReturnNodeId?: string
buttonsSetting: any[]
taskCreateListenerEnable?: boolean
taskCreateListenerPath?: string
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
index 433864b02d2ea9bb2c7b198c20cb646f8ae48911..02ae42120bf4a44aaf0df326bfa986f82a9f779e 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
@@ -347,6 +347,25 @@
>
+
+
+
+
+
{{ nodeTypeName }}人为空时
@@ -729,7 +748,9 @@ const saveConfig = async () => {
enable: configForm.value.timeoutHandlerEnable!,
type: cTimeoutType.value,
timeDuration: isoTimeDuration.value,
- maxRemindCount: cTimeoutMaxRemindCount.value
+ maxRemindCount: cTimeoutMaxRemindCount.value,
+ returnNodeId: configForm.value.timeoutHandlerType === TimeoutHandlerType.AUTO_JUMP ?
+ configForm.value.timeoutReturnNodeId : undefined
}
// 设置审批人为空时
currentNode.value.assignEmptyHandler = {
@@ -803,15 +824,24 @@ const showUserTaskNodeConfig = (node: SimpleFlowNode) => {
returnTaskList.value = matchNodeList
// 2.4 设置审批超时处理
configForm.value.timeoutHandlerEnable = node.timeoutHandler?.enable
- if (node.timeoutHandler?.enable && node.timeoutHandler?.timeDuration) {
- const strTimeDuration = node.timeoutHandler.timeDuration
- let parseTime = strTimeDuration.slice(2, strTimeDuration.length - 1)
- let parseTimeUnit = strTimeDuration.slice(strTimeDuration.length - 1)
- configForm.value.timeDuration = parseInt(parseTime)
- timeUnit.value = convertTimeUnit(parseTimeUnit)
+ if (node.timeoutHandler?.enable) {
+ configForm.value.timeoutHandlerType = node.timeoutHandler.type
+ configForm.value.timeoutReturnNodeId = node.timeoutHandler.returnNodeId
+
+ if (node.timeoutHandler.timeDuration) {
+ const strTimeDuration = node.timeoutHandler.timeDuration
+ let parseTime = strTimeDuration.slice(2, strTimeDuration.length - 1)
+ let parseTimeUnit = strTimeDuration.slice(strTimeDuration.length - 1)
+ configForm.value.timeDuration = parseInt(parseTime)
+ timeUnit.value = convertTimeUnit(parseTimeUnit)
+ }
+
+ if (node.timeoutHandler.type === TimeoutHandlerType.AUTO_JUMP) {
+ const matchNodeList: SimpleFlowNode[] = []
+ emits('find:returnTaskNodes', matchNodeList)
+ returnTaskList.value = matchNodeList
+ }
}
- configForm.value.timeoutHandlerType = node.timeoutHandler?.type
- configForm.value.maxRemindCount = node.timeoutHandler?.maxRemindCount
// 2.5 设置审批人为空时
configForm.value.assignEmptyHandlerType = node.assignEmptyHandler?.type
configForm.value.assignEmptyHandlerUserIds = node.assignEmptyHandler?.userIds
@@ -902,6 +932,11 @@ function useTimeoutHandler() {
const timeoutHandlerTypeChanged = () => {
if (configForm.value.timeoutHandlerType === TimeoutHandlerType.REMINDER) {
configForm.value.maxRemindCount = 1 // 超时提醒次数,默认为1
+ } else if (configForm.value.timeoutHandlerType === TimeoutHandlerType.AUTO_JUMP) {
+ // 获取可跳转节点列表
+ const matchNodeList: SimpleFlowNode[] = []
+ emits('find:returnTaskNodes', matchNodeList)
+ returnTaskList.value = matchNodeList
}
}
diff --git a/src/components/SimpleProcessDesignerV2/src/nodes/UserTaskNode.vue b/src/components/SimpleProcessDesignerV2/src/nodes/UserTaskNode.vue
index ae1af6c287957627fcdc5b0febe729ad618593be..d24cfb1aed706e60023847f6cd4cfed0f21dcdb6 100644
--- a/src/components/SimpleProcessDesignerV2/src/nodes/UserTaskNode.vue
+++ b/src/components/SimpleProcessDesignerV2/src/nodes/UserTaskNode.vue
@@ -41,7 +41,7 @@
@@ -147,12 +147,16 @@ const nodeSetting = ref()
const nodeClick = () => {
if (readonly) {
+ console.log('[UserTaskNode] 开始处理只读模式点击, tasks长度:', tasks.value?.length)
if (tasks && tasks.value) {
dialogTitle.value = currentNode.value.name
+ console.time('过滤任务耗时')
// 只读模式,弹窗显示任务信息
selectTasks.value = tasks.value.filter(
(item: any) => item?.taskDefinitionKey === currentNode.value.id
)
+ console.timeEnd('过滤任务耗时')
+ console.log('[UserTaskNode] 过滤后的任务数:', selectTasks.value.length)
dialogVisible.value = true
}
} else {
@@ -165,12 +169,69 @@ const nodeClick = () => {
const deleteNode = () => {
emits('update:flowNode', currentNode.value.childNode)
}
-// 查找可以驳回用户节点
-const findReturnTaskNodes = (
- matchNodeList: SimpleFlowNode[] // 匹配的节点
-) => {
- // 从父节点查找
+// 优化查找可驳回用户节点函数
+const findReturnTaskNodes = (matchNodeList: SimpleFlowNode[]) => {
+ console.time('findReturnTaskNodes总耗时')
+
+ // 使用Set进行去重
+ const uniqueNodes = new Set()
+ const currentNodeId = currentNode.value.id
+ const processedNodes = new Set() // 用于记录已处理的节点
+
+ // 从父节点查找用户任务节点
+ console.time('父节点查找耗时')
emits('find:parentNode', matchNodeList, NodeType.USER_TASK_NODE)
+ console.timeEnd('父节点查找耗时')
+
+ // 过滤并去重
+ matchNodeList.forEach(node => {
+ if (!processedNodes.has(node.id) && node.id !== currentNodeId) {
+ uniqueNodes.add(node)
+ processedNodes.add(node.id)
+ }
+ })
+
+ // 查找子节点
+ findChildUserTaskNodes(currentNode.value, uniqueNodes, currentNodeId, processedNodes)
+
+ // 更新结果数组
+ matchNodeList.length = 0
+ matchNodeList.push(...Array.from(uniqueNodes))
+
+ console.log('[findReturnTaskNodes] 最终找到的节点数:', matchNodeList.length)
+ console.timeEnd('findReturnTaskNodes总耗时')
+}
+
+// 优化子节点查找函数
+const findChildUserTaskNodes = (
+ node: SimpleFlowNode,
+ uniqueNodes: Set,
+ currentNodeId: string,
+ processedNodes: Set
+) => {
+ if (!node || processedNodes.has(node.id)) return
+
+ processedNodes.add(node.id)
+
+ // 处理直接子节点
+ if (node.childNode) {
+ if (node.childNode.type === NodeType.USER_TASK_NODE &&
+ node.childNode.id !== currentNodeId &&
+ !processedNodes.has(node.childNode.id)) {
+ uniqueNodes.add(node.childNode)
+ processedNodes.add(node.childNode.id)
+ }
+ findChildUserTaskNodes(node.childNode, uniqueNodes, currentNodeId, processedNodes)
+ }
+
+ // 处理条件分支节点
+ if (node.type === NodeType.CONDITION_BRANCH_NODE && node.conditionNodes) {
+ for (const conditionNode of node.conditionNodes) {
+ if (conditionNode.childNode) {
+ findChildUserTaskNodes(conditionNode.childNode, uniqueNodes, currentNodeId, processedNodes)
+ }
+ }
+ }
}
// 任务的弹窗显示,用于只读模式