diff --git a/src/api/fulfillment.js b/src/api/fulfillment.js
index a8b4f03..82cb71a 100644
--- a/src/api/fulfillment.js
+++ b/src/api/fulfillment.js
@@ -1,4 +1,4 @@
-import { overseasRequest } from './overseas.js'
+import { overseasRequest, overseasUpload, overseasDownload } from './overseas.js'
const DISPATCH_BASE = '/pda/v1/last-leg/dispatches'
const OUTBOUND_BASE = '/pda/v1/last-leg/outbound-tasks'
@@ -175,6 +175,11 @@ export async function resolveCargoDiscardPallet(palletNo) {
return normalizeCargoDiscardTask(await overseasRequest('POST', `${CARGO_DISCARD_BASE}/resolve`, { palletNo }))
}
-export async function confirmCargoDiscard(discardNo, palletNo, lines) {
- return normalizeCargoDiscardTask(await overseasRequest('POST', `${CARGO_DISCARD_BASE}/${encoded(discardNo)}/pallets/${encoded(palletNo)}/confirm`, { lines }))
+export async function confirmCargoDiscard(discardNo, palletNo, lines, photoFileIds) {
+ return normalizeCargoDiscardTask(await overseasRequest('POST', `${CARGO_DISCARD_BASE}/${encoded(discardNo)}/pallets/${encoded(palletNo)}/confirm`, { lines, photoFileIds }))
}
+
+const discardPhotoPath = (discardNo, palletNo) => `${CARGO_DISCARD_BASE}/${encoded(discardNo)}/pallets/${encoded(palletNo)}/photos/files`
+export const listCargoDiscardPhotos = (discardNo, palletNo) => overseasRequest('GET', discardPhotoPath(discardNo, palletNo))
+export const uploadCargoDiscardPhoto = (discardNo, palletNo, filePath) => overseasUpload(discardPhotoPath(discardNo, palletNo), filePath)
+export const downloadCargoDiscardPhoto = (discardNo, palletNo, fileId) => overseasDownload(`${discardPhotoPath(discardNo, palletNo)}/${encoded(fileId)}/download`, { expectedContentTypePrefix: 'image/' })
diff --git a/src/api/return-packing.js b/src/api/return-packing.js
index 8b3340d..40197a4 100644
--- a/src/api/return-packing.js
+++ b/src/api/return-packing.js
@@ -75,7 +75,8 @@ export async function completePackingPlan(planNo, request) {
}
export function normalizePackingPlan(value = {}) {
- return { planNo: String(value.planNo || ''), customerId: String(value.customerId || ''), returnNos: Array.isArray(value.returnNos) ? value.returnNos.map(String) : [], sourceCartonMarks: Array.isArray(value.sourceCartonMarks) ? value.sourceCartonMarks.map(String) : [], sources: Array.isArray(value.sources) ? value.sources : [], mode: String(value.mode || ''), status: String(value.status || ''), boxes: Array.isArray(value.boxes) ? value.boxes : [], remark: String(value.remark || '') }
+ value = { ...value, completionCartons: Array.isArray(value.completionCartons) ? value.completionCartons.map(normalizeReturnLabel) : [], transfers: Array.isArray(value.transfers) ? value.transfers : [], completedAt: value.completedAt || null }
+ return { completionCartons: value.completionCartons, transfers: value.transfers, completedAt: value.completedAt, planNo: String(value.planNo || ''), customerId: String(value.customerId || ''), returnNos: Array.isArray(value.returnNos) ? value.returnNos.map(String) : [], sourceCartonMarks: Array.isArray(value.sourceCartonMarks) ? value.sourceCartonMarks.map(String) : [], sources: Array.isArray(value.sources) ? value.sources : [], mode: String(value.mode || ''), status: String(value.status || ''), boxes: Array.isArray(value.boxes) ? value.boxes : [], remark: String(value.remark || '') }
}
export async function getPackingPlan(planNo) {
diff --git a/src/components/LocalPackingAcceptance.vue b/src/components/LocalPackingAcceptance.vue
new file mode 100644
index 0000000..cbead0c
--- /dev/null
+++ b/src/components/LocalPackingAcceptance.vue
@@ -0,0 +1,6 @@
+本地合箱接口验收{{ result }}
+
+
diff --git a/src/components/ReturnBoxMergeWork.vue b/src/components/ReturnBoxMergeWork.vue
index b6f519f..2013627 100644
--- a/src/components/ReturnBoxMergeWork.vue
+++ b/src/components/ReturnBoxMergeWork.vue
@@ -8,7 +8,17 @@
{{ mode === 'NEW' ? '从下方来源箱选择 SKU 和扣除数量,完成后生成新箱唛。' : '扫描来源箱,再扫描另一只箱作为目标;目标箱原有库存不扣除。' }}
-
+
+
+ 计划需扫描箱子
+
+ {{ box.cartonMark }} · {{ box.participation === 'FULL' ? '整箱' : box.participation === 'PARTIAL' ? '部分' : '计划来源' }}
+ 来源退货单:{{ box.sourceReturnNo || '—' }}
+ {{ item.skuCode }} · {{ item.quantity }} 件
+ {{ item.skuCode }} · 原有 {{ item.quantity }} 件 · 计划后剩余 {{ target?.cartonMark === box.cartonMark ? item.quantity : Math.max(0, item.quantity - (box.items || []).filter(row => row.skuCode === item.skuCode).reduce((sum, row) => sum + row.quantity, 0)) }} 件
+ {{ target?.cartonMark === box.cartonMark ? '目标箱 · 保留原有库存' : sources.some(source => source.cartonMark === box.cartonMark) ? '已扫描确认' : '待扫描' }}
+
+
{{ box.cartonMark }}
@@ -26,18 +36,10 @@
{{ target.cartonMark }}{{ item.skuCode }} · 原有 {{ item.quantity }} 件(不扣除)
体积:{{ volume }} m³
-
- 计划箱子明细
-
- {{ box.cartonMark }}
- {{ item.skuCode }} · {{ item.quantity }} 件
- {{ target?.cartonMark === box.cartonMark ? '目标箱 · 保留原有库存' : sources.some(source => source.cartonMark === box.cartonMark) ? '来源箱已确认 · 下方填写扣除数量' : '待扫描确认' }}
-
-
{{ box.cartonMark }}
-
- {{ item.skuCode }} · 可扣 {{ item.quantity }} 件
+
+ {{ item.skuCode }} · {{ plan ? '计划取出' : '可扣' }} {{ item.quantity }} 件
@@ -46,15 +48,14 @@