From 7af9206becfdca95f2740e8ab1eb6904778a5b97 Mon Sep 17 00:00:00 2001 From: Script Generator Date: Fri, 12 Jun 2026 16:32:50 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=B0=83=E7=A0=94/=E4=BA=A7=E5=93=81/UI?= =?UTF-8?q?=20=E5=AE=9E=E9=99=85=E8=80=97=E6=97=B6=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E7=B2=BE=E7=A1=AE=E6=97=B6=E9=97=B4=E6=88=B3=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=92=8C=E8=AE=A1=E7=AE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PlanTab 自动进入"进行中"时调用 onUpdate 记录 actualStartAt - 显示实际开始时间和完成时间(精确到分钟) - calcPlanDuration 改为用时间差计算小时数(精确到0.5h) - formatDuration 显示小时而非天数 Co-Authored-By: Claude Opus 4.7 (1M context) --- apps/web/components/version/PlanTab.tsx | 24 ++++++++++++++++-------- apps/web/lib/version-plan.ts | 10 ++++++---- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/apps/web/components/version/PlanTab.tsx b/apps/web/components/version/PlanTab.tsx index edad12d..de0d817 100644 --- a/apps/web/components/version/PlanTab.tsx +++ b/apps/web/components/version/PlanTab.tsx @@ -55,13 +55,20 @@ export function PlanTab({ plans, versionId, versionDeadline, currentUserName, pl ) : (
{typePlans.map((plan) => { - // 已耗时:已完成用实际完成时间,进行中用当前时间,未开始为0 - const now = new Date().toISOString().slice(0, 10); - const effectiveStatus = plan.status === 'pending' && plan.startTime <= now ? 'in_progress' : plan.status; - const dur = effectiveStatus === 'completed' && plan.completedAt - ? calcPlanDuration(plan.startTime, plan.completedAt) - : effectiveStatus === 'in_progress' - ? calcPlanDuration(plan.startTime, now) + const now = new Date().toISOString(); + const nowDate = now.slice(0, 10); + // 自动进入进行中(到了计划开始日期) + const shouldAutoStart = plan.status === 'pending' && plan.startTime <= nowDate; + if (shouldAutoStart && !plan.actualStartAt) { + onUpdate(plan.id, { status: 'in_progress' }); + } + const effectiveStatus = shouldAutoStart ? 'in_progress' : plan.status; + // 耗时用实际时间戳计算 + const actualStart = plan.actualStartAt || (shouldAutoStart ? now : null); + const dur = effectiveStatus === 'completed' && plan.completedAt && actualStart + ? calcPlanDuration(actualStart, plan.completedAt) + : effectiveStatus === 'in_progress' && actualStart + ? calcPlanDuration(actualStart, now) : { days: 0, hours: 0 }; const durText = dur.days > 0 || dur.hours > 0 ? formatDuration(dur.days, dur.hours) : '-'; return ( @@ -76,7 +83,8 @@ export function PlanTab({ plans, versionId, versionDeadline, currentUserName, pl
计划:{plan.startTime.slice(0, 10)} → {plan.endTime.slice(0, 10)} - {plan.completedAt && 完成:{plan.completedAt.slice(0, 10)}} + {plan.actualStartAt && 实际开始:{plan.actualStartAt.slice(0, 16).replace('T', ' ')}} + {plan.completedAt && 完成:{plan.completedAt.slice(0, 16).replace('T', ' ')}} 已耗时 {durText}
{plan.overdueReason && ( diff --git a/apps/web/lib/version-plan.ts b/apps/web/lib/version-plan.ts index b64b809..0891620 100644 --- a/apps/web/lib/version-plan.ts +++ b/apps/web/lib/version-plan.ts @@ -48,12 +48,14 @@ export function calcPlanDuration(start: string, end: string): { days: number; ho const s = new Date(start).getTime(); const e = new Date(end).getTime(); if (isNaN(s) || isNaN(e) || e < s) return { days: 0, hours: 0 }; - const diff = Math.ceil((e - s) / (1000 * 60 * 60 * 24)); - const totalDays = Math.max(1, diff); // 当天开始当天结束至少1天 - return { days: totalDays, hours: totalDays * 8 }; + const diffHours = (e - s) / (1000 * 60 * 60); + const hours = Math.round(diffHours * 2) / 2; // 精确到0.5h + const days = Math.ceil(diffHours / 24); + return { days, hours }; } -export function formatDuration(days: number, _hours: number): string { +export function formatDuration(days: number, hours: number): string { + if (hours > 0) return `${hours}h`; if (days === 0) return '0天'; return `${days}天`; }