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}天`; }