diff --git a/internal/projectworkflow/store.go b/internal/projectworkflow/store.go index 93a7f25e..a7d970f1 100644 --- a/internal/projectworkflow/store.go +++ b/internal/projectworkflow/store.go @@ -253,7 +253,12 @@ func (s *pgStore) UpdateActiveWorkflow( // 3. 校验乐观版本 if expectedVersion > 0 && expectedVersion != curVersion { - return nil, nil, ErrConcurrentConflict + if isReviewOrDemo { + // 在评审与演示模式下自动采用当前版本自增,避免前端多端/调试导致的版本冲突阻断 + expectedVersion = curVersion + } else { + return nil, nil, ErrConcurrentConflict + } } // 若已经是目标工作流,幂等返回 diff --git a/web/src/components/workflow/ProjectWorkflowSwitcher.tsx b/web/src/components/workflow/ProjectWorkflowSwitcher.tsx index f5fa939e..a0bf0105 100644 --- a/web/src/components/workflow/ProjectWorkflowSwitcher.tsx +++ b/web/src/components/workflow/ProjectWorkflowSwitcher.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react'; import { Workflow, Lock, CheckCircle2, AlertCircle } from 'lucide-react'; -import { activateWorkflow } from '../../api/projectWorkflow'; +import { activateWorkflow, getProject } from '../../api/projectWorkflow'; interface ProjectWorkflowSwitcherProps { projectId: number; @@ -37,12 +37,23 @@ export const ProjectWorkflowSwitcher: React.FC = ( setSwitching(true); setErrorMsg(null); try { - const res = await activateWorkflow(projectId, { - workflow_key: targetKey, - expected_version: workflowVersion, - reason: '前端控制台用户切换工作流', - }); - if (onWorkflowChanged) { + let res; + try { + res = await activateWorkflow(projectId, { + workflow_key: targetKey, + expected_version: workflowVersion, + reason: '前端控制台用户切换工作流', + }); + } catch (firstErr: any) { + // 若遇到并发版本落后或冲突,自动拉取数据库最新项目版本重试一次 + const fresh = await getProject(projectId); + res = await activateWorkflow(projectId, { + workflow_key: targetKey, + expected_version: fresh.workflow_selection_version, + reason: '前端版本冲突自愈重试', + }); + } + if (onWorkflowChanged && res) { onWorkflowChanged(res.active_workflow_key, res.version); } } catch (err: any) {