Files
admin-web/src/modules/overseas-warehouse/api/inventory.ts
T
2026-10-20 14:00:49 +08:00

195 lines
6.1 KiB
TypeScript

import { http, unwrapApiResponse, type ApiEnvelope } from '@/shared/api/http'
import { normalizeOverseasPage, type OverseasPagePayload } from './lastMileOrders'
export interface InventoryBalanceDto {
id: string
customerId: string
customerName?: string | null
overseasWarehouseId: string
overseasWarehouseCode?: string | null
overseasWarehouseName?: string | null
destinationWarehouseId?: string | null
destinationWarehouseCode?: string | null
destinationWarehouseName?: string | null
inboundOrderId: string
inboundOrderNo?: string | null
inboundCode: string
skuCode?: string | null
productNameZh?: string | null
productNameEn?: string | null
totalPackages: number
availablePackages: number
holdPackages: number
allocatedPackages: number
pickedPackages: number
inTransitPackages: number
receivingPackages: number
procurementPackages: number
updatedAt?: string | null
}
export interface InventoryDashboardDto {
inboundOrderCount: number
palletCount: number
totalPackages: number
availablePackages: number
holdPackages: number
allocatedPackages: number
pickedPackages: number
inTransitPackages: number
receivingPackages: number
procurementPackages: number
}
export interface InventoryPieceGroup {
customerId: string
warehouseId: string
destinationCode: string | null
anchorSkuCode: string | null
availablePieceCount: number | string | null
knownAvailablePieceCount: number | string
unknownCartonCount: number | string
availableCartonCount: number | string
availablePalletCount: number | string
skuContents: { skuCode: string; quantity: number | string }[]
cartons: { cartonMark: string; inventoryPositionId: string; palletId: string | null; quantity: number | string | null; items: { skuCode: string; quantity: number | string }[] }[]
}
export interface InventoryPieceProjection {
availablePieceCount: number | string | null
knownAvailablePieceCount: number | string
unknownCartonCount: number | string
availableCartonCount: number | string
availablePalletCount: number | string
groups: InventoryPieceGroup[]
}
/** 完整筛选的真实可用件数及混箱全部SKU,不按记账SKU换算。 */
export async function getInventoryPieceProjection(query: InventoryBalanceQuery) {
const response = await http.get<ApiEnvelope<InventoryPieceProjection>, ApiEnvelope<InventoryPieceProjection>>(
'/platform/v1/last-leg/inventory/piece-projection', { params: params(query) },
)
return unwrapApiResponse(response)
}
export interface InventoryPositionDto {
id: string
balanceId: string
overseasWarehouseId?: string | null
destinationWarehouseCode?: string | null
inboundOrderId?: string | null
inboundOrderNo?: string | null
inboundCode?: string | null
palletId?: string | null
palletNo?: string | null
batchNo?: string | null
warehouseLocationId?: string | null
warehouseLocationCode?: string | null
totalPackages: number
availablePackages: number
holdPackages: number
allocatedPackages: number
pickedPackages: number
receivingPackages: number
status?: string | null
updatedAt?: string | null
}
export interface InventoryLedgerDto {
id: string
customerId: string
customerName?: string | null
overseasWarehouseId?: string | null
destinationWarehouseCode?: string | null
inboundOrderId?: string | null
inboundOrderNo?: string | null
inboundCode?: string | null
palletNo?: string | null
batchNo?: string | null
warehouseLocationCode?: string | null
skuCode?: string | null
businessType?: string | null
businessOrderNo?: string | null
outboundOrderNo?: string | null
statusFrom?: string | null
statusTo?: string | null
beforePackages: number
deltaPackages: number
afterPackages: number
operatorId?: string | null
remark?: string | null
occurredAt?: string | null
}
export interface InventoryBalanceQuery {
page: number
size: number
customerName?: string
overseasWarehouseId?: string
overseasWarehouseCode?: string
destinationWarehouseCode?: string
inboundOrderNo?: string
inboundCode?: string
businessOrderNo?: string
skuCode?: string
productName?: string
batchNo?: string
warehouseLocationCode?: string
inventoryStatus?: string
}
function params(query: InventoryBalanceQuery) { return { ...query } }
export async function listInventoryBalances(query: InventoryBalanceQuery) {
const response = await http.get<ApiEnvelope<OverseasPagePayload<InventoryBalanceDto>>, ApiEnvelope<OverseasPagePayload<InventoryBalanceDto>>>(
'/platform/v1/last-leg/inventory/balances', { params: params(query) },
)
return normalizeOverseasPage(unwrapApiResponse(response))
}
export async function getInventorySummary(query: InventoryBalanceQuery) {
const response = await http.get<ApiEnvelope<InventoryDashboardDto>, ApiEnvelope<InventoryDashboardDto>>(
'/platform/v1/last-leg/inventory/summary', { params: params({ ...query, page: 1, size: 200 }) },
)
return unwrapApiResponse(response)
}
export async function listInventoryPositions(
balanceId: string,
query: { palletNo?: string; batchNo?: string; inventoryStatus?: string } = {},
) {
const response = await http.get<ApiEnvelope<InventoryPositionDto[]>, ApiEnvelope<InventoryPositionDto[]>>(
`/platform/v1/last-leg/inventory/balances/${encodeURIComponent(balanceId)}/positions`,
{ params: query },
)
return unwrapApiResponse(response)
}
export interface InventoryLedgerQuery {
page: number
size: number
customerName?: string
overseasWarehouseId?: string
destinationWarehouseCode?: string
businessType?: string
businessOrderNo?: string
inboundOrderNo?: string
inboundCode?: string
outboundOrderNo?: string
palletNo?: string
batchNo?: string
skuCode?: string
warehouseLocationCode?: string
occurredFrom?: string
occurredTo?: string
}
export async function listInventoryLedger(query: InventoryLedgerQuery) {
const response = await http.get<ApiEnvelope<OverseasPagePayload<InventoryLedgerDto>>, ApiEnvelope<OverseasPagePayload<InventoryLedgerDto>>>(
'/platform/v1/last-leg/inventory/ledger',
{ params: { ...query } },
)
return normalizeOverseasPage(unwrapApiResponse(response))
}