From ee08263e4a28661c1e786445fc4ea321d56c8d95 Mon Sep 17 00:00:00 2001 From: caozehui <2427765068@qq.com> Date: Fri, 29 May 2026 09:58:24 +0800 Subject: [PATCH] =?UTF-8?q?=E6=A3=80=E6=B5=8B=E8=AE=A1=E5=88=92=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E5=BC=B9=E7=AA=97=E4=B8=8B=E6=8B=89=E6=A1=86=E5=86=85?= =?UTF-8?q?=E5=AE=B9=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/api/plan/interface/index.ts | 7 +++ .../components/planStatisticsPopup.vue | 59 +++++++++++-------- 2 files changed, 43 insertions(+), 23 deletions(-) diff --git a/frontend/src/api/plan/interface/index.ts b/frontend/src/api/plan/interface/index.ts index 0d14acd..ec2f790 100644 --- a/frontend/src/api/plan/interface/index.ts +++ b/frontend/src/api/plan/interface/index.ts @@ -75,6 +75,11 @@ export namespace Plan { unqualifiedCount: number; } + export interface PlanStatisticsOption { + id: string; + name: string; + } + export interface PlanStatistics { planId: string; planName: string; @@ -92,6 +97,8 @@ export namespace Plan { thirdOrMorePassRate: number; unqualifiedRate: number; itemDistributions: PlanStatisticsItem[]; + manufacturerOptions: PlanStatisticsOption[]; + devTypeOptions: PlanStatisticsOption[]; } diff --git a/frontend/src/views/plan/planList/components/planStatisticsPopup.vue b/frontend/src/views/plan/planList/components/planStatisticsPopup.vue index 125fdac..2c292dd 100644 --- a/frontend/src/views/plan/planList/components/planStatisticsPopup.vue +++ b/frontend/src/views/plan/planList/components/planStatisticsPopup.vue @@ -18,7 +18,7 @@ filterable placeholder="全部" class="filter-select" - @change="reloadStatistics" + @change="reloadStatistics('manufacturer')" > ({ planId: '', planName: '', @@ -107,7 +106,9 @@ const emptyStatistics = (): Plan.PlanStatistics => ({ secondPassRate: 0, thirdOrMorePassRate: 0, unqualifiedRate: 0, - itemDistributions: [] + itemDistributions: [], + manufacturerOptions: [], + devTypeOptions: [] }) const dialogVisible = ref(false) @@ -122,8 +123,7 @@ const filters = reactive({ manufacturer: '', devType: '' }) -const dictStore = useDictStore() -const manufacturerOptions = computed(() => dictStore.getDictData('Dev_Manufacturers') as SelectOption[]) +const manufacturerOptions = ref([]) const devTypeOptions = ref([]) let rateChart: echarts.ECharts | null = null let itemChart: echarts.ECharts | null = null @@ -172,16 +172,15 @@ const open = async (row: Partial) => { filters.devType = '' planName.value = row.name || '' dialogVisible.value = true - await loadFilterOptions() await loadStatistics() } -const reloadStatistics = async () => { +const reloadStatistics = async (changedField?: FilterField) => { if (!dialogVisible.value || !currentPlanId.value) return - await loadStatistics() + await loadStatistics(changedField) } -const loadStatistics = async () => { +const loadStatistics = async (changedField?: FilterField) => { loading.value = true try { @@ -190,11 +189,21 @@ const loadStatistics = async () => { manufacturer: filters.manufacturer || undefined, devType: filters.devType || undefined }) + const nextManufacturerOptions = data?.manufacturerOptions || [] + const nextDevTypeOptions = data?.devTypeOptions || [] Object.assign(statisticsData, { ...emptyStatistics(), ...data, - itemDistributions: data?.itemDistributions || [] + itemDistributions: data?.itemDistributions || [], + manufacturerOptions: nextManufacturerOptions, + devTypeOptions: nextDevTypeOptions }) + manufacturerOptions.value = nextManufacturerOptions + devTypeOptions.value = nextDevTypeOptions + if (clearInvalidFilters(changedField)) { + await loadStatistics() + return + } await nextTick() renderCharts() } catch (error) { @@ -205,17 +214,21 @@ const loadStatistics = async () => { } } -const loadFilterOptions = async () => { - if (devTypeOptions.value.length) return - try { - const { data } = await getPqDev() - devTypeOptions.value = ((data || []) as Device.ResDev[]).map(item => ({ - id: item.id, - name: item.name - })) - } catch (error) { - devTypeOptions.value = [] +const clearInvalidFilters = (changedField?: FilterField) => { + let cleared = false + if ( + changedField !== 'manufacturer' && + filters.manufacturer && + !manufacturerOptions.value.some(item => item.id === filters.manufacturer) + ) { + filters.manufacturer = '' + cleared = true } + if (changedField !== 'devType' && filters.devType && !devTypeOptions.value.some(item => item.id === filters.devType)) { + filters.devType = '' + cleared = true + } + return cleared } const renderCharts = () => {