diff --git a/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue b/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue index 8e2c5e39b..f1585aa06 100644 --- a/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue +++ b/src/components/SimpleProcessDesignerV2/src/SimpleProcessModel.vue @@ -36,7 +36,11 @@ @mouseleave="stopDrag" @mouseenter="setGrabCursor" > - + @@ -222,16 +226,26 @@ const exportJson = () => { /** 导入 JSON */ const refFile = ref() +/** 导入后自增,作为 ProcessNodeTree 的 key,强制重新挂载以保证画布刷新 */ +const importKey = ref(0) const importJson = () => { refFile.value.click() } const importLocalFile = () => { const file = refFile.value.files[0] + // 清空 input 的 value,否则再次选择同一个文件时 change 事件不会触发 + refFile.value.value = '' + if (!file) { + return + } const reader = new FileReader() reader.readAsText(file) reader.onload = function () { if (isString(this.result)) { processNodeTree.value = JSON.parse(this.result) + // 改变 key,强制 ProcessNodeTree 重新挂载, + // 规避 watch(() => props.flowNode) 在组件复用场景下同步失效导致画布不刷新的问题 + importKey.value++ emits('save', processNodeTree.value) } } diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/ChildProcessNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/ChildProcessNodeConfig.vue index e0542dec8..0b2903ee0 100644 --- a/src/components/SimpleProcessDesignerV2/src/nodes-config/ChildProcessNodeConfig.vue +++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/ChildProcessNodeConfig.vue @@ -546,7 +546,7 @@ const showChildProcessNodeConfig = (node: SimpleFlowNode) => { // 固定时长 if (configForm.value.timeoutType === DelayTypeEnum.FIXED_TIME_DURATION) { const strTimeDuration = node.childProcessSetting.timeoutSetting.timeExpression ?? '' - let parseTime = strTimeDuration.slice(2, strTimeDuration.length - 1) + let parseTime = strTimeDuration.match(/\d+/)?.[0] ?? '' let parseTimeUnit = strTimeDuration.slice(strTimeDuration.length - 1) configForm.value.timeDuration = parseInt(parseTime) configForm.value.timeUnit = convertTimeUnit(parseTimeUnit) @@ -603,12 +603,12 @@ const loadFormInfo = async () => { } } const getIsoTimeDuration = () => { - let strTimeDuration = 'PT' + let strTimeDuration = 'P' if (configForm.value.timeUnit === TimeUnitType.MINUTE) { - strTimeDuration += configForm.value.timeDuration + 'M' + strTimeDuration += 'T' + configForm.value.timeDuration + 'M' } if (configForm.value.timeUnit === TimeUnitType.HOUR) { - strTimeDuration += configForm.value.timeDuration + 'H' + strTimeDuration += 'T' + configForm.value.timeDuration + 'H' } if (configForm.value.timeUnit === TimeUnitType.DAY) { strTimeDuration += configForm.value.timeDuration + 'D' diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/DelayTimerNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/DelayTimerNodeConfig.vue index 741796d3a..599c8d0c6 100644 --- a/src/components/SimpleProcessDesignerV2/src/nodes-config/DelayTimerNodeConfig.vue +++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/DelayTimerNodeConfig.vue @@ -152,12 +152,12 @@ const getShowText = (): string => { return showText } const getIsoTimeDuration = () => { - let strTimeDuration = 'PT' + let strTimeDuration = 'P' if (configForm.value.timeUnit === TimeUnitType.MINUTE) { - strTimeDuration += configForm.value.timeDuration + 'M' + strTimeDuration += 'T' + configForm.value.timeDuration + 'M' } if (configForm.value.timeUnit === TimeUnitType.HOUR) { - strTimeDuration += configForm.value.timeDuration + 'H' + strTimeDuration += 'T' + configForm.value.timeDuration + 'H' } if (configForm.value.timeUnit === TimeUnitType.DAY) { strTimeDuration += configForm.value.timeDuration + 'D' @@ -172,7 +172,7 @@ const showDelayTimerNodeConfig = (node: SimpleFlowNode) => { // 固定时长 if (configForm.value.delayType === DelayTypeEnum.FIXED_TIME_DURATION) { const strTimeDuration = node.delaySetting.delayTime - let parseTime = strTimeDuration.slice(2, strTimeDuration.length - 1) + let parseTime = strTimeDuration.match(/\d+/)?.[0] ?? '' let parseTimeUnit = strTimeDuration.slice(strTimeDuration.length - 1) configForm.value.timeDuration = parseInt(parseTime) configForm.value.timeUnit = convertTimeUnit(parseTimeUnit) diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue index f8ab8abf5..e1043408e 100644 --- a/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue +++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue @@ -816,7 +816,7 @@ const showUserTaskNodeConfig = (node: SimpleFlowNode) => { 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 parseTime = strTimeDuration.match(/\d+/)?.[0] ?? '' let parseTimeUnit = strTimeDuration.slice(strTimeDuration.length - 1) configForm.value.timeDuration = parseInt(parseTime) timeUnit.value = convertTimeUnit(parseTimeUnit) @@ -938,12 +938,12 @@ function useTimeoutHandler() { if (!configForm.value.timeoutHandlerEnable) { return undefined } - let strTimeDuration = 'PT' + let strTimeDuration = 'P' if (timeUnit.value === TimeUnitType.MINUTE) { - strTimeDuration += configForm.value.timeDuration + 'M' + strTimeDuration += 'T' + configForm.value.timeDuration + 'M' } if (timeUnit.value === TimeUnitType.HOUR) { - strTimeDuration += configForm.value.timeDuration + 'H' + strTimeDuration += 'T' + configForm.value.timeDuration + 'H' } if (timeUnit.value === TimeUnitType.DAY) { strTimeDuration += configForm.value.timeDuration + 'D' diff --git a/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue b/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue index 7f6134c15..707e4cd90 100644 --- a/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue +++ b/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue @@ -816,7 +816,8 @@ const initNextAssigneesFormField = async () => { isEmpty(node.candidateUsers) && CandidateStrategy.START_USER_SELECT === node.candidateStrategy) || // 情况二:当前节点是审批人自选 - CandidateStrategy.APPROVE_USER_SELECT === node.candidateStrategy + (isEmpty(node.candidateUsers) && + CandidateStrategy.APPROVE_USER_SELECT === node.candidateStrategy) ) { nextAssigneesActivityNode.value.push(node) } @@ -849,7 +850,7 @@ const validateNextAssignees = () => { } // 如果需要自选审批人,则校验每个节点是否都已配置审批人 for (const item of nextAssigneesActivityNode.value) { - if (isEmpty(approveReasonForm.nextAssignees[item.id])) { + if (isEmpty(item.candidateUsers) && isEmpty(approveReasonForm.nextAssignees[item.id])) { message.warning('下一个节点的审批人不能为空!') return false }