feat(order-service): 重构分类资料收集与订单状态链路

This commit is contained in:
yml2213
2026-11-03 19:46:49 +08:00
parent 6e4758a3c7
commit 9f14e8de7a
59 changed files with 4866 additions and 1734 deletions
+90 -38
View File
@@ -1,8 +1,6 @@
import { apiDelete, apiGet, apiPost, apiPut } from '@/lib/http'
import { apiDelete, apiGet, apiPost, apiPostForm, apiPut } from '@/lib/http'
import { optimizeImageForUpload } from '@/utils/image-upload'
import type {
CollectLookupResponse,
CollectMaterialLinkInfo,
CollectMaterialLinkSubmitResult,
UploadedFile,
WorkOrder,
WorkOrderEvent,
@@ -372,40 +370,6 @@ export function supplementWorkerAcceptedOrderEvidence(
)
}
export function lookupCollectOrder(orderNo: string) {
return apiPost<CollectLookupResponse>('/api/v1/collect/lookup', { orderNo })
}
export function submitCollectOrder(payload: {
orderNo: string
workOrderId?: number
fields: Record<string, string>
screenshots?: UploadedFile[]
}) {
return apiPost<{ complete: boolean; order: Record<string, unknown> }>(
'/api/v1/collect/submit',
payload,
)
}
export function fetchCollectMaterialLink(code: string) {
return apiGet<CollectMaterialLinkInfo>(`/api/v1/collect/link/${encodeURIComponent(code)}`)
}
export function submitCollectMaterialLink(
code: string,
payload: {
workOrderId?: number
fields: Record<string, string>
screenshots?: UploadedFile[]
},
) {
return apiPost<CollectMaterialLinkSubmitResult>(
`/api/v1/collect/link/${encodeURIComponent(code)}/submit`,
payload,
)
}
// ---------------- 打手端:我要寄卖与手枪库存 ----------------
export type WorkerConsignmentPublishPayload = {
@@ -591,3 +555,91 @@ export function fetchWorkerConsignmentPriceSuggestion(params: {
matchedRules: { ruleKey: string; productName: string; rewardAmountFen: number }[]
}>('/api/v1/worker/consignment/price-suggestion', params)
}
export type OrderServiceField = {
key: string
label: string
type: 'text' | 'textarea' | 'select' | 'radio' | 'number' | 'date'
required: boolean
placeholder?: string
helpText?: string
options?: string[]
sortOrder?: number
}
export type OrderServiceScreenshots = {
enabled: boolean
required: boolean
minCount: number
maxCount: number
label: string
helpText?: string
}
export type OrderServiceItem = {
workOrderId: number
productName: string
categoryName: string
title: string
description: string
submitText: string
successText: string
state: string
stateLabel: string
message: string
canSubmit: boolean
blockedReason: '' | 'already_submitted' | 'status' | 'assigned' | 'shares'
fields?: OrderServiceField[]
values?: Record<string, string>
screenshots?: UploadedFile[]
screenshotsRule?: OrderServiceScreenshots
guideImage?: UploadedFile | Record<string, unknown>
}
export type OrderServiceInfo = {
platformOrderId: string
items: OrderServiceItem[]
pendingCount: number
}
export type OrderServiceSubmitResult = {
complete: boolean
workOrderId: number
successText: string
order: { platformOrderId: string; productName: string; status: string }
}
export function fetchOrderService(orderNo: string) {
return apiGet<OrderServiceInfo>(`/api/v1/o/${encodeURIComponent(orderNo)}`)
}
export function submitOrderServiceMaterial(
orderNo: string,
payload: {
workOrderId?: number
fields: Record<string, string>
screenshots?: UploadedFile[]
},
) {
return apiPost<OrderServiceSubmitResult>(
`/api/v1/o/${encodeURIComponent(orderNo)}/material`,
payload,
)
}
export async function uploadOrderServiceFile(
file: File,
scene: string,
orderNo: string,
workOrderId?: number,
) {
const optimized = await optimizeImageForUpload(file, scene)
const form = new FormData()
form.append('file', optimized)
form.append('scene', scene)
const query = workOrderId ? `?workOrderId=${encodeURIComponent(String(workOrderId))}` : ''
return apiPostForm<{ file: UploadedFile }>(
`/api/v1/o/${encodeURIComponent(orderNo)}/files${query}`,
form,
)
}