diff --git a/backend/routers/dashboard.py b/backend/routers/dashboard.py index 7e2595d..ad0a6ff 100644 --- a/backend/routers/dashboard.py +++ b/backend/routers/dashboard.py @@ -116,6 +116,47 @@ def get_dashboard( "profit_loss": settlement.get("profit_loss"), }) + # ── 图表数据:近30天每日产出趋势 ── + daily_trend = [] + for i in range(29, -1, -1): + d = today - timedelta(days=i) + day_secs = db.query(sa_func.sum(Submission.total_seconds)).filter( + Submission.submit_date == d, + Submission.total_seconds > 0, + ).scalar() or 0 + daily_trend.append({ + "date": str(d), + "seconds": round(day_secs, 1), + }) + + # ── 图表数据:成本构成 ── + total_labor_all = 0.0 + total_ai_all = 0.0 + total_outsource_all = 0.0 + for p in active + completed: + total_labor_all += calc_labor_cost_for_project(p.id, db) + total_ai_all += calc_ai_tool_cost_for_project(p.id, db) + total_outsource_all += calc_outsource_cost_for_project(p.id, db) + + cost_breakdown = [ + {"name": "人力成本", "value": round(total_labor_all, 0)}, + {"name": "AI工具", "value": round(total_ai_all, 0)}, + {"name": "外包", "value": round(total_outsource_all, 0)}, + ] + + # ── 图表数据:各项目产出对比(进行中项目) ── + project_comparison = [] + for p in active: + total_secs_p = db.query(sa_func.sum(Submission.total_seconds)).filter( + Submission.project_id == p.id, + Submission.total_seconds > 0, + ).scalar() or 0 + project_comparison.append({ + "name": p.name, + "submitted": round(total_secs_p, 0), + "target": p.target_total_seconds, + }) + return { "active_projects": len(active), "completed_projects": len(completed), @@ -126,6 +167,10 @@ def get_dashboard( "projects": project_summaries, "waste_ranking": waste_ranking, "settled_projects": settled, + # 图表数据 + "daily_trend": daily_trend, + "cost_breakdown": cost_breakdown, + "project_comparison": project_comparison, } diff --git a/frontend/src/views/Dashboard.vue b/frontend/src/views/Dashboard.vue index 4178d8b..0bf6cd5 100644 --- a/frontend/src/views/Dashboard.vue +++ b/frontend/src/views/Dashboard.vue @@ -32,6 +32,18 @@ + +
+
+
近 30 天产出趋势
+
+
+
+
成本构成
+
+
+
+
@@ -48,12 +60,7 @@
{{ p.progress_percent }}%
- +
{{ formatSecs(p.submitted_seconds) }} / {{ formatSecs(p.target_seconds) }} 损耗 {{ p.waste_rate }}% @@ -63,59 +70,57 @@
-
- -
-
损耗排行
-
- - - - - - - - - - -
+ +
+
+
项目产出对比
+
+
+
损耗排行
+
+
+
- -
-
已结算项目
-
- - - - - - - - - - -
+ +
+
已结算项目
+
+ + + + + + + + +