From e55613edc63e525792d3559f84309b1f9b08801b Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Sat, 20 Jun 2026 21:57:40 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix=20:[bpm]=20=E8=B6=85=E6=97=B6=E6=97=B6?= =?UTF-8?q?=E9=97=B4=E4=B8=BA=E5=A4=A9=E6=97=B6=E6=A0=BC=E5=BC=8F=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/nodes-config/ChildProcessNodeConfig.vue | 8 ++++---- .../src/nodes-config/DelayTimerNodeConfig.vue | 8 ++++---- .../src/nodes-config/UserTaskNodeConfig.vue | 8 ++++---- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/components/SimpleProcessDesignerV2/src/nodes-config/ChildProcessNodeConfig.vue b/src/components/SimpleProcessDesignerV2/src/nodes-config/ChildProcessNodeConfig.vue index 7ec382fca..8616f7b89 100644 --- a/src/components/SimpleProcessDesignerV2/src/nodes-config/ChildProcessNodeConfig.vue +++ b/src/components/SimpleProcessDesignerV2/src/nodes-config/ChildProcessNodeConfig.vue @@ -529,7 +529,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) @@ -586,12 +586,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' From 026f7e9b1090adcd07ed428687a32c48b3b58229 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Sat, 20 Jun 2026 22:22:16 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20[bpm]=20=E5=B9=B6=E8=A1=8C=E5=88=86?= =?UTF-8?q?=E6=94=AF=E5=90=8E=E7=9A=84=E5=AE=A1=E6=89=B9=E4=BA=BA=E8=87=AA?= =?UTF-8?q?=E9=80=89=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D,https://t.zsxq.co?= =?UTF-8?q?m/daxv1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../detail/ProcessInstanceOperationButton.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue b/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue index 7f6134c15..ca28b22f6 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 } From 950850529d43b8cde2906cea4726f29f2c108b17 Mon Sep 17 00:00:00 2001 From: jason <2667446@qq.com> Date: Sat, 20 Jun 2026 23:38:05 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20[bpm]=20simple=20=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E5=99=A8=E5=AF=BC=E5=85=A5=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/SimpleProcessModel.vue | 16 +++++++++++++++- .../detail/ProcessInstanceOperationButton.vue | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) 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/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue b/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue index ca28b22f6..707e4cd90 100644 --- a/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue +++ b/src/views/bpm/processInstance/detail/ProcessInstanceOperationButton.vue @@ -817,7 +817,7 @@ const initNextAssigneesFormField = async () => { CandidateStrategy.START_USER_SELECT === node.candidateStrategy) || // 情况二:当前节点是审批人自选 (isEmpty(node.candidateUsers) && - CandidateStrategy.APPROVE_USER_SELECT === node.candidateStrategy) + CandidateStrategy.APPROVE_USER_SELECT === node.candidateStrategy) ) { nextAssigneesActivityNode.value.push(node) }