fix(workflow): reconcile version conflicts in review mode and UI retry

Auto-adopt current workflow selection version in review/demo backend
paths, and retry frontend workflow switch after refreshing project version.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
WeiCHEN
2026-09-11 13:00:33 +08:00
co-authored by Cursor
parent a865b68e36
commit 2c58e2d17c
2 changed files with 24 additions and 8 deletions
+6 -1
View File
@@ -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
}
}
// 若已经是目标工作流,幂等返回
@@ -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<ProjectWorkflowSwitcherProps> = (
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) {