优化: 项目进度改为真实任务完成率

- 进度条不再用阶段写死百分比,改为已完成任务数/总任务数
- 复用现有任务计数通道,零后端改动;无任务项目显示无任务不伪造数字
- 阶段映射表仅保留颜色文案用途
This commit is contained in:
lxy
2026-09-29 17:52:55 +08:00
parent 0ca6250ee1
commit 861aad56f4
6 changed files with 40 additions and 17 deletions
@@ -15,9 +15,10 @@
</div>
<div class="project-bar-wrap">
<div class="project-bar">
<div class="project-bar-fill" :class="'fill-' + p.stage" :style="{ width: p.progress + '%' }"></div>
<div class="project-bar-fill" :class="'fill-' + p.stage" :style="{ width: (p.progress ?? 0) + '%' }"></div>
</div>
<span class="project-pct">{{ p.progress }}%</span>
<span v-if="p.progress !== null" class="project-pct">{{ p.progress }}%</span>
<span v-else class="project-pct">{{ $t('dashboard.noTasks') }}</span>
</div>
<div class="project-meta-row">
<span class="project-meta-item">
@@ -54,10 +55,18 @@ function goDetail(projectId: string) {
// P1-b A0:统计走后端 count_tasks 独立通道,不再 filter(store.tasks)。
// store.tasks 是 Tasks 视图当前筛选+分页数据,filter 会让面板数字随 Tasks 翻页/筛选错乱。
// store.projectTaskCounts[projectId] = 后端该项目 in_progress 任务数(loadStats 填充)。
// store.projectTaskProgress[projectId] = 该项目 { done, total } 任务数(loadStats 填充),
// 进度条按真实完成率渲染;无任务(total=0)时不伪造百分比,显示「无任务」。
function getProjectTaskCount(projectId: string): number {
return store.projectTaskCounts[projectId] ?? 0
}
function getProjectProgress(projectId: string): number | null {
const prog = store.projectTaskProgress[projectId]
if (!prog || prog.total === 0) return null
return Math.round((prog.done / prog.total) * 100)
}
// 阶段 label key:projectStageInfo 返回的 stage 值(coding/testing/release/planning/paused/cancelled)
// 直接拼接 i18n key dashboard.stage.<stage>,与 constants/project.ts PROJECT_STAGE_INFO 单一来源。
// 面板名为"活跃项目",按真实生命周期过滤:排除已完结/已取消(后端状态机无 'active',原
@@ -79,7 +88,7 @@ const displayProjects = computed(() =>
name: p.name,
stage: info.stage,
stageLabelKey: info.stage,
progress: info.progress,
progress: getProjectProgress(p.id),
activeTasks: getProjectTaskCount(p.id),
lastActivity: formatRelative(p.last_active_at ?? p.updated_at),
}