diff --git a/frontend/src/components/CascadeFilter.vue b/frontend/src/components/CascadeFilter.vue index 3d7293c..0274b07 100644 --- a/frontend/src/components/CascadeFilter.vue +++ b/frontend/src/components/CascadeFilter.vue @@ -9,19 +9,26 @@ export interface CascadeValue { const model = defineModel({ default: () => ({ company_id: undefined, platform_id: undefined, store_id: undefined }) }) -const companies = ref<{ id: number; name: string; label: string }[]>([]) -const platforms = ref<{ id: number; developer_id: number }[]>([]) -const stores = ref<{ id: number; company_id: number; platform_id: number; name: string; label: string }[]>([]) +const companies = ref<{ id: number; name: string; label: string | null }[]>([]) +const platforms = ref<{ id: number; name: string; label: string | null; developer_id?: number }[]>([]) +const stores = ref<{ id: number; company_id: number; platform_id: number; name: string; label: string | null }[]>([]) + +/** 清洗 label:过滤 "null" 字符串,优先 label 其次 name */ +function cleanLabel(label: string | null | undefined, name: string | undefined, fallback: string): string { + if (label && label !== 'null') return label + if (name) return name + return fallback +} const loadingCompanies = ref(false) const loadingStores = ref(false) const companyOptions = computed(() => - companies.value.map((c) => ({ value: c.id, label: c.label || c.name })), + companies.value.map((c) => ({ value: c.id, label: cleanLabel(c.label, c.name, `公司 #${c.id}`) })), ) const platformOptions = computed(() => - platforms.value.map((p) => ({ value: p.id, label: `平台 #${p.id}` })), + platforms.value.map((p) => ({ value: p.id, label: cleanLabel(p.label, p.name, `平台 #${p.id}`) })), ) const storeOptions = computed(() => { @@ -32,7 +39,7 @@ const storeOptions = computed(() => { if (model.value.platform_id) { filtered = filtered.filter((s) => s.platform_id === model.value.platform_id) } - return filtered.map((s) => ({ value: s.id, label: s.label || s.name })) + return filtered.map((s) => ({ value: s.id, label: cleanLabel(s.label, s.name, `店铺 #${s.id}`) })) }) function handleCompanyChange(val: unknown) { @@ -85,44 +92,53 @@ onMounted(() => { diff --git a/frontend/src/pages/orders/index.vue b/frontend/src/pages/orders/index.vue index ff85e41..f1b5474 100644 --- a/frontend/src/pages/orders/index.vue +++ b/frontend/src/pages/orders/index.vue @@ -167,7 +167,7 @@ async function handleViewDetail(record: { id: number }) {

订单管理

- + diff --git a/frontend/src/pages/products/index.vue b/frontend/src/pages/products/index.vue index 468343a..f5cd785 100644 --- a/frontend/src/pages/products/index.vue +++ b/frontend/src/pages/products/index.vue @@ -121,7 +121,7 @@ async function handleViewDetail(record: { id: number }) {

产品管理

- + diff --git a/frontend/src/pages/refunds/index.vue b/frontend/src/pages/refunds/index.vue index 1146f9c..3d29a6d 100644 --- a/frontend/src/pages/refunds/index.vue +++ b/frontend/src/pages/refunds/index.vue @@ -141,7 +141,7 @@ async function handleViewDetail(record: { id: number }) {

退款管理

- + diff --git a/frontend/src/stores/order.ts b/frontend/src/stores/order.ts index 740d8b9..49f5d18 100644 --- a/frontend/src/stores/order.ts +++ b/frontend/src/stores/order.ts @@ -127,24 +127,24 @@ export const useOrderStore = defineStore('order', () => { // 名称映射数据 const companies = ref([]) - const platforms = ref<{ id: number; developer_id: number }[]>([]) + const platforms = ref<{ id: number; name: string; label?: string; developer_id: number }[]>([]) const stores = ref<(LookupItem & { company_id: number; platform_id: number })[]>([]) const companyMap = computed( - () => new Map(companies.value.map((c) => [c.id, c.label || c.name])), + () => new Map(companies.value.map((c) => [c.id, (c.label && c.label !== 'null') ? c.label : c.name])), ) const platformMap = computed( - () => new Map(platforms.value.map((p) => [p.id, `平台 #${p.id}`])), + () => new Map(platforms.value.map((p) => [p.id, (p.label && p.label !== 'null') ? p.label : (p.name || `平台 #${p.id}`)])), ) const storeMap = computed( - () => new Map(stores.value.map((s) => [s.id, s.label || s.name])), + () => new Map(stores.value.map((s) => [s.id, (s.label && s.label !== 'null') ? s.label : s.name])), ) async function loadLookups() { try { const [c, p, s] = await Promise.all([ api.get('/api/v1/companies'), - api.get<{ id: number; developer_id: number }[]>('/api/v1/platforms'), + api.get<{ id: number; name: string; label?: string; developer_id: number }[]>('/api/v1/platforms'), api.get<(LookupItem & { company_id: number; platform_id: number })[]>( '/api/v1/stores', ), diff --git a/frontend/src/stores/product.ts b/frontend/src/stores/product.ts index 25e77a1..5178065 100644 --- a/frontend/src/stores/product.ts +++ b/frontend/src/stores/product.ts @@ -85,19 +85,18 @@ export const useProductStore = defineStore('product', () => { // 名称映射数据 const companies = ref([]) - const platforms = ref<{ id: number; developer_id: number }[]>([]) + const platforms = ref<{ id: number; name: string; label?: string; developer_id: number }[]>([]) const stores = ref<(LookupItem & { company_id: number; platform_id: number })[]>([]) - const companyMap = computed(() => new Map(companies.value.map((c) => [c.id, c.label || c.name]))) - // platforms API 不返回 name 字段,使用 ID 作为显示标签 - const platformMap = computed(() => new Map(platforms.value.map((p) => [p.id, `平台 #${p.id}`]))) - const storeMap = computed(() => new Map(stores.value.map((s) => [s.id, s.label || s.name]))) + const companyMap = computed(() => new Map(companies.value.map((c) => [c.id, (c.label && c.label !== 'null') ? c.label : c.name]))) + const platformMap = computed(() => new Map(platforms.value.map((p) => [p.id, (p.label && p.label !== 'null') ? p.label : (p.name || `平台 #${p.id}`)]))) + const storeMap = computed(() => new Map(stores.value.map((s) => [s.id, (s.label && s.label !== 'null') ? s.label : s.name]))) async function loadLookups() { try { const [c, p, s] = await Promise.all([ api.get('/api/v1/companies'), - api.get<{ id: number; developer_id: number }[]>('/api/v1/platforms'), + api.get<{ id: number; name: string; label?: string; developer_id: number }[]>('/api/v1/platforms'), api.get<(LookupItem & { company_id: number; platform_id: number })[]>('/api/v1/stores'), ]) companies.value = c diff --git a/frontend/src/stores/refund.ts b/frontend/src/stores/refund.ts index c345362..1235ca2 100644 --- a/frontend/src/stores/refund.ts +++ b/frontend/src/stores/refund.ts @@ -33,24 +33,24 @@ export const useRefundStore = defineStore('refund', () => { // 名称映射数据 const companies = ref([]) - const platforms = ref<{ id: number; developer_id: number }[]>([]) + const platforms = ref<{ id: number; name: string; label?: string; developer_id: number }[]>([]) const stores = ref<(LookupItem & { company_id: number; platform_id: number })[]>([]) const companyMap = computed( - () => new Map(companies.value.map((c) => [c.id, c.label || c.name])), + () => new Map(companies.value.map((c) => [c.id, (c.label && c.label !== 'null') ? c.label : c.name])), ) const platformMap = computed( - () => new Map(platforms.value.map((p) => [p.id, `平台 #${p.id}`])), + () => new Map(platforms.value.map((p) => [p.id, (p.label && p.label !== 'null') ? p.label : (p.name || `平台 #${p.id}`)])), ) const storeMap = computed( - () => new Map(stores.value.map((s) => [s.id, s.label || s.name])), + () => new Map(stores.value.map((s) => [s.id, (s.label && s.label !== 'null') ? s.label : s.name])), ) async function loadLookups() { try { const [c, p, s] = await Promise.all([ api.get('/api/v1/companies'), - api.get<{ id: number; developer_id: number }[]>('/api/v1/platforms'), + api.get<{ id: number; name: string; label?: string; developer_id: number }[]>('/api/v1/platforms'), api.get<(LookupItem & { company_id: number; platform_id: number })[]>( '/api/v1/stores', ),