This commit is contained in:
2026-08-06 14:55:13 +08:00
parent 85ca013928
commit e33d620d87
5 changed files with 90 additions and 14 deletions
@@ -26,7 +26,7 @@ test('maps transport and status fields instead of treating container mode as tra
test('prefers unified reads and only falls back to the real legacy API when C02 is unavailable', () => {
assert.match(storeSource, /orders\.value = \[\]/)
assert.match(storeSource, /warehouses\.value = \[\]/)
assert.match(storeSource, /Promise\.allSettled\(\[getOrdersForClient\(query\), getMerchantWarehouses\(\)\]\)/)
assert.match(storeSource, /Promise\.allSettled\(\[getOrdersForClient\(query\), loadWarehouseType\('DOMESTIC', true\)\]\)/)
assert.match(storeSource, /getMerchantUnifiedOrders\(unifiedQuery\)/)
assert.match(storeSource, /isUnifiedOrderQueryUnavailable\(error\)/)
assert.match(storeSource, /getMerchantFirstLegOrders\(legacyQuery\(query\)\)/)
@@ -83,6 +83,11 @@ test('sends backend-required channel, customs, destination and cargo fields', ()
})
test('separates domestic receiving warehouses from public destinations', () => {
assert.match(apiSource, /warehouseType\?: MerchantWarehouseType/)
assert.match(apiSource, /params: \{ page: 1, size: 200, status: 'ACTIVE', \.\.\.params \}/)
assert.match(storeSource, /getMerchantWarehouses\(\{ warehouseType: warehouseType as MerchantWarehouseType, page, size: 200 \}\)/)
assert.match(storeSource, /while \(page <= pages\)/)
assert.match(storeSource, /loadWarehouseType\('DOMESTIC', true\)/)
assert.match(storeSource, /warehouse\.warehouseType !== 'DOMESTIC'/)
assert.match(storeSource, /item\.warehouseType === draft\.destinationType/)
assert.match(storeSource, /draft\.amazonWarehouseCode = draft\.destinationType === 'FBA' \? destinationWarehouse\.code : ''/)
+41 -9
View File
@@ -14,6 +14,7 @@ import {
type MerchantFirstLegOrder,
type MerchantFirstLegOrderDetail,
type MerchantWarehouse,
type MerchantWarehouseType,
} from '@/modules/first-leg/api/firstLeg'
import {
getMerchantUnifiedOrder,
@@ -386,27 +387,58 @@ export const useFirstLegOrdersStore = defineStore('client-first-leg-orders', ()
const loadError = ref('')
const warehouseLoadError = ref('')
const draftLoadError = ref('')
const loadedWarehouseTypes = ref<ClientWarehouseType[]>([])
const warehouseTypeRequests = new Map<ClientWarehouseType, Promise<ClientWarehouse[]>>()
const activeCount = computed(() => orders.value.filter((item) => item.status !== 'DRAFT' && item.status !== 'DELIVERED').length)
const pendingCount = computed(() => orders.value.filter((item) => item.status === 'PENDING_REVIEW').length)
function getById(id: string) { return orders.value.find((item) => item.id === id) }
async function loadWarehouseType(warehouseType: ClientWarehouseType, force = false) {
if (!force && loadedWarehouseTypes.value.includes(warehouseType)) return
const pending = warehouseTypeRequests.get(warehouseType)
if (pending) return pending
const request = (async () => {
let page = 1
const records: MerchantWarehouse[] = []
let pages = 1
do {
const response = await getMerchantWarehouses({ warehouseType: warehouseType as MerchantWarehouseType, page, size: 200 })
records.push(...response.records)
pages = Number(response.pages) || page
page += 1
} while (page <= pages)
return records
.filter((item) => item.status === 'ACTIVE' && item.warehouseType === warehouseType)
.map(mapWarehouse)
})()
warehouseTypeRequests.set(warehouseType, request)
try {
const nextWarehouses = await request
warehouses.value = [...warehouses.value.filter((item) => item.warehouseType !== warehouseType), ...nextWarehouses]
loadedWarehouseTypes.value = [...loadedWarehouseTypes.value.filter((item) => item !== warehouseType), warehouseType]
} catch (error) {
if (warehouseType === 'DOMESTIC') warehouseLoadError.value = error instanceof Error ? error.message : '公共仓库数据加载失败'
throw error
} finally {
if (warehouseTypeRequests.get(warehouseType) === request) warehouseTypeRequests.delete(warehouseType)
}
}
async function load(query: ClientOrderReadQuery = {}) {
loading.value = true
loadedFromApi.value = true
loadError.value = ''
warehouseLoadError.value = ''
draftLoadError.value = ''
loadedWarehouseTypes.value = []
warehouseTypeRequests.clear()
orders.value = []
warehouses.value = []
const [orderResult, warehouseResult] = await Promise.allSettled([getOrdersForClient(query), getMerchantWarehouses()])
if (warehouseResult.status === 'fulfilled') {
warehouses.value = warehouseResult.value.records
.filter((item) => item.status === 'ACTIVE' && ['DOMESTIC', 'FBA', 'OVERSEAS'].includes(item.warehouseType))
.map(mapWarehouse)
} else {
warehouseLoadError.value = warehouseResult.reason instanceof Error ? warehouseResult.reason.message : '公共仓库数据加载失败'
}
const [orderResult, warehouseResult] = await Promise.allSettled([getOrdersForClient(query), loadWarehouseType('DOMESTIC', true)])
if (warehouseResult.status === 'rejected' && !warehouseLoadError.value) warehouseLoadError.value = warehouseResult.reason instanceof Error ? warehouseResult.reason.message : '公共仓库数据加载失败'
if (orderResult.status === 'fulfilled') {
if (orderResult.value.source === 'unified') {
draftLoadError.value = orderResult.value.draftError
@@ -494,5 +526,5 @@ export const useFirstLegOrdersStore = defineStore('client-first-leg-orders', ()
return loadUnifiedDetail(order.id)
}
return { orders, warehouses, loading, loadedFromApi, loadError, warehouseLoadError, draftLoadError, activeCount, pendingCount, getById, load, loadDetail, loadWarehouseDetail, saveDraft, submit }
return { orders, warehouses, loading, loadedFromApi, loadError, warehouseLoadError, draftLoadError, activeCount, pendingCount, getById, load, loadDetail, loadWarehouseDetail, loadWarehouseType, saveDraft, submit }
})