feat(fulfillment): 增加统一结算与多渠道人工履约

This commit is contained in:
yml2213
2026-11-05 16:14:56 +08:00
parent 548070c2ad
commit 4e83dbb84c
43 changed files with 1582 additions and 334 deletions
@@ -378,8 +378,11 @@ export function scanAdminManualSkus(payload: { fromDate: string; toDate: string
export function saveAdminManualConfig(payload: {
skuKey: string
platformKey: string
creditQuantity: number
channels: Array<{
platformKey: string
creditQuantity: number
enabled?: boolean
}>
canonicalProductId?: number | null
enabled?: boolean
note?: string
@@ -493,6 +496,7 @@ export function fetchAdminManualFulfillmentPending(
export function confirmAdminManualFulfillment(payload: {
orderItemId: number
platformKey: string
costFen?: number
payeeName?: string
note?: string
@@ -2,7 +2,9 @@ import { apiDelete, apiGet, apiPost } from '@/lib/http'
/** 待分类队列(按内部 SKU 聚合)。 */
export type PendingChannelGroup = {
internal_sku: string
group_key: string
scope_type: 'internal_sku' | 'source_sku'
internal_sku: string | null
sku_name: string
providers: string[]
shop_ids: string[]
@@ -30,7 +32,7 @@ export type ChannelRule = {
id: number
match_key_type: 'internal_sku'
match_key: string
channel: 'work_order' | 'affiliate_dash' | 'third_party_voucher' | 'manual'
channel: 'work_order' | 'affiliate_dash' | 'third_party_voucher' | 'manual' | 'on_account'
priority: number
enabled: boolean
is_fallback: boolean
@@ -145,6 +147,7 @@ export type VoucherConsumeChannel =
| 'affiliate_dash'
| 'work_order'
| 'manual'
| 'on_account'
| 'third_party_voucher'
export type VoucherConsumeMode =
| 'manual'
@@ -261,7 +264,7 @@ export function retryPendingCarriers(payload: { internalSku: string }) {
)
}
export function deletePendingChannelGroup(payload: { internalSku: string }) {
export function deletePendingChannelGroup(payload: { groupKey: string }) {
return apiPost<DeletePendingChannelGroupResult>(
'/api/v1/admin/fulfillment/pending/delete',
payload,
@@ -269,14 +272,20 @@ export function deletePendingChannelGroup(payload: { internalSku: string }) {
}
export function assignChannelByInternalSku(payload: {
groupKey?: string
internalSku: string
mappedInternalSku?: string
channel: string
note?: string
}) {
return apiPost<{ updated: number; carrierFailed: number; ruleCreated: boolean }>(
'/api/v1/admin/fulfillment/assign',
payload,
)
return apiPost<{
updated: number
carrierFailed: number
ruleCreated: boolean
channelSaved: boolean
draftProductId: number | null
carrierFailures: Array<{ orderItemId: number; reason: string; message: string }>
}>('/api/v1/admin/fulfillment/assign', payload)
}
export function assignChannelToItems(payload: {