This commit is contained in:
2026-08-07 19:23:43 +08:00
parent 38a0ffd3e3
commit 28d0b81c5a
12 changed files with 627 additions and 470 deletions
@@ -1,82 +0,0 @@
import { beforeEach, describe, expect, it, vi } from 'vitest'
const http = vi.hoisted(() => ({
get: vi.fn(),
post: vi.fn(),
delete: vi.fn(),
}))
vi.mock('@/shared/api/http', () => ({
http,
unwrapApiResponse: <T>(response: { data: T }) => response.data,
}))
import {
createCustomerPricingRuleVersion,
disableCustomerPricingRule,
getCustomerPricingRule,
listCustomerPricingRules,
} from './api'
const rawRule = {
id: 9007199254740993n.toString(),
tenantId: 10001,
ruleCode: 'FBA-TAX-KG',
customerId: 20002,
customerName: '测试企业',
businessType: 'FBA',
chargeMode: 'KG',
taxMode: 'TAX_INCLUDED',
conversionFactor: 167,
roundingScale: 3,
roundingMode: 'CEILING',
currency: 'CNY',
effectiveFrom: '2026-08-04T00:00:00',
effectiveTo: null,
ruleVersion: 1,
status: 'ACTIVE',
remark: null,
createdAt: null,
updatedAt: null,
}
describe('customer pricing rules api', () => {
beforeEach(() => vi.clearAllMocks())
it('omits an empty customer scope and rule code for the all-customer list', async () => {
http.get.mockResolvedValue({ data: [rawRule] })
await listCustomerPricingRules({ tenantId: ' ', ruleCode: ' ' })
expect(http.get).toHaveBeenCalledWith('/platform/v1/fba-pricing/customer-rules', { params: {} })
})
it('keeps every long id as a string and sends the real list query', async () => {
http.get.mockResolvedValue({ data: [rawRule] })
const result = await listCustomerPricingRules({ tenantId: '10001', ruleCode: ' FBA ' })
expect(http.get).toHaveBeenCalledWith('/platform/v1/fba-pricing/customer-rules', {
params: { tenantId: '10001', ruleCode: 'FBA' },
})
expect(result[0]).toMatchObject({ id: '9007199254740993', tenantId: '10001', customerId: '20002' })
})
it('uses detail, version creation and disable endpoints from the controller', async () => {
http.get.mockResolvedValue({ data: rawRule })
http.post.mockResolvedValue({ data: rawRule })
http.delete.mockResolvedValue({ data: null })
await getCustomerPricingRule('10001', '9')
await createCustomerPricingRuleVersion('10001', {
ruleCode: 'FBA-TAX-KG', customerId: '20002', customerName: '测试企业', businessType: 'FBA',
chargeMode: 'KG', taxMode: 'TAX_INCLUDED', conversionFactor: 167, roundingScale: 3,
roundingMode: 'CEILING', currency: 'CNY', effectiveFrom: '2026-08-04T00:00:00',
})
await disableCustomerPricingRule('10001', '9')
expect(http.get).toHaveBeenCalledWith('/platform/v1/fba-pricing/customer-rules/9', { params: { tenantId: '10001' } })
expect(http.post).toHaveBeenCalledWith('/platform/v1/fba-pricing/customer-rules/versions', expect.any(Object), { params: { tenantId: '10001' } })
expect(http.delete).toHaveBeenCalledWith('/platform/v1/fba-pricing/customer-rules/9', { params: { tenantId: '10001' } })
})
})
@@ -1,59 +0,0 @@
import { http, unwrapApiResponse, type ApiEnvelope } from '@/shared/api/http'
import type {
CreateCustomerRuleVersionRequest,
CustomerPricingRule,
CustomerRuleQuery,
} from './types'
type RawRule = Omit<CustomerPricingRule, 'id' | 'tenantId' | 'customerId'> & {
id: string | number
tenantId: string | number
customerId: string | number
}
function normalizeRule(rule: RawRule): CustomerPricingRule {
return {
...rule,
id: String(rule.id),
tenantId: String(rule.tenantId),
customerId: String(rule.customerId),
}
}
export async function listCustomerPricingRules(query: CustomerRuleQuery): Promise<CustomerPricingRule[]> {
const tenantId = query.tenantId?.trim()
const ruleCode = query.ruleCode?.trim()
const response = await http.get<never, ApiEnvelope<RawRule[]>>('/platform/v1/fba-pricing/customer-rules', {
params: {
...(tenantId ? { tenantId } : {}),
...(ruleCode ? { ruleCode } : {}),
},
})
return unwrapApiResponse(response).map(normalizeRule)
}
export async function getCustomerPricingRule(tenantId: string, id: string): Promise<CustomerPricingRule> {
const response = await http.get<never, ApiEnvelope<RawRule>>(`/platform/v1/fba-pricing/customer-rules/${id}`, {
params: { tenantId },
})
return normalizeRule(unwrapApiResponse(response))
}
export async function createCustomerPricingRuleVersion(
tenantId: string,
request: CreateCustomerRuleVersionRequest,
): Promise<CustomerPricingRule> {
const response = await http.post<never, ApiEnvelope<RawRule>>(
'/platform/v1/fba-pricing/customer-rules/versions',
request,
{ params: { tenantId } },
)
return normalizeRule(unwrapApiResponse(response))
}
export async function disableCustomerPricingRule(tenantId: string, id: string): Promise<void> {
const response = await http.delete<never, ApiEnvelope<unknown>>(`/platform/v1/fba-pricing/customer-rules/${id}`, {
params: { tenantId },
})
unwrapApiResponse(response)
}
@@ -1,49 +0,0 @@
export type CustomerRuleChargeMode = 'KG' | 'CBM'
export type CustomerRuleStatus = 'ACTIVE' | 'INACTIVE' | string
export interface CustomerPricingRule {
id: string
tenantId: string
ruleCode: string
customerId: string
customerName: string
businessType: string
chargeMode: CustomerRuleChargeMode
taxMode: string
conversionFactor: number
roundingScale: number
roundingMode: string
currency: string
effectiveFrom: string
effectiveTo: string | null
ruleVersion: number | null
status: CustomerRuleStatus
remark: string | null
createdAt: string | null
updatedAt: string | null
}
export interface CustomerRuleQuery {
tenantId?: string
ruleCode?: string
}
export interface CreateCustomerRuleVersionRequest {
ruleCode: string
customerId: string
customerName: string
businessType: string
chargeMode: CustomerRuleChargeMode
taxMode: string
conversionFactor: number
roundingScale: number
roundingMode: string
currency: string
effectiveFrom: string
effectiveTo?: string | null
remark?: string | null
}
export interface CustomerRuleFormModel extends CreateCustomerRuleVersionRequest {
customerId: string
}
-14
View File
@@ -1,14 +0,0 @@
export {
createCustomerPricingRuleVersion,
disableCustomerPricingRule,
getCustomerPricingRule,
listCustomerPricingRules,
} from './customer-rules/api'
export type {
CreateCustomerRuleVersionRequest,
CustomerPricingRule,
CustomerRuleChargeMode,
CustomerRuleFormModel,
CustomerRuleStatus,
} from './customer-rules/types'