feat: 支持客户专属头程报价
This commit is contained in:
@@ -20,6 +20,7 @@ import {
|
||||
|
||||
const version = {
|
||||
id: '9007199254740995',
|
||||
customerId: '2096953508805279745',
|
||||
versionNo: '2',
|
||||
originalFileName: '2026-08-price-book.xlsx',
|
||||
sourceFileId: '9007199254740996',
|
||||
@@ -88,16 +89,17 @@ const detail = {
|
||||
describe('platform price-book API', () => {
|
||||
beforeEach(() => vi.clearAllMocks())
|
||||
|
||||
it('uses the platform price-book list endpoint without customer scope and preserves long ids', async () => {
|
||||
it('uses the selected customer price-book scope and preserves long ids', async () => {
|
||||
http.get.mockResolvedValue({ data: [version] })
|
||||
|
||||
const result = await listPlatformPriceBooks({ status: ' PENDING_CONFIRMATION ' })
|
||||
const result = await listPlatformPriceBooks({ customerId: '2096953508805279745', status: ' PENDING_CONFIRMATION ' })
|
||||
|
||||
expect(http.get).toHaveBeenCalledWith('/platform/v1/fba-pricing/carrier-rates/price-books', {
|
||||
params: { status: 'PENDING_CONFIRMATION' },
|
||||
params: { customerId: '2096953508805279745', status: 'PENDING_CONFIRMATION' },
|
||||
})
|
||||
expect(result[0]).toMatchObject({
|
||||
id: '9007199254740995',
|
||||
customerId: '2096953508805279745',
|
||||
sourceFileId: '9007199254740996',
|
||||
createdBy: '10001',
|
||||
versionNo: 2,
|
||||
@@ -105,12 +107,12 @@ describe('platform price-book API', () => {
|
||||
})
|
||||
})
|
||||
|
||||
it('omits an empty status filter for the complete version history', async () => {
|
||||
it('defaults an empty scope to the public price-book history', async () => {
|
||||
http.get.mockResolvedValue({ data: [] })
|
||||
|
||||
await listPlatformPriceBooks({ status: ' ' })
|
||||
|
||||
expect(http.get).toHaveBeenCalledWith('/platform/v1/fba-pricing/carrier-rates/price-books', { params: {} })
|
||||
expect(http.get).toHaveBeenCalledWith('/platform/v1/fba-pricing/carrier-rates/price-books', { params: { customerId: '0' } })
|
||||
})
|
||||
|
||||
it('uploads one workbook, loads its parsed detail, and normalizes parsed rows', async () => {
|
||||
@@ -118,10 +120,12 @@ describe('platform price-book API', () => {
|
||||
http.get.mockResolvedValue({ data: detail })
|
||||
const file = new File(['book'], 'price-book.xlsx', { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
|
||||
|
||||
const uploadResult = await uploadPlatformPriceBook(file)
|
||||
const uploadResult = await uploadPlatformPriceBook(file, '2096953508805279745')
|
||||
const detailResult = await getPlatformPriceBook('9007199254740995')
|
||||
|
||||
expect(http.post).toHaveBeenCalledWith('/platform/v1/fba-pricing/carrier-rates/price-books', expect.any(FormData))
|
||||
expect(http.post).toHaveBeenCalledWith('/platform/v1/fba-pricing/carrier-rates/price-books', expect.any(FormData), {
|
||||
params: { customerId: '2096953508805279745' },
|
||||
})
|
||||
const form = http.post.mock.calls[0][1] as FormData
|
||||
expect(form.get('file')).toBe(file)
|
||||
expect(http.get).toHaveBeenCalledWith('/platform/v1/fba-pricing/carrier-rates/price-books/9007199254740995')
|
||||
|
||||
@@ -11,6 +11,7 @@ type ApiNumber = string | number
|
||||
|
||||
export interface PlatformPriceBookVersion {
|
||||
id: string
|
||||
customerId: string
|
||||
versionNo: number
|
||||
originalFileName: string
|
||||
sourceFileId: string | null
|
||||
@@ -96,12 +97,14 @@ export interface PriceBookConfirmationRequest {
|
||||
}
|
||||
|
||||
export interface PlatformPriceBookQuery {
|
||||
customerId?: string
|
||||
status?: PriceBookStatus | string
|
||||
}
|
||||
|
||||
interface PriceBookVersionPayload extends Omit<PlatformPriceBookVersion,
|
||||
'id' | 'versionNo' | 'sourceFileId' | 'channelCount' | 'rateCount' | 'blockingErrorCount' | 'warningCount' | 'createdBy' | 'publishedBy'> {
|
||||
'id' | 'customerId' | 'versionNo' | 'sourceFileId' | 'channelCount' | 'rateCount' | 'blockingErrorCount' | 'warningCount' | 'createdBy' | 'publishedBy'> {
|
||||
id: ApiId
|
||||
customerId: ApiId
|
||||
versionNo: ApiNumber
|
||||
sourceFileId?: ApiId | null
|
||||
channelCount?: ApiNumber | null
|
||||
@@ -165,6 +168,7 @@ function normalizeVersion(value: PriceBookVersionPayload): PlatformPriceBookVers
|
||||
return {
|
||||
...value,
|
||||
id: String(value.id),
|
||||
customerId: String(value.customerId),
|
||||
versionNo: numberValue(value.versionNo),
|
||||
sourceFileId: nullableId(value.sourceFileId),
|
||||
channelCount: numberValue(value.channelCount),
|
||||
@@ -233,8 +237,9 @@ function normalizeDetail(value: PriceBookDetailPayload): PlatformPriceBookDetail
|
||||
|
||||
export async function listPlatformPriceBooks(query: PlatformPriceBookQuery = {}): Promise<PlatformPriceBookVersion[]> {
|
||||
const status = query.status?.trim()
|
||||
const customerId = query.customerId?.trim() || '0'
|
||||
const response = await http.get<ApiEnvelope<PriceBookVersionPayload[]>, ApiEnvelope<PriceBookVersionPayload[]>>(basePath, {
|
||||
params: status ? { status } : {},
|
||||
params: status ? { customerId, status } : { customerId },
|
||||
})
|
||||
return unwrapApiResponse(response).map(normalizeVersion)
|
||||
}
|
||||
@@ -246,10 +251,12 @@ export async function getPlatformPriceBook(versionId: string): Promise<PlatformP
|
||||
return normalizeDetail(unwrapApiResponse(response))
|
||||
}
|
||||
|
||||
export async function uploadPlatformPriceBook(file: File): Promise<PlatformPriceBookDetail> {
|
||||
export async function uploadPlatformPriceBook(file: File, customerId = '0'): Promise<PlatformPriceBookDetail> {
|
||||
const form = new FormData()
|
||||
form.append('file', file)
|
||||
const response = await http.post<ApiEnvelope<PriceBookDetailPayload>, ApiEnvelope<PriceBookDetailPayload>>(basePath, form)
|
||||
const response = await http.post<ApiEnvelope<PriceBookDetailPayload>, ApiEnvelope<PriceBookDetailPayload>>(basePath, form, {
|
||||
params: { customerId: customerId.trim() || '0' },
|
||||
})
|
||||
return normalizeDetail(unwrapApiResponse(response))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user