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}
{/* 地址 */}