From cab86556f3f9acf44f777fb6de2aac12489055e1 Mon Sep 17 00:00:00 2001 From: kkfluous Date: Wed, 29 Apr 2026 15:31:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(mileage):=20=E5=8C=BA=E5=9F=9F=E4=B8=8E?= =?UTF-8?q?=E8=BD=A6=E7=89=8C=E5=88=97=E8=A1=A8=E7=BA=A7=E8=81=94=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E8=87=AA=E5=8A=A8=E5=89=94=E9=99=A4=E8=B6=8A=E7=95=8C?= =?UTF-8?q?=E8=BD=A6=E7=89=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 后端: 选中 region 时基于该区域车辆重算 filters,车牌列表只展示该区域 - 前端: filterOptions.plates 收窄后自动从已选车牌中剔除不属于新区域的项 Co-Authored-By: Claude Opus 4.7 (1M context) --- src/modules/mileage/MonitoringView.tsx | 8 ++++++++ src/server/routes/mileage/monitoring.ts | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/src/modules/mileage/MonitoringView.tsx b/src/modules/mileage/MonitoringView.tsx index 9ba4af9..258aeee 100644 --- a/src/modules/mileage/MonitoringView.tsx +++ b/src/modules/mileage/MonitoringView.tsx @@ -201,6 +201,14 @@ export default function MonitoringView() { loadFirstPage(); }, [loadFirstPage]); + // 区域级联:plate 选项收窄后,剔除已选但已不属于该区域的车牌 + useEffect(() => { + if (filterPlates.length === 0) return; + const valid = new Set(filterOptions.plates); + const next = filterPlates.filter(p => valid.has(p)); + if (next.length !== filterPlates.length) setFilterPlates(next); + }, [filterOptions.plates, filterPlates]); + // 下载当前筛选结果为 xlsx const handleDownload = useCallback(async () => { if (exporting) return; diff --git a/src/server/routes/mileage/monitoring.ts b/src/server/routes/mileage/monitoring.ts index 1947b20..d64b763 100644 --- a/src/server/routes/mileage/monitoring.ts +++ b/src/server/routes/mileage/monitoring.ts @@ -100,6 +100,12 @@ app.get('/', async (c) => { filters = buildDateFilters(allVehicles); // 重算筛选选项以匹配权限范围 } + // 区域级联:选中运营区域时,下游筛选选项(车牌等)只展示该区域车辆 + if (filterParams.region) { + const regionScope = allVehicles.filter(v => v.region === filterParams.region); + filters = buildDateFilters(regionScope); + } + const filtered = applyFilters(allVehicles, filterParams); const stats = {