Files
order_site/apps/frontend/src/services/admin/consignment.ts
T

291 lines
9.3 KiB
TypeScript

import { apiDelete, apiGet, apiPatch, apiPost, apiPut } from '@/lib/http'
import type {
AdminConsignmentProfilesResponse,
ConsignmentContactSupporter,
ConsignmentInventory,
ConsignmentMatchCandidatesResponse,
ConsignmentProfile,
ConsignmentStatsSummary,
ConsignmentSubmission,
InventoryMatchableOrders,
PendingPistolMatchResult,
WorkOrderInventoryMatchCheck,
WorkOrderInventoryMatchOptions,
} from '@/types/consignment'
// --- 分类级寄卖配置 ---
export function fetchAdminConsignmentProfiles() {
return apiGet<AdminConsignmentProfilesResponse>(
'/api/v1/admin/worker-platform/consignment/profiles',
)
}
export function saveAdminConsignmentProfile(payload: Record<string, unknown>) {
return apiPost<{ profile: ConsignmentProfile }>(
'/api/v1/admin/worker-platform/consignment/profiles',
payload,
)
}
export function publishAdminConsignmentProfile(profileId: number | string) {
return apiPost<{ profile: ConsignmentProfile }>(
`/api/v1/admin/worker-platform/consignment/profiles/${profileId}/publish`,
{},
)
}
export function archiveAdminConsignmentProfile(profileId: number | string) {
return apiPost<{ profile: ConsignmentProfile }>(
`/api/v1/admin/worker-platform/consignment/profiles/${profileId}/archive`,
{},
)
}
// --- 内部匹配(工单侧手动匹配) ---
export function fetchAdminConsignmentMatchCandidates(workOrderId: number | string) {
return apiGet<ConsignmentMatchCandidatesResponse>(
'/api/v1/admin/worker-platform/consignment/match-candidates',
{ workOrderId },
)
}
export function matchAdminConsignmentWorkOrder(payload: {
workOrderId: number
inventoryIds: number[]
allowNonExact?: boolean
reason?: string
}) {
return apiPost<{ matched: boolean; matchedCount: number }>(
'/api/v1/admin/worker-platform/consignment/match',
payload,
)
}
// --- 对接客服名单 ---
export function fetchAdminConsignmentContacts(params?: { keyword?: string; enabled?: string }) {
return apiGet<{ items: ConsignmentContactSupporter[]; total: number }>(
'/api/v1/admin/worker-platform/consignment/contacts',
params,
)
}
export function createAdminConsignmentContact(payload: Record<string, unknown>) {
return apiPost<ConsignmentContactSupporter>(
'/api/v1/admin/worker-platform/consignment/contacts',
payload,
)
}
export function updateAdminConsignmentContact(
id: number | string,
payload: Record<string, unknown>,
) {
return apiPut<ConsignmentContactSupporter>(
`/api/v1/admin/worker-platform/consignment/contacts/${id}`,
payload,
)
}
export function setAdminConsignmentContactEnabled(id: number | string, enabled: boolean) {
return apiPatch<ConsignmentContactSupporter>(
`/api/v1/admin/worker-platform/consignment/contacts/${id}/enabled`,
{ enabled },
)
}
export function deleteAdminConsignmentContact(id: number | string) {
return apiDelete<{ deleted: boolean }>(`/api/v1/admin/worker-platform/consignment/contacts/${id}`)
}
// --- 库存管理 ---
export function fetchAdminConsignmentInventories(params?: Record<string, unknown>) {
return apiGet<{ items: ConsignmentInventory[]; total: number }>(
'/api/v1/admin/worker-platform/consignment/inventories',
params,
)
}
export function fetchAdminConsignmentStats() {
return apiGet<ConsignmentStatsSummary>('/api/v1/admin/worker-platform/consignment/stats')
}
export function getAdminConsignmentInventory(id: number | string) {
return apiGet<ConsignmentInventory>(`/api/v1/admin/worker-platform/consignment/inventories/${id}`)
}
export function updateAdminConsignmentInventory(
id: number | string,
payload: Record<string, unknown>,
) {
return apiPut<ConsignmentInventory>(
`/api/v1/admin/worker-platform/consignment/inventories/${id}`,
payload,
)
}
export function toggleAdminConsignmentMatching(id: number | string, allowMatching: boolean) {
return apiPatch<ConsignmentInventory>(
`/api/v1/admin/worker-platform/consignment/inventories/${id}/matching`,
{ allowMatching },
)
}
export function archiveAdminConsignmentInventory(id: number | string) {
return apiPost<ConsignmentInventory>(
`/api/v1/admin/worker-platform/consignment/inventories/${id}/archive`,
{},
)
}
export function returnAdminConsignmentInventory(id: number | string, payload: { reason?: string }) {
return apiPost<ConsignmentInventory>(
`/api/v1/admin/worker-platform/consignment/inventories/${id}/return`,
payload,
)
}
// --- 提报审核 ---
export function fetchAdminConsignmentSubmissions(params?: Record<string, unknown>) {
return apiGet<{ items: ConsignmentSubmission[]; total: number }>(
'/api/v1/admin/worker-platform/consignment/submissions',
params,
)
}
export function getAdminConsignmentSubmission(id: number | string) {
return apiGet<ConsignmentSubmission>(
`/api/v1/admin/worker-platform/consignment/submissions/${id}`,
)
}
export function approveAdminConsignmentSubmission(
id: number | string,
payload: Record<string, unknown>,
) {
return apiPost<{ submission: ConsignmentSubmission; inventory: ConsignmentInventory }>(
`/api/v1/admin/worker-platform/consignment/submissions/${id}/approve`,
payload,
)
}
export function rejectAdminConsignmentSubmission(
id: number | string,
payload: { reviewNote?: string },
) {
return apiPost<ConsignmentSubmission>(
`/api/v1/admin/worker-platform/consignment/submissions/${id}/reject`,
payload,
)
}
// --- 匹配与履约 ---
export function checkWorkOrderConsignmentMatches(workOrderId: number | string) {
return apiGet<WorkOrderInventoryMatchCheck>(
`/api/v1/admin/worker-platform/consignment/matches/${workOrderId}`,
)
}
/**
* 手动指定现货:该订单的**全部**在库现货(含不符合规格的),逐件带匹配判定与差异说明。
* 与 checkWorkOrderConsignmentMatches 的区别:后者只给系统候选,这里给"人工拍板"的全量视图。
*/
export function fetchWorkOrderConsignmentMatchOptions(workOrderId: number | string) {
return apiGet<WorkOrderInventoryMatchOptions>(
`/api/v1/admin/worker-platform/consignment/matches/${workOrderId}/options`,
)
}
/** 手动匹配:从现货出发,列出可以匹配的待指派/待补资料订单(逐单带规格判定) */
export function fetchInventoryMatchableOrders(
inventoryId: number | string,
params?: { keyword?: string; pageSize?: number },
) {
return apiGet<InventoryMatchableOrders>(
`/api/v1/admin/worker-platform/consignment/inventories/${inventoryId}/match-orders`,
params,
)
}
/** 全局匹配看板:非拼单待抢单手枪 × 在库待匹配现货,按细粒度评分排序。 */
export function fetchPendingPistolMatches(params?: {
keyword?: string
includeConflicts?: boolean
limit?: number
}) {
return apiGet<PendingPistolMatchResult>(
'/api/v1/admin/worker-platform/consignment/pending-pistol-matches',
{
keyword: params?.keyword?.trim() || undefined,
includeConflicts: params?.includeConflicts ? 'true' : undefined,
limit: params?.limit,
},
)
}
/** 履约/指派返回的电子凭证核销结果:ok=false 时必须提示运营人工核销,不能报成功 */
export type WorkOrderVoucherConsumeResult = {
ok: boolean
voucherCount: number
consumedCount: number
alreadyConsumedCount: number
failedCount: number
voucherCodes: string[]
errorMessage: string
}
export function fulfillWorkOrderWithConsignment(payload: {
workOrderId: number | string
inventoryId: number | string
/** 订单规格信息不全或高配充低配时,必须显式确认才放行(后端会二次校验) */
allowPartial?: boolean
/** 规格真冲突(系统/区服/系列/钻级不符)也放行,必须同时给 matchNote */
allowSpecMismatch?: boolean
/** 手动指定现货的原因(强制匹配必填,后端会留痕) */
matchNote?: string
}) {
return apiPost<{
workOrder: unknown
inventory: ConsignmentInventory
voucherConsume?: WorkOrderVoucherConsumeResult
}>('/api/v1/admin/worker-platform/consignment/fulfill', payload)
}
export function assignWorkOrderWithConsignmentWorker(payload: {
workOrderId: number | string
inventoryId: number | string
workerId?: number | null
/** 订单规格信息不全或高配充低配时,必须显式确认才放行(后端会二次校验) */
allowPartial?: boolean
/** 规格真冲突(系统/区服/系列/钻级不符)也放行,必须同时给 matchNote */
allowSpecMismatch?: boolean
/** 手动指定现货的原因(强制匹配必填,后端会留痕) */
matchNote?: string
}) {
return apiPost<{
workOrder: unknown
inventory: ConsignmentInventory
voucherConsume?: WorkOrderVoucherConsumeResult
}>('/api/v1/admin/worker-platform/consignment/assign-worker', payload)
}
export function revokeWorkOrderConsignmentFulfillment(payload: {
workOrderId: number | string
action?: 'reopen' | 'cancel_order' | 'archive_inventory'
reason?: string
/** 打手履约押金处置:auto 按规则自动 / refund 全额退还 / forfeit 全额扣除 */
workerDeposit?: 'auto' | 'refund' | 'forfeit'
/** 卖家发布押金处置:auto 按规则自动 / keep_frozen 保留冻结 / forfeit 扣除没收 */
consignmentDeposit?: 'auto' | 'keep_frozen' | 'forfeit'
}) {
return apiPost<{ workOrder: unknown; inventory?: ConsignmentInventory | null }>(
'/api/v1/admin/worker-platform/consignment/revoke',
payload,
)
}