From 8aa8b805a42b208c24b11575e3e64a46dc58b87b Mon Sep 17 00:00:00 2001 From: seaislee1209 Date: Thu, 12 Feb 2026 18:01:54 +0800 Subject: [PATCH] feat: add total waste card to dashboard and import 22 real users Co-authored-by: Cursor --- backend/airlabs.db | Bin 110592 -> 110592 bytes backend/routers/dashboard.py | 7 +++++++ frontend/src/views/Dashboard.vue | 16 +++++++++++++--- 人员清单.md | 23 +++++++++++++++++++++++ 4 files changed, 43 insertions(+), 3 deletions(-) create mode 100644 人员清单.md diff --git a/backend/airlabs.db b/backend/airlabs.db index 6ff9f2e8124893091f3ed6fbd7fb7d2d5c3a3169..733e4f42b471a0f7edc180728b004a292ee63739 100644 GIT binary patch delta 3458 zcma);OOVs{9mm&r7xsaz1wsgc4eSI;FOel#mTlUQ_4;kg*82TuC#`JDlKi%1$(9?U z7(z-BB|JDKrC zqyPB-(f9lPJzn^F^9x^ZeszxmIkVTSK(77r-Di$WD4rbvP6KjY%4RH?r-{;;w#0o^ONIy71Hw) zs)32-(C*2RO~YG8v}LwHXIQd$07)Exkpqz^su8HT17_{U3Z=m;j=0wgG8I7s`%4I9 z%k6hw z?}H4E-JJT-=+hk``Z`D}LcoTm@^RI`zCMXaZXA1qW@9 z_)tgPmyZ`~I(N7#=y8-vSW9_x`_7Ate>~NG>-XOQk-lq4&ky+dU8;denPX>Hh??sl^1nwpOSY>~w~xG~A1` zrxuURwl2OuLj;1IKuF(9#0mgplpgI0u>v4hB|{b)az1;(6yX#chohX1GrNOvzbWO3 z@+Dr#q4t?XDQ-X_NG#_vISiIuEF+&peV`zKOV{tV{(Pl%^g5V;}bTw(hDqNfp!J-Jpxd=-eQiRo#@%oDioM9ulBdn#s zYSA$5V`Vp5w{I-X-kOp8)(6%_k3o0zk#%`Yk!+1(SCW95!{!3+!mF7|A*c(XHZW_V z2`?52u(dpf)||AS37b8Eg3gy=nV2!54S`7OQuF+#q`m zBFFL^!`vQQ!m4OUL$iVjZNZ;x924JR_~a3(mO%tGZn z;S)+UDLQT8cqLTR5DhHQpxqeh(QtmV4PjfKoNc``CoOz(xswFtj*|}%0Wu!e$v?x< zZT*@Y9?>r6pw3gZelfshH$}3D%Wo?33>5-P&KgOCI4DVJwJBPYrt}TWWT;vA@J!xP z%993y$;&BdOK-l{e)EH#8_Q<&o8$hK`?02Sd|hvpBameHLayfm5igdt`C8JI$=Xdp zIv$z!P(>oEiQqMd5RT>OkjGP}aK`CGENCHwb7o_XXkWP8IxAgTIC-Uiy%Ko);WD7j zA)v2=JS>-sQIx~5T9R}Hi#2?>wocTdP$V6iiDYNoeA;J>7eiPuh;Y_WJf%ZRkl*dm zrzyBB=`?7*ef-SArQf#BUGIZDI1Vd%z)hukogR6z!WY+IxU@B&KTmn1d8;*=ixPGm zBMnr#;i1bVcOa+{su9whELW+rr1!Z6kI{$J&E@u$KP{cQ)H;5mkFk*+sIjS3t;492 zg$iHls{!R>B8P@OnNX6+3)*ROHBaSns)Ijykp{?s|k$Z$ZEo41b3nU`gf{=)0n5<|``EwbEAyT%2agDPm z(M3bJKI2Ln?UYE#(?4&jqGesyr-P{bcP_Th%`LpJCLeh_n<-^GUk3~3Ftj72;v(>E2g{KWVUnv(6LLx-U zyTtv!oWFnbR$mb1)NSX9CvN)wHTCva2H!tV?E7BPpxWl>=sFsCh;s4-VfbFvF#g( zG@GVA&3yXG&wu>QLu&_xnqwn9la{qf$#YCjtVCB*|~8Mc@hG zvieK)Rp9TyAb?`xL7S=HsKv-HPs_w;NDCsaUgeJ*HMpD*CI>uFmTCp7%<&MrnZ*Fa0y{0=wwsm+`oBDX??V8>Sbl$GEICbY~ zwbQ6NXIBgU2wB+LA?_F6Sm&{y{L$s(-RO0aH`1Z%SwB2C{|ldT0tn7+x%U%U&+Wim S@QV+R50*Y2EGho?%>MzlemtB2 delta 109 zcmZp8z}E19ZGtqT%tRSyMwyKXOYDW%c}_F%_wq~gE#uSY-OlUIb9%F)!d9Nmr+qA$ zh1mHwGw^@sf5^X?{{a6r{#X2`fRc0hCvT1q1j^lD;Qzz_jsF8s{0aX({u`SW4G!@) N-^ky7BcD;j0RYM*Cu;xz diff --git a/backend/routers/dashboard.py b/backend/routers/dashboard.py index 69d4590..39424f3 100644 --- a/backend/routers/dashboard.py +++ b/backend/routers/dashboard.py @@ -93,8 +93,12 @@ def get_dashboard( # 损耗排行 waste_ranking = [] + total_waste_seconds_all = 0.0 + total_target_seconds_all = 0.0 for p in active + completed: w = calc_waste_for_project(p.id, db) + total_waste_seconds_all += w.get("total_waste_seconds", 0) + total_target_seconds_all += p.target_total_seconds or 0 if w.get("total_waste_seconds", 0) > 0: waste_ranking.append({ "project_id": p.id, @@ -103,6 +107,7 @@ def get_dashboard( "waste_rate": w["waste_rate"], }) waste_ranking.sort(key=lambda x: x["waste_rate"], reverse=True) + total_waste_rate = round(total_waste_seconds_all / total_target_seconds_all * 100, 1) if total_target_seconds_all > 0 else 0 # 已结算项目 settled = [] @@ -206,6 +211,8 @@ def get_dashboard( "monthly_total_seconds": round(monthly_secs, 1), "avg_daily_seconds_per_person": avg_daily, "projects": project_summaries, + "total_waste_seconds": round(total_waste_seconds_all, 0), + "total_waste_rate": total_waste_rate, "waste_ranking": waste_ranking, "settled_projects": settled, "profitability": profitability, diff --git a/frontend/src/views/Dashboard.vue b/frontend/src/views/Dashboard.vue index ada6c3b..ecc0193 100644 --- a/frontend/src/views/Dashboard.vue +++ b/frontend/src/views/Dashboard.vue @@ -1,7 +1,7 @@