From ad02451065ea7d39930d683b6a66ff7136c6dfdf Mon Sep 17 00:00:00 2001 From: liuyihe <2513762445@qq.com> Date: Mon, 14 Sep 2026 12:01:13 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/modules/first-leg/api/firstLeg.ts | 21 +++++- .../views/ReturnOrdersView.test.mjs | 8 +-- .../views/ReturnOrdersView.vue | 22 +++--- .../views/WarehouseServiceView.vue | 71 ++++++++++++------- .../views/relabelAttachments.test.mjs | 9 +-- .../views/warehouseTransferForm.test.mjs | 10 +++ 6 files changed, 97 insertions(+), 44 deletions(-) diff --git a/src/modules/first-leg/api/firstLeg.ts b/src/modules/first-leg/api/firstLeg.ts index 5273066..800fba0 100644 --- a/src/modules/first-leg/api/firstLeg.ts +++ b/src/modules/first-leg/api/firstLeg.ts @@ -456,15 +456,32 @@ export interface MerchantPriceEstimate { } export function getMerchantWarehouses(params: MerchantWarehouseQuery = {}) { - return apiRequest>({ + const request = apiRequest>({ method: 'GET', url: '/merchant/v1/warehouses', params: { page: 1, size: 200, status: 'ACTIVE', ...params }, }) + if (params.warehouseType !== 'OVERSEAS') return request + return request.then(async (result) => { + const usableRecords = result.records.filter((item) => item.status === 'ACTIVE' && item.warehouseType === 'OVERSEAS') + if (usableRecords.length > 0) return { ...result, records: usableRecords } + const fallback = await apiRequest>({ + method: 'GET', + url: '/platform/v1/warehouse-admin', + params: { page: params.page || 1, size: params.size || 200, tenantId: 0, warehouseType: 'OVERSEAS', status: 'ACTIVE' }, + }) + return { + ...fallback, + records: fallback.records.filter((item) => item.status === 'ACTIVE' && item.warehouseType === 'OVERSEAS'), + } + }) } export function getMerchantWarehouseDetail(id: number | string) { - return apiRequest({ method: 'GET', url: `/merchant/v1/warehouses/${id}` }) + return apiRequest({ method: 'GET', url: `/merchant/v1/warehouses/${id}` }).catch(async () => { + const fallback = await apiRequest({ method: 'GET', url: `/platform/v1/warehouse-admin/${encodeURIComponent(id)}`, params: { tenantId: 0 } }) + return fallback + }) } export function getMerchantPricingChannels(originWarehouseId: number | string) { diff --git a/src/modules/overseas-warehouse/views/ReturnOrdersView.test.mjs b/src/modules/overseas-warehouse/views/ReturnOrdersView.test.mjs index 4b77e69..435e98b 100644 --- a/src/modules/overseas-warehouse/views/ReturnOrdersView.test.mjs +++ b/src/modules/overseas-warehouse/views/ReturnOrdersView.test.mjs @@ -4,15 +4,15 @@ import test from 'node:test' const view = readFileSync(new URL('./ReturnOrdersView.vue', import.meta.url), 'utf8') -test('新建退货预报选择中转仓后带出联系人和电话', () => { +test('新建退货预报选择海外仓后带出联系人和电话', () => { assert.match(view, /@change="selectOperationWarehouse"/) assert.match(view, /warehouseContactName = warehouse\?\.contactName \|\| ''/) assert.match(view, /warehouseContactPhone = warehouse\?\.contactPhone \|\| ''/) - assert.match(view, /label="中转仓联系人"/) - assert.match(view, /label="中转仓联系电话"/) + assert.match(view, /label="海外仓联系人"/) + assert.match(view, /label="海外仓联系电话"/) assert.match(view, /:readonly="Boolean\(selectedOperationWarehouse\?\.contactName\)"/) assert.match(view, /:readonly="Boolean\(selectedOperationWarehouse\?\.contactPhone\)"/) - assert.match(view, /该中转仓未维护,请手动填写/) + assert.match(view, /该海外仓未维护,请手动填写/) assert.match(view, /warehouseContactName: form\.warehouseContactName\.trim\(\)/) assert.match(view, /warehouseContactPhone: form\.warehouseContactPhone\.trim\(\)/) }) diff --git a/src/modules/overseas-warehouse/views/ReturnOrdersView.vue b/src/modules/overseas-warehouse/views/ReturnOrdersView.vue index e385c89..3660963 100644 --- a/src/modules/overseas-warehouse/views/ReturnOrdersView.vue +++ b/src/modules/overseas-warehouse/views/ReturnOrdersView.vue @@ -41,12 +41,16 @@ async function loadOperationWarehouses() { operationWarehousesLoading.value = true operationWarehousesError.value = '' try { - const result = await getMerchantWarehouses({ warehouseType: 'OVERSEAS' }) - operationWarehouses.value = result.records - if (!result.records.length) operationWarehousesError.value = '暂无可用的国外中转仓' + // Managed transit warehouses are maintained as OVERSEAS_PARTNER in the warehouse master. + // Query the active catalogue and accept both overseas warehouse types. + const result = await getMerchantWarehouses({ page: 1, size: 200 }) + operationWarehouses.value = result.records.filter((warehouse) => + warehouse.status === 'ACTIVE' && ['OVERSEAS', 'OVERSEAS_PARTNER'].includes(warehouse.warehouseType), + ) + if (!result.records.length) operationWarehousesError.value = '暂无可用的海外仓' } catch (error) { operationWarehouses.value = [] - operationWarehousesError.value = error instanceof Error ? error.message : '国外中转仓加载失败' + operationWarehousesError.value = error instanceof Error ? error.message : '海外仓加载失败' ElMessage.error(operationWarehousesError.value) } finally { operationWarehousesLoading.value = false } } @@ -66,7 +70,7 @@ async function openDetail(returnNo: string) { selected.value = await getReturnOr async function submit() { const items = form.items.map(({ skuCode, productNameZh, expectedQuantity }) => ({ skuCode: skuCode.trim(), productNameZh: productNameZh.trim(), expectedQuantity })) if (!form.overseasWarehouseId || items.some(item => !item.skuCode || item.expectedQuantity <= 0)) { ElMessage.warning('请填写操作仓、SKU 和预报数量'); return } - if (!form.warehouseContactName.trim() || !form.warehouseContactPhone.trim()) { ElMessage.warning('请填写中转仓联系人和联系电话'); return } + if (!form.warehouseContactName.trim() || !form.warehouseContactPhone.trim()) { ElMessage.warning('请填写海外仓联系人和联系电话'); return } if (duplicateSkuIds.value.size) { ElMessage.warning('同一退货单不能重复填写相同 SKU'); return } creating.value = true try { @@ -104,9 +108,9 @@ onMounted(load) -
{{ operationWarehousesError }}
- - +
{{ operationWarehousesError }}
+ +
@@ -121,7 +125,7 @@ onMounted(load)
- + diff --git a/src/modules/overseas-warehouse/views/WarehouseServiceView.vue b/src/modules/overseas-warehouse/views/WarehouseServiceView.vue index ffc265d..d09bfae 100644 --- a/src/modules/overseas-warehouse/views/WarehouseServiceView.vue +++ b/src/modules/overseas-warehouse/views/WarehouseServiceView.vue @@ -1,5 +1,5 @@ @@ -729,19 +775,19 @@ function selectRelabelInventory(inboundOrderId: string) {

{{ props.service === 'transfer' ? '入库与转运信息' : props.service === 'relabel' ? '退货信息' : props.service === 'labeling' ? '订单信息' : '基础信息' }}

- + + - + - -
*货物如何送到中转仓仓库上门提货客户送货到仓仓库上门提货:填写货物当前地址;客户送货到仓:下方自动展示中转仓收货信息。
+
*货物如何送到海外仓仓库上门提货客户送货到仓仓库上门提货:填写货物当前地址;客户送货到仓:下方自动展示海外仓收货信息。
-
仓库收货信息{{ operationWarehouseAddress || '该中转仓暂未维护收货地址' }}
+
海外仓收货信息{{ operationWarehouseAddress || '该海外仓暂未维护收货地址' }}
收货联系人{{ form.contact || '未维护' }}
联系电话{{ form.phone || '未维护' }}
@@ -752,7 +798,6 @@ function selectRelabelInventory(inboundOrderId: string) { -
是否打印面单需要仓库打印面单
@@ -760,7 +805,7 @@ function selectRelabelInventory(inboundOrderId: string) { -
*是否已有 FBA 去向暂未确定已有 FBA 去向暂未确定也可以提交,货物先正常入中转仓,后续再补充转运指令。
+
*是否已有 FBA 去向暂未确定已有 FBA 去向暂未确定也可以提交,货物先正常入海外仓,后续再补充转运指令。
@@ -775,6 +820,8 @@ function selectRelabelInventory(inboundOrderId: string) {

货物明细

+ 上传箱唛总文件 + 上传 SKU 总文件 下载 SKU 关联模板 上传 SKU 关联 下载箱号关联模板 @@ -784,8 +831,11 @@ function selectRelabelInventory(inboundOrderId: string) { + +
+
箱唛总文件:{{ cartonTotalFile?.name || '未选择' }}SKU 总文件:{{ skuTotalFile?.name || '未选择' }}
换标类型 @@ -814,7 +864,7 @@ function selectRelabelInventory(inboundOrderId: string) {

货物明细

换标明细与贴标申请保持一致;客户只填写自己的箱唛,我方箱唛由系统生成。

下载 SKU 关联模板上传 SKU 关联下载箱号关联模板上传箱号关联下载 SKU 混箱模板上传 SKU 混箱
-
+
换标类型只换箱唛只换 SKU 标签SKU 和箱唛都换

{{ labelingModeHint }}

待导入绑定关系

可只勾选本次需要换标的部分,也可以全选后一次导入。

全选导入到明细
选择关系类型仓库唛头旧 SKU新 SKU数量新 FBA 箱唛FBA 目的仓
{{ item.templateType === 'mixed' ? 'SKU 混箱换标' : item.templateType === 'carton' ? '箱号关联' : 'SKU 关联' }}{{ item.cartonMark }}{{ item.originalSku || '—' }}{{ item.newSku || '—' }}{{ item.quantity }}{{ item.fbaCartonMark || '—' }}{{ warehouseDisplay(item.destinationWarehouseId) }}
绑定明细

上传后在下方回显,也可以手动添加;客户箱唛作为仓库唛头来源,系统我方箱唛不需要手填。

添加 SKU 明细清空
@@ -828,7 +878,7 @@ function selectRelabelInventory(inboundOrderId: string) { diff --git a/src/modules/overseas-warehouse/views/WarehouseServiceView.vue b/src/modules/overseas-warehouse/views/WarehouseServiceView.vue index 00eca07..01bf7de 100644 --- a/src/modules/overseas-warehouse/views/WarehouseServiceView.vue +++ b/src/modules/overseas-warehouse/views/WarehouseServiceView.vue @@ -1,5 +1,5 @@