From 7290da8eae65d3e6e5bb29f34cdb6bcfb33c4a1d Mon Sep 17 00:00:00 2001 From: 12451 <12451@example.com> Date: Thu, 2 Jul 2026 22:09:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8D=A1=E7=89=87=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=9C=9F=E5=AE=9E=E9=80=9A=E9=81=93=E7=8A=B6=E6=80=81=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=EF=BC=88=E7=A9=BA=E9=97=B2/=E5=85=85=E7=94=B5/?= =?UTF-8?q?=E5=85=85=E6=BB=A1/=E6=95=85=E9=9A=9C=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api-server/src/routes/cabinet_tree.rs | 45 ++++++++++++------- .../api-server/src/routes/organizations.rs | 12 +++++ software/web/src/api/devices.ts | 6 +++ .../web/src/pages/devices/CabinetGrid.tsx | 10 +++-- 4 files changed, 53 insertions(+), 20 deletions(-) diff --git a/software/api-server/src/routes/cabinet_tree.rs b/software/api-server/src/routes/cabinet_tree.rs index 34debb5..bb3275b 100644 --- a/software/api-server/src/routes/cabinet_tree.rs +++ b/software/api-server/src/routes/cabinet_tree.rs @@ -126,44 +126,57 @@ pub async fn filter_cabinets( let db = &state.mysql; + // 基础SQL:联表查询获取通道状态统计 + let base_sql = " + SELECT + c.id, c.project_id, c.abstract_id, c.imei, c.iccid, c.name, c.address, c.status, + (SELECT COUNT(*) FROM cabin_boards cb WHERE cb.cabinet_id = c.id) as board_count, + (SELECT COUNT(*) FROM cabin_boards cb2 + JOIN compartments comp ON comp.cabin_board_id = cb2.id + WHERE cb2.cabinet_id = c.id) as channel_count, + (SELECT COUNT(*) FROM cabin_boards cb3 + JOIN compartments comp2 ON comp2.cabin_board_id = cb3.id + WHERE cb3.cabinet_id = c.id AND comp2.status = 0) as idle_count, + (SELECT COUNT(*) FROM cabin_boards cb4 + JOIN compartments comp3 ON comp3.cabin_board_id = cb4.id + WHERE cb4.cabinet_id = c.id AND comp3.status = 1) as charging_count, + (SELECT COUNT(*) FROM cabin_boards cb5 + JOIN compartments comp4 ON comp4.cabin_board_id = cb5.id + WHERE cb5.cabinet_id = c.id AND comp4.status = 2) as full_count, + (SELECT COUNT(*) FROM cabin_boards cb6 + JOIN compartments comp5 ON comp5.cabin_board_id = cb6.id + WHERE cb6.cabinet_id = c.id AND comp5.status = 3) as fault_count + FROM cabinets c + "; + let rows = if let Some(proj_id) = params.project_id { - // 按项目筛选 sqlx::query_as::<_, CabinetRow>( - "SELECT id, project_id, abstract_id, imei, iccid, name, address, status - FROM cabinets WHERE project_id = ? ORDER BY id" + &format!("{} WHERE c.project_id = ? ORDER BY c.id", base_sql) ) .bind(proj_id) .fetch_all(db) .await? } else if let Some(org_id) = params.organization_id { - // 按组织筛选(包括下级组织) sqlx::query_as::<_, CabinetRow>( - "SELECT c.id, c.project_id, c.abstract_id, c.imei, c.iccid, c.name, c.address, c.status - FROM cabinets c - JOIN projects p ON c.project_id = p.id + &format!("{} JOIN projects p ON c.project_id = p.id WHERE p.organization_id IN ( SELECT id FROM organizations WHERE id = ? OR parent_id = ? - ) ORDER BY c.id" + ) ORDER BY c.id", base_sql) ) .bind(org_id) .bind(org_id) .fetch_all(db) .await? } else if user.role_level >= 2 { - // 总管理员看所有 sqlx::query_as::<_, CabinetRow>( - "SELECT id, project_id, abstract_id, imei, iccid, name, address, status - FROM cabinets ORDER BY id" + &format!("{} ORDER BY c.id", base_sql) ) .fetch_all(db) .await? } else if let Some(org_id) = user.organization_id { - // 企业管理员只看本组织 sqlx::query_as::<_, CabinetRow>( - "SELECT c.id, c.project_id, c.abstract_id, c.imei, c.iccid, c.name, c.address, c.status - FROM cabinets c - JOIN projects p ON c.project_id = p.id - WHERE p.organization_id = ? ORDER BY c.id" + &format!("{} JOIN projects p ON c.project_id = p.id + WHERE p.organization_id = ? ORDER BY c.id", base_sql) ) .bind(org_id) .fetch_all(db) diff --git a/software/api-server/src/routes/organizations.rs b/software/api-server/src/routes/organizations.rs index af7f68d..9e2bc21 100644 --- a/software/api-server/src/routes/organizations.rs +++ b/software/api-server/src/routes/organizations.rs @@ -72,6 +72,18 @@ pub struct CabinetRow { #[serde(skip_serializing_if = "Option::is_none")] pub address: Option, pub status: i8, + #[serde(skip_serializing_if = "Option::is_none")] + pub board_count: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub channel_count: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub idle_count: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub charging_count: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub full_count: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub fault_count: Option, } /// 树节点 diff --git a/software/web/src/api/devices.ts b/software/web/src/api/devices.ts index e49601b..11d5d0b 100644 --- a/software/web/src/api/devices.ts +++ b/software/web/src/api/devices.ts @@ -25,6 +25,12 @@ export interface Cabinet { name?: string; address?: string; status: number; + board_count?: number; + channel_count?: number; + idle_count?: number; + charging_count?: number; + full_count?: number; + fault_count?: number; } export interface Compartment { diff --git a/software/web/src/pages/devices/CabinetGrid.tsx b/software/web/src/pages/devices/CabinetGrid.tsx index 64a56de..da92648 100644 --- a/software/web/src/pages/devices/CabinetGrid.tsx +++ b/software/web/src/pages/devices/CabinetGrid.tsx @@ -66,10 +66,12 @@ export default function CabinetGrid({ cabinets, loading }: CabinetGridProps) { {/* 通道状态 */} -
- 空闲: 30 - 充电: 5 - 故障: 1 +
+ 通道: {cab.channel_count || 36} + 空闲: {cab.idle_count || 0} + 充电: {cab.charging_count || 0} + 充满: {cab.full_count || 0} + 故障: {cab.fault_count || 0}
{/* 地址 */}