审核节点-优化代码-修复跳转任意节点

pull/710/head
Lemon 2025-02-22 19:28:53 +08:00
parent b2ddefe4a0
commit 4b96a6458b
5 changed files with 129 additions and 20 deletions

View File

@ -129,14 +129,28 @@ const recursiveFindParentNode = (
if (!findNode) { if (!findNode) {
return return
} }
if (findNode.type === NodeType.START_USER_NODE) {
nodeList.push(findNode)
return
}
//
if (findNode.type === nodeType) { if (findNode.type === nodeType) {
nodeList.push(findNode) nodeList.push(findNode)
} }
//
if (findNode.childNode) {
if (findNode.childNode.type === nodeType) {
nodeList.push(findNode.childNode)
}
recursiveFindParentNode(nodeList, findNode.childNode, nodeType)
}
//
if (findNode.type === NodeType.CONDITION_BRANCH_NODE && findNode.conditionNodes) {
findNode.conditionNodes.forEach(conditionNode => {
if (conditionNode.childNode) {
recursiveFindParentNode(nodeList, conditionNode.childNode, nodeType)
}
})
}
emits('find:recursiveFindParentNode', nodeList, props.parentNode, nodeType) emits('find:recursiveFindParentNode', nodeList, props.parentNode, nodeType)
} }
</script> </script>

View File

@ -233,6 +233,8 @@ export type TimeoutHandler = {
timeDuration?: string timeDuration?: string
// 执行动作是自动提醒, 最大提醒次数 // 执行动作是自动提醒, 最大提醒次数
maxRemindCount?: number maxRemindCount?: number
// 执行动作是自动跳转时跳转的节点ID
returnNodeId?: string
} }
/** /**
@ -291,6 +293,16 @@ export enum RejectHandlerType {
*/ */
RETURN_USER_TASK = 2 RETURN_USER_TASK = 2
} }
export enum DelaySettingType {
/**
*
*/
FINISH_PROCESS = 1,
/**
*
*/
RETURN_USER_TASK = 2
}
// 用户任务超时处理类型枚举 // 用户任务超时处理类型枚举
export enum TimeoutHandlerType { export enum TimeoutHandlerType {
/** /**
@ -304,7 +316,11 @@ export enum TimeoutHandlerType {
/** /**
* *
*/ */
REJECT = 3 REJECT = 3,
/**
*
*/
AUTO_JUMP = 4
} }
// 用户任务的审批人为空时,处理类型枚举 // 用户任务的审批人为空时,处理类型枚举
export enum AssignEmptyHandlerType { export enum AssignEmptyHandlerType {
@ -570,7 +586,8 @@ export const TIME_UNIT_TYPES: DictDataVO[] = [
export const TIMEOUT_HANDLER_TYPES: DictDataVO[] = [ export const TIMEOUT_HANDLER_TYPES: DictDataVO[] = [
{ label: '自动提醒', value: 1 }, { label: '自动提醒', value: 1 },
{ label: '自动同意', value: 2 }, { label: '自动同意', value: 2 },
{ label: '自动拒绝', value: 3 } { label: '自动拒绝', value: 3 },
{ label: '自动跳转', value: 4 }
] ]
export const REJECT_HANDLER_TYPES: DictDataVO[] = [ export const REJECT_HANDLER_TYPES: DictDataVO[] = [
{ label: '终止流程', value: RejectHandlerType.FINISH_PROCESS }, { label: '终止流程', value: RejectHandlerType.FINISH_PROCESS },
@ -695,11 +712,11 @@ export enum ProcessVariableEnum {
/** /**
* *
*/ */
export type DelaySetting = { export interface DelaySetting {
// 延迟类型 delayType: DelayTypeEnum
delayType: number
// 延迟时间表达式
delayTime: string delayTime: string
autoJumpEnable?: boolean
returnNodeId?: string
} }
/** /**
* *

View File

@ -156,6 +156,7 @@ export type UserTaskFormType = {
assignStartUserHandlerType?: AssignStartUserHandlerType assignStartUserHandlerType?: AssignStartUserHandlerType
timeDuration?: number timeDuration?: number
maxRemindCount?: number maxRemindCount?: number
timeoutReturnNodeId?: string
buttonsSetting: any[] buttonsSetting: any[]
taskCreateListenerEnable?: boolean taskCreateListenerEnable?: boolean
taskCreateListenerPath?: string taskCreateListenerPath?: string

View File

@ -347,6 +347,25 @@
> >
<el-input-number v-model="configForm.maxRemindCount" :min="1" :max="10" /> <el-input-number v-model="configForm.maxRemindCount" :min="1" :max="10" />
</el-form-item> </el-form-item>
<el-form-item
v-if="configForm.timeoutHandlerEnable && configForm.timeoutHandlerType === TimeoutHandlerType.AUTO_JUMP"
label="跳转节点"
prop="timeoutReturnNodeId"
>
<el-select
filterable
v-model="configForm.timeoutReturnNodeId"
clearable
style="width: 100%"
>
<el-option
v-for="item in returnTaskList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
</div> </div>
<el-divider content-position="left">{{ nodeTypeName }}人为空时</el-divider> <el-divider content-position="left">{{ nodeTypeName }}人为空时</el-divider>
@ -729,7 +748,9 @@ const saveConfig = async () => {
enable: configForm.value.timeoutHandlerEnable!, enable: configForm.value.timeoutHandlerEnable!,
type: cTimeoutType.value, type: cTimeoutType.value,
timeDuration: isoTimeDuration.value, timeDuration: isoTimeDuration.value,
maxRemindCount: cTimeoutMaxRemindCount.value maxRemindCount: cTimeoutMaxRemindCount.value,
returnNodeId: configForm.value.timeoutHandlerType === TimeoutHandlerType.AUTO_JUMP ?
configForm.value.timeoutReturnNodeId : undefined
} }
// //
currentNode.value.assignEmptyHandler = { currentNode.value.assignEmptyHandler = {
@ -803,15 +824,24 @@ const showUserTaskNodeConfig = (node: SimpleFlowNode) => {
returnTaskList.value = matchNodeList returnTaskList.value = matchNodeList
// 2.4 // 2.4
configForm.value.timeoutHandlerEnable = node.timeoutHandler?.enable configForm.value.timeoutHandlerEnable = node.timeoutHandler?.enable
if (node.timeoutHandler?.enable && node.timeoutHandler?.timeDuration) { if (node.timeoutHandler?.enable) {
const strTimeDuration = node.timeoutHandler.timeDuration configForm.value.timeoutHandlerType = node.timeoutHandler.type
let parseTime = strTimeDuration.slice(2, strTimeDuration.length - 1) configForm.value.timeoutReturnNodeId = node.timeoutHandler.returnNodeId
let parseTimeUnit = strTimeDuration.slice(strTimeDuration.length - 1)
configForm.value.timeDuration = parseInt(parseTime) if (node.timeoutHandler.timeDuration) {
timeUnit.value = convertTimeUnit(parseTimeUnit) 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 // 2.5
configForm.value.assignEmptyHandlerType = node.assignEmptyHandler?.type configForm.value.assignEmptyHandlerType = node.assignEmptyHandler?.type
configForm.value.assignEmptyHandlerUserIds = node.assignEmptyHandler?.userIds configForm.value.assignEmptyHandlerUserIds = node.assignEmptyHandler?.userIds
@ -902,6 +932,11 @@ function useTimeoutHandler() {
const timeoutHandlerTypeChanged = () => { const timeoutHandlerTypeChanged = () => {
if (configForm.value.timeoutHandlerType === TimeoutHandlerType.REMINDER) { if (configForm.value.timeoutHandlerType === TimeoutHandlerType.REMINDER) {
configForm.value.maxRemindCount = 1 // 1 configForm.value.maxRemindCount = 1 // 1
} else if (configForm.value.timeoutHandlerType === TimeoutHandlerType.AUTO_JUMP) {
//
const matchNodeList: SimpleFlowNode[] = []
emits('find:returnTaskNodes', matchNodeList)
returnTaskList.value = matchNodeList
} }
} }

View File

@ -169,8 +169,50 @@ const deleteNode = () => {
const findReturnTaskNodes = ( const findReturnTaskNodes = (
matchNodeList: SimpleFlowNode[] // matchNodeList: SimpleFlowNode[] //
) => { ) => {
// //
emits('find:parentNode', matchNodeList, NodeType.USER_TASK_NODE) emits('find:parentNode', matchNodeList, NodeType.USER_TASK_NODE)
//
findChildUserTaskNodes(currentNode.value, matchNodeList)
//
const currentNodeId = currentNode.value.id
// 使 Map , id key
const uniqueNodes = new Map()
matchNodeList.forEach(node => {
if (node.id !== currentNodeId) {
uniqueNodes.set(node.id, node)
}
})
//
matchNodeList.length = 0
matchNodeList.push(...Array.from(uniqueNodes.values()))
}
//
const findChildUserTaskNodes = (node: SimpleFlowNode, matchNodeList: SimpleFlowNode[]) => {
if (!node) return
//
if (node.childNode) {
if (node.childNode.type === NodeType.USER_TASK_NODE) {
matchNodeList.push(node.childNode)
}
findChildUserTaskNodes(node.childNode, matchNodeList)
}
//
if (node.type === NodeType.CONDITION_BRANCH_NODE && node.conditionNodes) {
node.conditionNodes.forEach(conditionNode => {
if (conditionNode.childNode) {
if (conditionNode.childNode.type === NodeType.USER_TASK_NODE) {
matchNodeList.push(conditionNode.childNode)
}
findChildUserTaskNodes(conditionNode.childNode, matchNodeList)
}
})
}
} }
// //