Merge branch 'main' into dev

This commit is contained in:
2026-11-03 10:33:10 +08:00
121 changed files with 5265 additions and 1629 deletions
+27 -11
View File
@@ -64,17 +64,6 @@ export function applyAdminTemplateProductBootstrap(payload?: {
)
}
export function syncAdminWorkOrderTemplateCostVersions() {
return apiPost<{
ruleCount: number
unitPriceRuleCount: number
activeVersionCount: number
createdCount: number
retiredCount: number
linkedSnapshotCount: number
}>('/api/v1/admin/cost-center/work-order-template-costs/sync')
}
export function backfillAdminWorkOrderProductSkus(payload?: {
dateFrom?: string
dateTo?: string
@@ -107,6 +96,32 @@ export function createAdminProductCatalog(payload: Record<string, unknown>) {
return apiPost<{ product: ProductCatalogItem }>('/api/v1/admin/cost-center/products', payload)
}
export function archiveAdminHistoricalManualProducts(payload: { execute?: boolean } = {}) {
return apiPost<{
dryRun: boolean
candidateCount: number
archivedCount: number
sample: Array<{ id: number; canonical_sku: string; canonical_name: string }>
}>('/api/v1/admin/cost-center/products/archive-historical-manual', payload)
}
export function archiveAdminSupersededManualProducts(payload: { execute?: boolean } = {}) {
return apiPost<{
dryRun: boolean
candidateCount: number
archivedCount: number
repointedChannelCount: number
sample: Array<{
id: number
canonical_sku: string
canonical_name: string
primary_channel: string
target_product_id: number
target_product_sku: string
}>
}>('/api/v1/admin/cost-center/products/archive-superseded-manual', payload)
}
export function syncAdminAffiliateDashProducts() {
return apiPost<{ createdCount: number; updatedCount: number; productCount: number }>(
'/api/v1/admin/cost-center/affiliate-products/sync',
@@ -494,6 +509,7 @@ export function setAdminProductPrice(
costVersionId: number
amountFen: number
effectiveFrom: string
pricingMode?: 'fixed' | 'unit'
syncedOrders?: {
candidateCount: number
updatedCount: number
@@ -24,15 +24,20 @@ export type PendingChannelGroupListResult = {
/** 渠道规则(L1)。 */
export type ChannelRule = {
id: number
provider: string
shop_id: string
match_key_type: 'sku_code' | 'internal_sku' | 'sku_name'
match_key_type: 'internal_sku'
match_key: string
channel: 'work_order' | 'affiliate_dash' | 'third_party_voucher' | 'manual'
priority: number
enabled: boolean
}
export type ChannelRuleListResult = {
items: ChannelRule[]
total: number
page: number
pageSize: number
}
export type ChannelException = {
id: number
reason: string
@@ -100,7 +105,10 @@ export function assignChannelBySku(payload: {
channel: string
note?: string
}) {
return apiPost<{ updated: number }>('/api/v1/admin/fulfillment/assign', payload)
return apiPost<{ updated: number; carrierFailed: number; ruleCreated: boolean }>(
'/api/v1/admin/fulfillment/assign',
payload,
)
}
export function assignChannelToItems(payload: {
@@ -108,17 +116,32 @@ export function assignChannelToItems(payload: {
channel: string
note?: string
}) {
return apiPost<{ updated: number }>('/api/v1/admin/fulfillment/assign', payload)
return apiPost<{ updated: number; carrierFailed: number }>(
'/api/v1/admin/fulfillment/assign',
payload,
)
}
export function fetchChannelRules(params: { channel?: string } = {}) {
return apiGet<ChannelRule[]>('/api/v1/admin/fulfillment/rules', params)
export function switchChannelForItems(payload: {
orderItemIds: number[]
channel: string
note?: string
}) {
return apiPost<{
switched: number
failed: number
errors: Array<{ orderItemId: number; reason: string }>
}>('/api/v1/admin/fulfillment/switch', payload)
}
export function fetchChannelRules(
params: { channel?: string; page?: number; pageSize?: number } = {},
) {
return apiGet<ChannelRuleListResult>('/api/v1/admin/fulfillment/rules', params)
}
export function saveChannelRule(payload: {
id?: number
provider?: string
shopId?: string
matchKeyType: string
matchKey: string
channel: string
@@ -133,6 +156,14 @@ export function deleteChannelRule(ruleId: number) {
return apiDelete<{ deleted: boolean }>(`/api/v1/admin/fulfillment/rules/${ruleId}`)
}
export function deleteChannelRules(ids: number[]) {
return apiPost<{
deletedCount: number
deletedIds: number[]
missingIds: number[]
}>('/api/v1/admin/fulfillment/rules/batch-delete', { ids })
}
export function fetchPipelineStatus() {
return apiGet<FinancePipelineStatus[]>('/api/v1/admin/fulfillment/pipeline/status')
}
@@ -291,8 +291,7 @@ export function saveAdminWorkProductRule(payload: {
categoryId?: number
enabled?: boolean
autoCreate?: boolean
rewardAmount?: number
unitPrice?: number
pricingMode?: 'fixed' | 'unit'
sharingEnabled?: boolean
sharingAutoFromOrder?: boolean
sharingTotalQuantity?: number
@@ -306,7 +305,12 @@ export function saveAdminWorkProductRule(payload: {
fieldsText?: string
sortOrder?: number
}) {
return apiPost<{ rule: WorkProductRule }>('/api/v1/admin/worker-platform/product-rules', payload)
return apiPost<{
rule: WorkProductRule
productId?: number
productStatus?: 'active' | 'archived'
costConfigurationRequired?: boolean
}>('/api/v1/admin/worker-platform/product-rules', payload)
}
export function syncAdminWorkProductRulePrice(ruleId: number) {