Files
admin-web/src/modules/overseas-warehouse/components/warehouseTransferReceiptSelection.ts
T

31 lines
2.9 KiB
TypeScript

import type { WarehouseTransferDetailDto, ReceiveWarehouseTransferPayload, WarehouseTransferReceiptCommandDto } from '../api/warehouseTransfers'
import type { PalletDto, ReceivingOverseasWarehouseDto } from '../api/pallets'
import type { OverseasLocationDto } from '../api/locations'
export type ReceiptTarget = { warehouse: ReceivingOverseasWarehouseDto; pallet: PalletDto; location: OverseasLocationDto }
export function canOutboundTransfer(detail: WarehouseTransferDetailDto) {
return detail.status === 'ALLOCATED' && !!detail.fbaWarehouseCode
&& (!detail.needRelabel || (!!detail.relabelNo && ['READY_FOR_OUTBOUND', 'COMPLETED'].includes(detail.relabelStatus || '')))
&& !!detail.allocations?.length && detail.allocations.every(a => a.status === 'RESERVED')
&& detail.allocations.reduce((sum, a) => sum + a.packageCount, 0) === detail.packageCount
}
export function receiptTargetValid(detail: WarehouseTransferDetailDto, target: ReceiptTarget, previous?: WarehouseTransferReceiptCommandDto['target'] | null) {
const { warehouse: w, pallet: p, location: l } = target
const same = previous && previous.warehouseId === w.id && previous.palletId === p.id && previous.locationId === l.id
return w.warehouseType === 'OVERSEAS' && w.status === 'ACTIVE' && w.customerId === '0'
&& p.warehouseId === w.id && l.warehouseId === w.id && p.locationId === l.id && p.customerId === '0'
&& !!p.palletCode && !!l.locationCode && p.fbaWarehouseCode === detail.destinationWarehouseCode
&& (p.status === 'IDLE' || (same && p.status === 'OCCUPIED'))
&& (l.locationType === 'VIRTUAL' ? l.status === 'ACTIVE' : (l.status === 'IDLE' || (same && l.status === 'OCCUPIED')))
}
export function createReceiptCommand(detail: WarehouseTransferDetailDto, sourceId: string, target: ReceiptTarget, key: string, previous?: WarehouseTransferReceiptCommandDto['target'] | null): ReceiveWarehouseTransferPayload {
if (!['OUTBOUNDED', 'PARTIALLY_RECEIVED'].includes(detail.status)
|| !detail.allocations?.some(a => a.inventoryPositionId === sourceId && a.status === 'SHIPPED')
|| !detail.destinationWarehouseCode || !receiptTargetValid(detail, target, previous)) throw new Error('来源或目标收货资源不符合本票要求,请重新核对')
return { sourceInventoryPositionId: sourceId, destinationOverseasWarehouseId: target.warehouse.id,
destinationOverseasWarehouseCode: target.warehouse.warehouseCode, destinationOverseasWarehouseName: target.warehouse.warehouseName,
destinationWarehouseId: detail.destinationWarehouseId || undefined, destinationWarehouseCode: detail.destinationWarehouseCode,
destinationWarehouseName: detail.destinationWarehouseName || undefined, destinationPalletId: target.pallet.id, destinationPalletNo: target.pallet.palletCode,
warehouseLocationId: target.location.id, warehouseLocationCode: target.location.locationCode, batchNo: detail.transferNo, idempotencyKey: key }
}