291 lines
9.3 KiB
TypeScript
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,
|
|
)
|
|
}
|