Files
order_site/apps/frontend/src/services/admin/consignment.ts
T
yml2213 b666a9c951 fix(consignment): 拼单份额验收收官补寄卖结算钩子 + 手动匹配弹窗三处复核遗留
- 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 通过
2026-09-17 12:45:51 +08:00

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,
)
}