优化
This commit is contained in:
@@ -55,6 +55,7 @@ const voucherUploading = ref(false)
|
||||
const voucherError = ref<ApiErrorDetails | null>(null)
|
||||
const rejection = ref('')
|
||||
let loadSequence = 0
|
||||
let feeItemLoadSequence = 0
|
||||
let supplierLoadSequence = 0
|
||||
|
||||
const canView = computed(() => access.can('firstleg:inbound:fee-detail:view'))
|
||||
@@ -122,6 +123,11 @@ function clearPaidFields() {
|
||||
form.paidAt = null; form.paymentMethod = null; form.paymentReferenceNo = null; form.paymentVoucherFileIds = null
|
||||
voucherFiles.value = []; voucherError.value = null
|
||||
}
|
||||
|
||||
// 仅在用户主动选费时带价,保留已有费用回显金额与人工修改。
|
||||
function applyFeeItemDefaultPrice() {
|
||||
form.amount = selectedFeeItem.value?.defaultPrice ?? 0
|
||||
}
|
||||
function settlementLabel(item: ContainerFeeResource) { return item.direction !== 'PAYABLE' ? '—' : item.settlementMode === 'DIRECT_PAID' ? '已付成本' : item.settlementMode === 'ON_ACCOUNT' ? '账期应付' : '未设置' }
|
||||
function paymentMethodLabel(value: string | null | undefined) { return ({ ONLINE: '线上支付', BANK_TRANSFER: '银行转账', CASH: '现金', OTHER: '其他' } as Record<string, string>)[value || ''] || '—' }
|
||||
function customerLabel(customerId: string) { return customerOptions.value.find((item) => item.value === customerId)?.label || '客户信息缺失' }
|
||||
@@ -153,12 +159,17 @@ function removeVoucher(fileId: string) {
|
||||
}
|
||||
|
||||
async function loadFeeItems() {
|
||||
const sequence = ++feeItemLoadSequence
|
||||
feeItems.value = []; feeItemsError.value = null
|
||||
if (!canViewFeeItems.value) return
|
||||
feeItemsLoading.value = true
|
||||
try { feeItems.value = await listApplicableFeeItems() }
|
||||
catch (cause) { feeItemsError.value = getApiErrorDetails(cause, '费用项目加载失败') }
|
||||
finally { feeItemsLoading.value = false }
|
||||
try {
|
||||
const items = await listApplicableFeeItems()
|
||||
// 只接收当前窗口最新请求,旧响应不得覆盖价格或清除新请求的加载状态。
|
||||
if (sequence === feeItemLoadSequence) feeItems.value = items
|
||||
}
|
||||
catch (cause) { if (sequence === feeItemLoadSequence) feeItemsError.value = getApiErrorDetails(cause, '费用项目加载失败') }
|
||||
finally { if (sequence === feeItemLoadSequence) feeItemsLoading.value = false }
|
||||
}
|
||||
|
||||
async function loadSuppliers() {
|
||||
@@ -340,6 +351,12 @@ function clearCustomerContext() {
|
||||
}
|
||||
watch(customerOptions, initializeCustomer, { immediate: true })
|
||||
watch(accountId, () => { clearCustomerContext(); void load() })
|
||||
watch(editorOpen, (open) => {
|
||||
if (open) return
|
||||
// 同步失效旧窗口请求,覆盖关闭后立即重开及切换客户的情况。
|
||||
feeItemLoadSequence += 1
|
||||
feeItems.value = []; feeItemsError.value = null; feeItemsLoading.value = false
|
||||
}, { flush: 'sync' })
|
||||
watch(() => form.direction, (direction) => {
|
||||
if (!applicableItems.value.some((item) => item.id === form.feeItemId)) form.feeItemId = ''
|
||||
if (direction === 'RECEIVABLE') { supplierLoadSequence += 1; form.supplierId = null; form.settlementMode = null; clearPaidFields(); suppliers.value = []; loadedSupplierCategory.value = undefined; suppliersError.value = null; suppliersLoading.value = false }
|
||||
@@ -401,7 +418,7 @@ onMounted(() => void load())
|
||||
<el-form ref="formRef" :model="form" :rules="rules" label-position="top" class="fee-form density-form">
|
||||
<template v-if="!target">
|
||||
<el-form-item label="方向" prop="direction"><el-segmented v-model="form.direction" :options="[{ label: '应收', value: 'RECEIVABLE' }, { label: '应付', value: 'PAYABLE', disabled: !canViewSuppliers }]" /></el-form-item>
|
||||
<el-form-item label="费用项目" prop="feeItemId"><el-select v-model="form.feeItemId" filterable :loading="feeItemsLoading" :disabled="!canViewFeeItems" placeholder="请选择启用且适用的费用项目"><el-option v-for="item in applicableItems" :key="item.id" :label="item.name" :value="item.id" /></el-select></el-form-item>
|
||||
<el-form-item label="费用项目" prop="feeItemId"><el-select v-model="form.feeItemId" filterable :loading="feeItemsLoading" :disabled="!canViewFeeItems" placeholder="请选择启用且适用的费用项目" @change="applyFeeItemDefaultPrice"><el-option v-for="item in applicableItems" :key="item.id" :label="item.name" :value="item.id" /></el-select></el-form-item>
|
||||
<el-form-item v-if="form.direction === 'PAYABLE'" label="供应商" required><el-select v-model="form.supplierId" filterable :loading="suppliersLoading" :disabled="!canViewSuppliers || !selectedFeeItem || !!suppliersError" placeholder="请先选择费用项目"><el-option v-for="supplier in suppliers" :key="supplier.id" :label="supplier.supplierName" :value="supplier.id" /></el-select></el-form-item>
|
||||
<el-form-item v-if="form.direction === 'PAYABLE'" label="结算方式" required><el-radio-group v-model="settlementModeModel"><el-radio-button value="ON_ACCOUNT">账期应付</el-radio-button><el-radio-button value="DIRECT_PAID">已付成本</el-radio-button></el-radio-group></el-form-item>
|
||||
<template v-if="form.direction === 'PAYABLE' && form.settlementMode === 'DIRECT_PAID'">
|
||||
|
||||
Reference in New Issue
Block a user