- acceptWorkOrderShareAndSettle 最后一个份额把母单转 accepted 的分支, 此前不释放发布押金也不结算供货货款(两钩子只在统一验收里): 现在同口径补上;供货货款传 assignedWorkerId=0(拼单母单无单一接单人, 份额打手已各自按 share_reward 结算,不会重复付款) - 手动匹配弹窗:race_condition/unavailable/spec_mismatch/partial_requires_confirm 四个错误码清空已选并自动重拉列表,数据过期不再死循环撞错 - 手动匹配弹窗库存侧:keyword+pageSize100 透传后端(原来 keyword 是死参数、 只拉 50 条),300ms 防抖后端搜索;无供货打手时禁用指派选项并在提交前 再拦一道(原来必 400 死路);选中订单回显 workerId/workerName - 凭证核销反馈抽共享 utils/voucher-consume,WorkOrdersPanel 与弹窗共用, 口径不再漂移(弹窗顺带获得"已提前核销 N 张"提示) - docs/寄卖系统优化方案.md 记录批次 V 后端 477(+4)/ 前端 50(+1)测试全绿,typecheck / lint / format / check:sql 通过
183 lines
6.1 KiB
TypeScript
183 lines
6.1 KiB
TypeScript
import { apiGet, apiPatch, apiPost, apiPut } from '@/lib/http'
|
|
import type {
|
|
ConsignmentInventory,
|
|
ConsignmentStatsSummary,
|
|
ConsignmentSubmission,
|
|
InventoryMatchableOrders,
|
|
WorkOrderInventoryMatchCheck,
|
|
WorkOrderInventoryMatchOptions,
|
|
} from '@/types/consignment'
|
|
|
|
// --- 库存管理 ---
|
|
|
|
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,
|
|
)
|
|
}
|
|
|
|
/** 履约/指派返回的电子凭证核销结果: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,
|
|
)
|
|
}
|