From 699a390f45b4d9e30b5bfc7850191c54d3743fc4 Mon Sep 17 00:00:00 2001 From: seaislee1209 Date: Sat, 21 Mar 2026 00:24:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20v0.10.2=20=E2=80=94=20admin=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E7=BC=96=E8=BE=91=E9=9A=90=E8=97=8F/frozen=E9=98=B2?= =?UTF-8?q?=E8=B4=9F=E6=95=B0/=E8=BF=9B=E5=BA=A6=E6=9D=A1=E5=88=B7?= =?UTF-8?q?=E6=96=B0=E4=BF=9D=E6=8C=81/navigate=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - admin资产页视频详情隐藏「重新编辑」按钮(hideReEdit prop) - 团管重新编辑跳转修正:navigate('/') → navigate('/app') - _release_freeze 防止 frozen_amount 变负数 - 生成进度条用 sessionStorage 持久化,刷新页面后从之前位置继续 Co-Authored-By: Claude Opus 4.6 (1M context) --- backend/apps/generation/views.py | 5 ++++- web/src/components/VideoDetailModal.tsx | 9 +++++---- web/src/pages/AdminAssetsPage.tsx | 1 + web/src/store/generation.ts | 7 +++++-- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/backend/apps/generation/views.py b/backend/apps/generation/views.py index baa1a22..57bcfc1 100644 --- a/backend/apps/generation/views.py +++ b/backend/apps/generation/views.py @@ -320,7 +320,10 @@ def _release_freeze(record): frozen = record.frozen_amount with transaction.atomic(): locked_team = Team.objects.select_for_update().get(pk=team.pk) - locked_team.frozen_amount = F('frozen_amount') - frozen + # 防止 frozen_amount 变负 + actual_release = min(frozen, locked_team.frozen_amount) + if actual_release > 0: + locked_team.frozen_amount = F('frozen_amount') - actual_release locked_team.total_seconds_used = F('total_seconds_used') - record.seconds_consumed locked_team.save(update_fields=['frozen_amount', 'total_seconds_used']) record.frozen_amount = 0 diff --git a/web/src/components/VideoDetailModal.tsx b/web/src/components/VideoDetailModal.tsx index 48c5dfc..067d8f2 100644 --- a/web/src/components/VideoDetailModal.tsx +++ b/web/src/components/VideoDetailModal.tsx @@ -13,13 +13,14 @@ interface Props { onReEdit?: (id: string) => void; onRegenerate?: (id: string) => void; onDelete?: (id: string) => void; + hideReEdit?: boolean; onPrev?: () => void; onNext?: () => void; hasPrev?: boolean; hasNext?: boolean; } -export function VideoDetailModal({ task, onClose, onReEdit, onRegenerate, onDelete, onPrev, onNext, hasPrev, hasNext }: Props) { +export function VideoDetailModal({ task, onClose, onReEdit, onRegenerate, onDelete, onPrev, onNext, hasPrev, hasNext, hideReEdit }: Props) { const navigate = useNavigate(); const videoRef = useRef(null); const videoContainerRef = useRef(null); @@ -230,7 +231,7 @@ export function VideoDetailModal({ task, onClose, onReEdit, onRegenerate, onDele } } onClose(); - navigate('/'); + navigate('/app'); } }; @@ -497,7 +498,7 @@ export function VideoDetailModal({ task, onClose, onReEdit, onRegenerate, onDele {/* Re-edit button above info bar */} -
+ {!hideReEdit &&
-
+
} {/* Fixed bottom: info bar + actions card */}
diff --git a/web/src/pages/AdminAssetsPage.tsx b/web/src/pages/AdminAssetsPage.tsx index a6197ad..c17c511 100644 --- a/web/src/pages/AdminAssetsPage.tsx +++ b/web/src/pages/AdminAssetsPage.tsx @@ -229,6 +229,7 @@ export function AdminAssetsPage() { setDetailTask(null)} + hideReEdit />
); diff --git a/web/src/store/generation.ts b/web/src/store/generation.ts index 5918af4..6cf27e6 100644 --- a/web/src/store/generation.ts +++ b/web/src/store/generation.ts @@ -75,7 +75,7 @@ function backendToFrontend(bt: BackendTask): GenerationTask { duration: bt.duration as GenerationTask['duration'], references, status: mapStatus(bt.status), - progress: mapProgress(bt.status), + progress: bt.status === 'processing' ? Number(sessionStorage.getItem(`progress_${bt.task_id}`) || mapProgress(bt.status)) : mapProgress(bt.status), resultUrl: bt.result_url || undefined, errorMessage: mapErrorMessage(bt.error_message), createdAt: new Date(bt.created_at).getTime(), @@ -105,7 +105,9 @@ function ensureSmoothProgress() { if (t.status !== 'generating') return t; // Decelerate: fast at start, slow near end const increment = t.progress < 30 ? 2 : t.progress < 60 ? 1 : 0.5; - return { ...t, progress: Math.min(t.progress + increment, 95) }; + const newProgress = Math.min(t.progress + increment, 95); + if (t.taskId) sessionStorage.setItem(`progress_${t.taskId}`, String(newProgress)); + return { ...t, progress: newProgress }; }), })); }, 2000); @@ -146,6 +148,7 @@ function startPolling(taskId: string, frontendId: string) { if (newStatus === 'completed' || newStatus === 'failed') { pollTimers.delete(frontendId); + sessionStorage.removeItem(`progress_${taskId}`); if (newStatus === 'completed') { useAuthStore.getState().fetchUserInfo(); }