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) + } + } + } } // 任务的弹窗显示,用于只读模式