Files
admin-web/src/modules/overseas-master-data/components/FleetQuotePartySelect.vue
T

22 lines
1.8 KiB
Vue

<script setup lang="ts">
import { onBeforeUnmount, ref, watch } from 'vue'
import { useAccessPreviewStore } from '@/core/access/accessPreview'
import { fleetQuoteCustomers, fleetQuoteSuppliers, type FleetQuoteKind } from '../api/fleetQuotes'
const value = defineModel<string>({ default: '' })
const props = defineProps<{ kind: FleetQuoteKind; partyName?: string; disabled?: boolean }>()
const access = useAccessPreviewStore(), rows = ref<{ id: string; name: string }[]>([]), loading = ref(false), error = ref('')
let sequence = 0
watch(() => props.kind, () => { rows.value = []; error.value = ''; sequence++ })
async function search(keyword = '') {
if (props.disabled || (props.kind === 'PURCHASE' && !access.can('platform:supplier:list'))) return
const current = ++sequence; loading.value = true; error.value = ''
try { const result = props.kind === 'SALE' ? await fleetQuoteCustomers(keyword) : await fleetQuoteSuppliers(keyword); if (sequence === current) rows.value = result }
catch { if (sequence === current) error.value = '目录加载失败,请重新搜索' } finally { if (sequence === current) loading.value = false }
}
onBeforeUnmount(() => { sequence++ })
</script>
<template><el-select v-model="value" filterable remote :remote-method="search" :loading="loading" :disabled="disabled || (kind === 'PURCHASE' && !access.can('platform:supplier:list'))" placeholder="搜索并选择往来单位" @focus="search()">
<el-option v-if="value && partyName && !rows.some(r => r.id === value)" :value="value" :label="partyName" />
<el-option v-for="row in rows" :key="row.id" :value="row.id" :label="row.name" />
</el-select><p v-if="error" role="alert">{{ error }}</p><p v-if="kind === 'PURCHASE' && !access.can('platform:supplier:list')">选择车队需要供应商列表权限。</p></template>