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

- 进度条不再用阶段写死百分比,改为已完成任务数/总任务数
- 复用现有任务计数通道,零后端改动;无任务项目显示无任务不伪造数字
- 阶段映射表仅保留颜色文案用途
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
+11 -2
View File
@@ -120,6 +120,8 @@ function createStore() {
// P1-b A0:统计拉取走后端 count_tasks(独立通道),与 tasks 数组解耦。
// activeTaskCount = 全局 in_progress 任务数;projectTaskCounts = 各项目 in_progress 任务数。
// projectTaskProgress = 各项目 { done, total } 任务数,Dashboard 进度条按真实完成率渲染,
// 复用同一 count_tasks 通道(不带 status 计 total,带 status='done' 计完成数)。
// tasks 变更(create/update/delete/advance)后由 df-data-changed listener 调用刷新。
// 注:projectTaskCounts 依赖 state.projects 已加载 —— 调用方需保证先 loadProjects。
// - Dashboard.loadAll:先 Promise.all([loadProjects, loadIdeas]) 完成再 loadStats
@@ -128,9 +130,14 @@ function createStore() {
try {
state.activeTaskCount = await taskApi.count({ status: 'in_progress' } as TaskQuery)
const entries = await Promise.all(state.projects.map(p =>
taskApi.count({ project_id: p.id, status: 'in_progress' } as TaskQuery).then(n => [p.id, n] as const)
Promise.all([
taskApi.count({ project_id: p.id, status: 'in_progress' } as TaskQuery),
taskApi.count({ project_id: p.id } as TaskQuery),
taskApi.count({ project_id: p.id, status: 'done' } as TaskQuery),
]).then(([active, total, done]) => [p.id, active, { done, total }] as const)
))
state.projectTaskCounts = Object.fromEntries(entries)
state.projectTaskCounts = Object.fromEntries(entries.map(([id, active]) => [id, active]))
state.projectTaskProgress = Object.fromEntries(entries.map(([id, , prog]) => [id, prog]))
} catch (e) {
console.error('[loadStats] 统计拉取失败', e)
}
@@ -144,6 +151,8 @@ function createStore() {
// P1-b A0:统计缓存读口(供 ActiveProjectsPanel 读 projectTaskCounts)
get activeTaskCount() { return state.activeTaskCount },
get projectTaskCounts() { return state.projectTaskCounts },
// 各项目任务完成进度(done/total)读口,Dashboard 项目进度条用
get projectTaskProgress() { return state.projectTaskProgress },
get ideas() { return state.ideas },
get workflowExecutions() { return state.workflowExecutions },
get liveEvents() { return state.liveEvents },
+2
View File
@@ -20,6 +20,8 @@ export const state = reactive({
// 统计缓存,与 tasks 数组解耦,供 Dashboard,不被 Tasks 分页/筛选污染(P1-b A0)
activeTaskCount: 0 as number,
projectTaskCounts: {} as Record<string, number>,
// 各项目任务完成进度(done/total),Dashboard 进度条完成率的数据源,与 tasks 数组解耦
projectTaskProgress: {} as Record<string, { done: number; total: number }>,
ideas: [] as IdeaRecord[],
workflowExecutions: [] as WorkflowRecord[],
liveEvents: [] as Array<WorkflowEventPayload & { _ts: number }>,