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 = () => {