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