From fc008886fc1da6b78169c0d8b4f895a613ec64fd Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Thu, 24 Sep 2026 16:29:58 +0800 Subject: [PATCH 01/29] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E9=80=80=E7=A8=8E=E5=9B=9E=E6=89=A7=E7=A1=AE=E8=AE=A4=E4=BA=A4?= =?UTF-8?q?=E4=BA=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/first-leg/api/customs.ts | 21 ++++++++++ .../components/CustomsDocumentsDialog.vue | 39 ++++++++++++++++++- 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/src/modules/first-leg/api/customs.ts b/src/modules/first-leg/api/customs.ts index 6e7d15f..1f2b507 100644 --- a/src/modules/first-leg/api/customs.ts +++ b/src/modules/first-leg/api/customs.ts @@ -33,6 +33,8 @@ export interface MerchantCustomsDocument { inboundCodes: string[] frozen: boolean completion: MerchantCustomsFile | null + receiptStatus: 'PENDING' | 'CONFIRMED' | 'REJECTED' | null + receiptRejectReason: string | null } export interface MerchantCustomsContainer { @@ -47,6 +49,7 @@ export interface MerchantCustomsContainer { version: number taxRefundCount: number coveredTaxRefundCount: number + actualBoxCount: number inbounds: MerchantCustomsInbound[] documents: MerchantCustomsDocument[] startedAt?: string | null @@ -190,6 +193,24 @@ export function downloadMerchantCustomsCompletion(document: MerchantCustomsDocum ) } +export function confirmMerchantCustomsReceipt(document: MerchantCustomsDocument) { + return apiRequest({ + method: 'POST', + url: `/merchant/v1/customs/documents/${encodedId(document.documentId)}/receipt/confirm`, + headers: { 'Idempotency-Key': createIdempotencyKey(`merchant-customs-receipt-confirm-${document.documentId}`) }, + data: { expectedVersion: document.completion?.version ?? 0, confirm: true, remark: null }, + }) +} + +export function rejectMerchantCustomsReceipt(document: MerchantCustomsDocument, reason: string) { + return apiRequest({ + method: 'POST', + url: `/merchant/v1/customs/documents/${encodedId(document.documentId)}/receipt/reject`, + headers: { 'Idempotency-Key': createIdempotencyKey(`merchant-customs-receipt-reject-${document.documentId}`) }, + data: { expectedVersion: document.completion?.version ?? 0, confirm: false, remark: reason }, + }) +} + export function merchantCustomsErrorMeta(error: unknown): ApiErrorMeta | null { if (!(error instanceof ApiError)) return null return { code: error.code, requestId: error.requestId ?? null, traceId: error.traceId ?? null } diff --git a/src/modules/first-leg/components/CustomsDocumentsDialog.vue b/src/modules/first-leg/components/CustomsDocumentsDialog.vue index 0a975dd..fdab2a1 100644 --- a/src/modules/first-leg/components/CustomsDocumentsDialog.vue +++ b/src/modules/first-leg/components/CustomsDocumentsDialog.vue @@ -5,11 +5,13 @@ import { Download, FileText, LockKeyhole, Pencil, Trash2, Upload } from '@lucide import { MERCHANT_CUSTOMS_STATUS_LABELS, deleteMerchantCustomsDocument, + confirmMerchantCustomsReceipt, downloadMerchantCustomsCompletion, downloadMerchantCustomsSource, getMerchantCustomsForOrder, merchantCustomsErrorMessage, replaceMerchantCustomsDocument, + rejectMerchantCustomsReceipt, updateMerchantCustomsDocumentInbounds, uploadMerchantCustomsDocument, validateMerchantCustomsFile, @@ -207,6 +209,32 @@ async function downloadFile(document: MerchantCustomsDocument, kind: 'source' | } } +async function confirmReceipt(document: MerchantCustomsDocument) { + try { + await ElMessageBox.confirm('确认已核对整份报关行回执吗?确认后将进入整柜报关完成汇总。', '确认报关行回执', { type: 'warning' }) + mutating.value = true + await confirmMerchantCustomsReceipt(document) + ElMessage.success('回执确认成功') + await loadDetail() + } catch (error) { + if (error === 'cancel' || error === 'close') return + ElMessage.error(merchantCustomsErrorMessage(error, '回执确认失败')) + } finally { mutating.value = false } +} + +async function rejectReceipt(document: MerchantCustomsDocument) { + try { + const reason = await ElMessageBox.prompt('请填写打回原因', '打回报关行回执', { inputValidator: (value) => value.trim() ? true : '请输入打回原因' }) + mutating.value = true + await rejectMerchantCustomsReceipt(document, reason.value) + ElMessage.success('回执已打回') + await loadDetail() + } catch (error) { + if (error === 'cancel' || error === 'close') return + ElMessage.error(merchantCustomsErrorMessage(error, '回执打回失败')) + } finally { mutating.value = false } +} + function formatDateTime(value: string | null | undefined) { if (!value) return '-' const date = new Date(value) @@ -246,6 +274,10 @@ function formatSize(bytes: number) { 资料覆盖 {{ detail.coveredTaxRefundCount }} / {{ detail.taxRefundCount }} 票 +
+ 实际箱数 + {{ detail.actualBoxCount }} +
{{ merchantStatusLabel }} @@ -286,7 +318,12 @@ function formatSize(bytes: number) {
源文件 - 完成文件 + 报关行回执 + + {{ item.receiptStatus === 'CONFIRMED' ? '已确认' : item.receiptStatus === 'REJECTED' ? `已打回:${item.receiptRejectReason || '待补充'}` : '待确认' }} From 682d75f201a31e789e54545a5e542084cc7fbb33 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Sat, 26 Sep 2026 22:35:30 +0800 Subject: [PATCH 12/29] style(client): remove duplicate sailing page heading --- src/modules/first-leg/views/SailingPricesView.vue | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/modules/first-leg/views/SailingPricesView.vue b/src/modules/first-leg/views/SailingPricesView.vue index 9360c1b..60d2409 100644 --- a/src/modules/first-leg/views/SailingPricesView.vue +++ b/src/modules/first-leg/views/SailingPricesView.vue @@ -1,6 +1,6 @@ From 58c4be7fc0016af23188a24b7216deb2e5b08ad2 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Sat, 26 Sep 2026 22:49:17 +0800 Subject: [PATCH 13/29] feat(client): align sailing quote inquiry with prototype --- .../first-leg/views/SailingPricesView.vue | 39 ++++++++++++------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/modules/first-leg/views/SailingPricesView.vue b/src/modules/first-leg/views/SailingPricesView.vue index 60d2409..2a18bfa 100644 --- a/src/modules/first-leg/views/SailingPricesView.vue +++ b/src/modules/first-leg/views/SailingPricesView.vue @@ -7,13 +7,22 @@ import { estimateMerchantFirstLegPrice, getMerchantPricingChannels, getMerchantW const loading = ref(false); const querying = ref(false); const errorMessage = ref('') const router = useRouter() -const warehouses = ref([]); const channels = ref([]); const quotes = ref([]) -const originWarehouseId = ref(''); const destinationCode = ref(''); const weight = ref(); const volume = ref(); const taxMode = ref<'TAX_INCLUDED' | 'TAX_EXCLUDED'>('TAX_INCLUDED') -const hasInput = computed(() => Boolean(originWarehouseId.value && destinationCode.value.trim() && weight.value && volume.value)) -function formatMoney(item: MerchantPriceEstimate) { return `${item.currency} ${item.estimatedAmount.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` } -async function loadBase() { loading.value = true; errorMessage.value = ''; try { const result = await getMerchantWarehouses({ warehouseType: 'DOMESTIC' }); warehouses.value = result.records; if (result.records[0]) { originWarehouseId.value = result.records[0].id; await loadChannels() } } catch (error) { errorMessage.value = error instanceof Error ? error.message : '船期价格加载失败' } finally { loading.value = false } } -async function loadChannels() { if (!originWarehouseId.value) return; channels.value = await getMerchantPricingChannels(originWarehouseId.value) } -async function query() { if (!hasInput.value) { ElMessage.warning('请填写起运仓、目的仓、重量和体积'); return }; querying.value = true; quotes.value = []; try { const results = await Promise.allSettled(channels.value.map((channel) => estimateMerchantFirstLegPrice({ originWarehouseId: originWarehouseId.value, channelCode: channel.channelCode, destinationCode: destinationCode.value.trim(), destinationType: 'FBA', pricingTaxMode: taxMode.value, actualWeightKg: weight.value!, actualVolumeCbm: volume.value! }))); quotes.value = results.flatMap((item) => item.status === 'fulfilled' ? [item.value] : []) } finally { querying.value = false } } +const warehouses = ref([]); const destinationWarehouses = ref([]); const channels = ref([]); const quotes = ref([]) +const quoteDialogOpen = ref(false); const originWarehouseId = ref(''); const destinationWarehouseId = ref(''); const weight = ref(); const volume = ref(); const taxMode = ref<'TAX_INCLUDED' | 'TAX_EXCLUDED'>('TAX_INCLUDED') +const selectedDestinationWarehouse = computed(() => destinationWarehouses.value.find((item) => String(item.id) === String(destinationWarehouseId.value))) +const destinationCode = computed(() => selectedDestinationWarehouse.value?.warehouseCode || '') +const hasInput = computed(() => Boolean(originWarehouseId.value && destinationWarehouseId.value && weight.value && volume.value)) +const quoteCards = computed(() => quotes.value.map((quote) => ({ quote, channel: channels.value.find((item) => item.channelCode === quote.channelCode) })).filter((item): item is { quote: MerchantPriceEstimate; channel: MerchantPricingChannel } => Boolean(item.channel)).sort((a, b) => a.quote.estimatedAmount - b.quote.estimatedAmount).slice(0, 4)) +const priceWinner = computed(() => quoteCards.value.reduce((winner, item) => !winner || item.quote.estimatedAmount < winner.quote.estimatedAmount ? item : winner, undefined as (typeof quoteCards.value)[number] | undefined)) +const timeWinner = computed(() => quoteCards.value.reduce((winner, item) => { const days = transitDays(item.channel.referenceTransit); if (days === null) return winner; return !winner || days < transitDays(winner.channel.referenceTransit)! ? item : winner }, undefined as (typeof quoteCards.value)[number] | undefined)) +const resultSummary = computed(() => `${volume.value || 0} CBM · ${destinationCode.value || '—'} · 匹配 ${quoteCards.value.length} 个渠道`) +function transitDays(value: string | null) { const match = value?.match(/\d+/); return match ? Number(match[0]) : null } +function formatMoney(item: MerchantPriceEstimate) { const currency = item.currency === 'CNY' ? '¥' : `${item.currency} `; return `${currency}${item.estimatedAmount.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` } +function formatUnitPrice(item: MerchantPriceEstimate) { const currency = item.currency === 'CNY' ? '¥' : `${item.currency} `; return `${currency}${item.unitPrice.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}/${item.chargeUnit || 'CBM'}` } +function recommendation(item: { quote: MerchantPriceEstimate; channel: MerchantPricingChannel }) { if (priceWinner.value?.quote.channelCode === item.quote.channelCode) return { label: '价格优选', className: 'price' }; if (timeWinner.value?.quote.channelCode === item.quote.channelCode) return { label: '时间优选', className: 'time' }; return undefined } +async function loadBase() { loading.value = true; errorMessage.value = ''; try { const [originResult, destinationResult] = await Promise.all([getMerchantWarehouses({ warehouseType: 'DOMESTIC' }), getMerchantWarehouses({ warehouseType: 'FBA' })]); warehouses.value = originResult.records; destinationWarehouses.value = destinationResult.records; if (originResult.records[0]) originWarehouseId.value = originResult.records[0].id; if (destinationResult.records[0]) destinationWarehouseId.value = destinationResult.records[0].id; await loadChannels() } catch (error) { errorMessage.value = error instanceof Error ? error.message : '船期价格加载失败' } finally { loading.value = false } } +async function loadChannels() { if (!originWarehouseId.value) return; try { channels.value = await getMerchantPricingChannels(originWarehouseId.value) } catch (error) { channels.value = []; errorMessage.value = error instanceof Error ? error.message : '船期渠道加载失败' } } +async function query() { const destination = selectedDestinationWarehouse.value; if (!hasInput.value || !destination) { ElMessage.warning('请选择目的 FBA 仓,并填写重量和体积'); return }; if (!channels.value.length) { ElMessage.warning('暂无可查询的船期渠道'); return }; querying.value = true; quotes.value = []; try { const results = await Promise.allSettled(channels.value.map((channel) => estimateMerchantFirstLegPrice({ originWarehouseId: originWarehouseId.value, channelCode: channel.channelCode, destinationCode: destination.warehouseCode, destinationType: 'FBA', destinationWarehouseId: destination.id, destinationName: destination.warehouseName, pricingTaxMode: taxMode.value, actualWeightKg: weight.value!, actualVolumeCbm: volume.value! }))); quotes.value = results.flatMap((item) => item.status === 'fulfilled' ? [item.value] : []); if (!quotes.value.length) { ElMessage.warning('当前条件暂无匹配报价'); return }; quoteDialogOpen.value = true } finally { querying.value = false } } function placeOrder(channelCode: string, channelName: string) { if (!quotes.value.some((quote) => quote.channelCode === channelCode)) { ElMessage.warning('请先查询该渠道价格') @@ -27,9 +36,10 @@ function placeOrder(channelCode: string, channelName: string) { channelCode, channelName, destinationType: 'FBA', - destinationWarehouseName: destinationCode.value.trim().toUpperCase(), - amazonWarehouseCode: destinationCode.value.trim().toUpperCase(), - destinationCountryCode: 'US', + destinationWarehouseId: String(selectedDestinationWarehouse.value!.id), + destinationWarehouseName: selectedDestinationWarehouse.value!.warehouseName, + amazonWarehouseCode: selectedDestinationWarehouse.value!.warehouseCode, + destinationCountryCode: selectedDestinationWarehouse.value!.countryCode || 'US', pricingTaxMode: taxMode.value, grossWeightKg: String(weight.value), volumeCbm: String(volume.value), @@ -41,12 +51,15 @@ watch(originWarehouseId, () => { void loadChannels() }); onMounted(() => { void From 8aed079d02405b22b0a3dd7207acea1ba03c406b Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Sat, 26 Sep 2026 22:51:14 +0800 Subject: [PATCH 14/29] fix(client): style sailing quote dialog root --- src/modules/first-leg/views/SailingPricesView.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/modules/first-leg/views/SailingPricesView.vue b/src/modules/first-leg/views/SailingPricesView.vue index 2a18bfa..a5d384e 100644 --- a/src/modules/first-leg/views/SailingPricesView.vue +++ b/src/modules/first-leg/views/SailingPricesView.vue @@ -62,4 +62,7 @@ watch(originWarehouseId, () => { void loadChannels() }); onMounted(() => { void .quote-dialog { --el-dialog-bg-color:transparent; }.quote-dialog :deep(.el-dialog) { overflow:hidden; border-radius:22px; background:linear-gradient(125deg,#182e69 0%,#274cbd 55%,#416bf1 100%); box-shadow:0 24px 70px rgba(11,31,89,.34); }.quote-dialog :deep(.el-dialog__header) { margin:0; padding:0; }.quote-dialog :deep(.el-dialog__body) { padding:0 20px 22px; }.quote-dialog-head { display:flex; align-items:flex-start; justify-content:space-between; padding:22px 22px 16px; color:#fff; }.quote-dialog-head h3 { margin:0 0 3px; font-size:22px; }.quote-dialog-head span { color:rgba(255,255,255,.72); font-size:14px; }.quote-close { width:42px; height:42px; border:1px solid #cfddf2; border-radius:13px; background:#fff; color:#8392a8; font-size:31px; line-height:34px; cursor:pointer; }.quote-grid { display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:20px; }.quote-card { position:relative; min-height:300px; overflow:hidden; padding:28px 25px 21px; border:1px solid #d5deee; border-radius:20px; background:#f8f9fd; color:#263a55; box-shadow:0 8px 22px rgba(22,48,117,.12); }.quote-card.price { border:2px solid #ffae3c; }.quote-card.time { border:2px solid #27c28c; }.quote-ribbon { position:absolute; right:-42px; top:17px; width:145px; padding:7px 0; transform:rotate(43deg); background:#ff8d14; color:#fff; text-align:center; font-size:12px; font-weight:850; }.quote-card.time .quote-ribbon { background:#0db886; }.quote-card-title { display:flex; align-items:flex-start; justify-content:space-between; gap:8px; }.quote-card-title strong { font-size:19px; }.quote-card-title span { flex:none; padding:7px 10px; border-radius:18px; background:#edf5ff; color:#367ae0; font-size:11px; font-weight:750; }.quote-price { display:flex; align-items:baseline; gap:8px; margin:25px 0 22px; }.quote-price b { color:#ed5a2a; font-size:33px; line-height:1; }.quote-price small { color:#96a4b8; font-size:15px; }.quote-meta { display:grid; grid-template-columns:1fr 1fr; gap:17px 13px; }.quote-meta span { display:block; margin-bottom:5px; color:#93a0b2; font-size:12px; }.quote-meta strong { display:block; color:#344961; font-size:14px; line-height:1.45; }.quote-order { width:100%; margin-top:20px; border-radius:9px; }.quote-card:not(.price):not(.time) .quote-order { background:#fff; } @media (max-width:1200px) { .pricing-form { grid-template-columns:repeat(3,minmax(0,1fr)); }.quote-grid { grid-template-columns:repeat(2,minmax(0,1fr)); } } @media (max-width:720px) { .quote-grid { grid-template-columns:1fr; }.pricing-form { grid-template-columns:1fr; } } +:global(.quote-dialog.el-dialog) { overflow:hidden; border-radius:22px; background:linear-gradient(125deg,#182e69 0%,#274cbd 55%,#416bf1 100%); box-shadow:0 24px 70px rgba(11,31,89,.34); } +:global(.quote-dialog.el-dialog .el-dialog__header) { margin:0; padding:0; } +:global(.quote-dialog.el-dialog .el-dialog__body) { padding:0 20px 22px; } From 7eda66bc4d37d521ab31581aa11f62146e4a366d Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Sat, 26 Sep 2026 22:53:19 +0800 Subject: [PATCH 15/29] fix(client): show chargeable quantity in quote summary --- src/modules/first-leg/views/SailingPricesView.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/modules/first-leg/views/SailingPricesView.vue b/src/modules/first-leg/views/SailingPricesView.vue index a5d384e..78ba0dd 100644 --- a/src/modules/first-leg/views/SailingPricesView.vue +++ b/src/modules/first-leg/views/SailingPricesView.vue @@ -15,7 +15,11 @@ const hasInput = computed(() => Boolean(originWarehouseId.value && destinationWa const quoteCards = computed(() => quotes.value.map((quote) => ({ quote, channel: channels.value.find((item) => item.channelCode === quote.channelCode) })).filter((item): item is { quote: MerchantPriceEstimate; channel: MerchantPricingChannel } => Boolean(item.channel)).sort((a, b) => a.quote.estimatedAmount - b.quote.estimatedAmount).slice(0, 4)) const priceWinner = computed(() => quoteCards.value.reduce((winner, item) => !winner || item.quote.estimatedAmount < winner.quote.estimatedAmount ? item : winner, undefined as (typeof quoteCards.value)[number] | undefined)) const timeWinner = computed(() => quoteCards.value.reduce((winner, item) => { const days = transitDays(item.channel.referenceTransit); if (days === null) return winner; return !winner || days < transitDays(winner.channel.referenceTransit)! ? item : winner }, undefined as (typeof quoteCards.value)[number] | undefined)) -const resultSummary = computed(() => `${volume.value || 0} CBM · ${destinationCode.value || '—'} · 匹配 ${quoteCards.value.length} 个渠道`) +const resultSummary = computed(() => { + const quoteUnit = (volume.value || 0) >= (weight.value || 0) / 167 ? 'CBM' : 'KG' + const quoteQuantity = quoteUnit === 'CBM' ? volume.value : weight.value + return `${quoteQuantity || 0} ${quoteUnit} · ${destinationCode.value || '—'} · 匹配 ${quoteCards.value.length} 个渠道` +}) function transitDays(value: string | null) { const match = value?.match(/\d+/); return match ? Number(match[0]) : null } function formatMoney(item: MerchantPriceEstimate) { const currency = item.currency === 'CNY' ? '¥' : `${item.currency} `; return `${currency}${item.estimatedAmount.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}` } function formatUnitPrice(item: MerchantPriceEstimate) { const currency = item.currency === 'CNY' ? '¥' : `${item.currency} `; return `${currency}${item.unitPrice.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })}/${item.chargeUnit || 'CBM'}` } From 34cdf4fc4fdd03468baf16730cb65fe6f9122a0d Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Sat, 26 Sep 2026 22:55:32 +0800 Subject: [PATCH 16/29] fix(client): show broker execution state in customs documents --- src/modules/first-leg/api/customs.ts | 1 + src/modules/first-leg/components/CustomsDocumentsDialog.vue | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/modules/first-leg/api/customs.ts b/src/modules/first-leg/api/customs.ts index 3f70920..2245062 100644 --- a/src/modules/first-leg/api/customs.ts +++ b/src/modules/first-leg/api/customs.ts @@ -54,6 +54,7 @@ export interface MerchantCustomsContainer { inbounds: MerchantCustomsInbound[] documents: MerchantCustomsDocument[] startedAt?: string | null + brokerSubmittedAt?: string | null completedAt?: string | null } diff --git a/src/modules/first-leg/components/CustomsDocumentsDialog.vue b/src/modules/first-leg/components/CustomsDocumentsDialog.vue index b2e3477..a3860a4 100644 --- a/src/modules/first-leg/components/CustomsDocumentsDialog.vue +++ b/src/modules/first-leg/components/CustomsDocumentsDialog.vue @@ -284,7 +284,7 @@ function formatSize(bytes: number) {
-
报关资料已锁定报关开始后仅可查看和下载,不提供退回或解锁。
+
{{ detail.brokerSubmittedAt ? '已发送报关行执行' : '报关资料已锁定' }}{{ detail.brokerSubmittedAt ? '平台已将客户确认后的回执发送给报关行,等待真实报关完税文件。' : '报关开始后仅可查看和下载,不提供退回或解锁。' }}
From 20ea6adc6f2a5186bd74bdde37af2fc9887d1f6b Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Sun, 27 Sep 2026 00:09:50 +0800 Subject: [PATCH 17/29] fix(client): show only FBA warehouse code --- src/modules/first-leg/views/FirstLegOrdersView.vue | 4 ++-- src/modules/first-leg/views/QuickOrderView.vue | 2 +- src/modules/first-leg/views/SailingPricesView.vue | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/modules/first-leg/views/FirstLegOrdersView.vue b/src/modules/first-leg/views/FirstLegOrdersView.vue index d3f2a7d..5010781 100644 --- a/src/modules/first-leg/views/FirstLegOrdersView.vue +++ b/src/modules/first-leg/views/FirstLegOrdersView.vue @@ -2216,8 +2216,8 @@ async function searchOrders(model: QueryModel) {
保存当前地址停用
- 平台暂未维护可用的{{ form.destinationType === 'FBA' ? ' FBA 仓' : '海外仓' }},请联系平台管理员。 -
{{ selectedDestinationWarehouse.name }} · {{ selectedDestinationWarehouse.code }} · {{ selectedDestinationWarehouse.countryCode }}仓库地址:{{ selectedDestinationWarehouse.province }}{{ selectedDestinationWarehouse.city }} {{ selectedDestinationWarehouse.address }}联系人:{{ selectedDestinationWarehouse.contactName || '-' }} {{ selectedDestinationWarehouse.contactPhone }}
+ 平台暂未维护可用的{{ form.destinationType === 'FBA' ? ' FBA 仓' : '海外仓' }},请联系平台管理员。 +
{{ form.destinationType === 'FBA' ? selectedDestinationWarehouse.code : `${selectedDestinationWarehouse.name} · ${selectedDestinationWarehouse.code}` }} · {{ selectedDestinationWarehouse.countryCode }}仓库地址:{{ selectedDestinationWarehouse.province }}{{ selectedDestinationWarehouse.city }} {{ selectedDestinationWarehouse.address }}联系人:{{ selectedDestinationWarehouse.contactName || '-' }} {{ selectedDestinationWarehouse.contactPhone }}