diff --git a/src/modules/overseas-warehouse/api/relabelOrders.ts b/src/modules/overseas-warehouse/api/relabelOrders.ts index 0e08dc89..2a284697 100644 --- a/src/modules/overseas-warehouse/api/relabelOrders.ts +++ b/src/modules/overseas-warehouse/api/relabelOrders.ts @@ -157,6 +157,16 @@ export async function changeRelabelOrderStatus(relabelNo: string, status: string return unwrapApiResponse(response) } +export async function getRelabelReviewTask(relabelNo: string) { + const response = await overseasHttp.get, ApiEnvelope<{ version: number; taskStatus: string }>>(`/platform/v1/last-leg/relabel-applications/${encodeURIComponent(relabelNo)}/review-task`) + return unwrapApiResponse(response) +} + +export async function returnRelabelForRework(relabelNo: string, expectedVersion: number, remark: string, idempotencyKey: string) { + const response = await overseasHttp.post, ApiEnvelope>(`/platform/v1/last-leg/relabel-applications/${encodeURIComponent(relabelNo)}/rework`, { decision: 'REWORK', expectedVersion, remark, idempotencyKey }) + return unwrapApiResponse(response) +} + export async function uploadRelabelPdf(relabelNo: string, file: File, scope: 'TOTAL' | 'ITEM', itemId?: string) { const body = new FormData() body.append('file', file) diff --git a/src/modules/overseas-warehouse/lastMilePresentation.test.ts b/src/modules/overseas-warehouse/lastMilePresentation.test.ts index f4ffa4e9..2ac709f5 100644 --- a/src/modules/overseas-warehouse/lastMilePresentation.test.ts +++ b/src/modules/overseas-warehouse/lastMilePresentation.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest' -import { formatOverseasDateTime, inventoryBusinessTypeLabel, lastMileOrderReference, toLastMileOrderListItem } from './lastMilePresentation' +import { formatOverseasDateTime, inventoryBusinessTypeLabel, lastMileOrderReference, relabelBusinessStatusLabel, toLastMileOrderListItem } from './lastMilePresentation' describe('last-mile order presentation adapter', () => { it('formats overseas timestamps with zero-padded seconds', () => { @@ -89,6 +89,7 @@ describe('last-mile order presentation adapter', () => { ['WAREHOUSE_TRANSFER', '仓储转运'], ['RETURN_RELABEL', '退货换标'], ['LOCAL_LOOSEBOARD', '本土散板'], + ['CARGO_DISCARD', '货物废弃订单'], ])('maps %s to its Chinese display name', (orderType, expected) => { const row = toLastMileOrderListItem({ id: '1', customerId: '100', orderNo: 'LL-1', orderType }) expect(row.orderType).toBe(expected) @@ -102,4 +103,14 @@ describe('last-mile order presentation adapter', () => { expect(row.palletMergeRelation).toBe('NYEXX2608280001、NYEXX2608280002') }) + + it.each([ + ['PENDING_PROCESSING', '待处理'], + ['PROCESSING', '处理中'], + ['CUSTOMER_CONFIRM_PENDING', '待处理'], + ['READY_FOR_OUTBOUND', '换标完成'], + ['COMPLETED', '换标完成'], + ])('collapses internal relabel node %s into business status %s', (status, expected) => { + expect(relabelBusinessStatusLabel(status)).toBe(expected) + }) }) diff --git a/src/modules/overseas-warehouse/lastMilePresentation.ts b/src/modules/overseas-warehouse/lastMilePresentation.ts index 9b6da049..779770bf 100644 --- a/src/modules/overseas-warehouse/lastMilePresentation.ts +++ b/src/modules/overseas-warehouse/lastMilePresentation.ts @@ -8,11 +8,14 @@ const orderTypeLabels: Record = { WAREHOUSE_TRANSFER: '仓储转运', RETURN_RELABEL: '退货换标', LOCAL_LOOSEBOARD: '本土散板', + CARGO_DISCARD: '货物废弃订单', REJECTED: '拒收订单', EXPRESS: '快递订单', } const statusLabels: Record = { + PENDING_REVIEW: '待审核', + APPROVED: '审核通过', PENDING_ASSIGNMENT: '待分配', DESTINATION_ASSIGNED: '已分配目的仓', INBOUND_PLANNED: '已生成入库计划', @@ -58,6 +61,14 @@ export function lastMileStatusLabel(value: unknown) { return statusLabels[code] || text(code) } +// 认领后显示处理中,可出库节点统一显示换标完成。 +export function relabelBusinessStatusLabel(value: unknown) { + const code = String(value ?? '').trim() + if (code === 'PROCESSING') return '处理中' + if (!code || code === 'NOT_REQUIRED') return '—' + return ['READY_FOR_OUTBOUND', 'COMPLETED'].includes(code) ? '换标完成' : '待处理' +} + export function lastMileOrderTypeLabel(value: unknown) { const code = String(value ?? '').trim() return orderTypeLabels[code] || text(code) @@ -135,7 +146,7 @@ export function toLastMileOrderListItem(dto: LastMileOrderSummaryDto): LastMileO outboundOrderNo: text(dto.outboundOrderNo), dispatchOrderNo: text(dto.deliveryOrderNo), relabelOrderNo: text(dto.relabelOrderNo), - relabelStatus: lastMileStatusLabel(dto.relabelStatus), + relabelStatus: relabelBusinessStatusLabel(dto.relabelStatus), consolidated: palletMergeLabel(dto.palletMergeFlag), palletMergeFlag: String(dto.palletMergeFlag ?? '').trim(), palletMergeRelation: Array.isArray(dto.palletMergeInboundNos) && dto.palletMergeInboundNos.length diff --git a/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue b/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue index a533aaa4..b50d589a 100644 --- a/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue +++ b/src/modules/overseas-warehouse/pages/LastMileOrderDetailView.vue @@ -65,6 +65,7 @@ const orderFields = computed(() => { { label: '是否暂扣', value: yesNo(order?.detained) }, { label: '是否异常', value: yesNo(order?.abnormal) }, { label: '异常原因', value: order?.abnormal ? text(order.subOrderStatus) : '—' }, + { label: '仓库异常作业备注', value: text(order?.warehouseRemark) }, { label: '备注(客户)', value: text(order?.customerRemark) }, ] }) diff --git a/src/modules/overseas-warehouse/pages/LastMileOrdersView.vue b/src/modules/overseas-warehouse/pages/LastMileOrdersView.vue index 4e7bfe1f..cb071d5f 100644 --- a/src/modules/overseas-warehouse/pages/LastMileOrdersView.vue +++ b/src/modules/overseas-warehouse/pages/LastMileOrdersView.vue @@ -122,6 +122,7 @@ const allFields: QueryField[] = [ { label: '头程订单', value: 'FIRST_LEG' }, { label: '换标下单', value: 'RELABEL_APPLICATION' }, { label: '仓储转运', value: 'WAREHOUSE_TRANSFER' }, { label: '本土散板', value: 'LOCAL_LOOSEBOARD' }, { label: '退货换标', value: 'RETURN_RELABEL' }, { label: '一件代发', value: 'ONE_CLICK_DROPSHIP' }, + { label: '货物废弃订单', value: 'CARGO_DISCARD' }, ] }, { key: 'warehouse', type: 'input', label: '海外仓', width: 210, placeholder: '请输入仓库名称或编码' }, { key: 'sourceOrderNo', type: 'input', label: '来源订单号', width: 190, placeholder: '请输入来源订单号' }, @@ -723,6 +724,7 @@ function orderTypeText(orderType: string) { LOCAL_LOOSEBOARD: '本土散板', RETURN_RELABEL: '退货换标', ONE_CLICK_DROPSHIP: '一件代发', + CARGO_DISCARD: '货物废弃订单', } return labels[orderType] || orderType } diff --git a/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.vue b/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.vue index 81d1d012..15f2c17b 100644 --- a/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.vue +++ b/src/modules/overseas-warehouse/pages/RelabelOrderDetailView.vue @@ -1,7 +1,10 @@