22 lines
1.8 KiB
Vue
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>
|