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:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user