From b19cecb54f39b01e54b40879e8c8d55a487529ca Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Wed, 9 Sep 2026 12:29:46 +0800 Subject: [PATCH] fix(pda): stage sealed pallet scans for atomic batch picking --- AGENTS.md | 2 + api/pda-dropship.js | 6 +++ api/pda-loading.js | 1 + .../dropship-palletizing.vue | 19 +++++++-- pages/picking/picking.vue | 41 ++++++++++++++++--- tests/dropship-palletizing-page.test.mjs | 24 +++++++++++ tests/pda-loading-api.test.mjs | 32 +++++++++++++++ tests/picking-evidence-stage.test.mjs | 2 +- tests/picking-state.test.mjs | 14 +++++++ utils/picking-state.js | 6 ++- 10 files changed, 136 insertions(+), 11 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 28343fd..a5b6e2f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -20,6 +20,7 @@ - 扫码是主路径:输入焦点、连续扫描、防抖、重复码、无效码、错箱和扫描反馈必须作为一等场景处理。 - 拣货扫描身份是后端下发的稳定箱唛箱码 `boxCode`;一次有效且未重复的箱码扫描表示拣出一箱。SKU、商品件数、入库单号和页面展示文案只用于辅助识别,不得作为扫码匹配键或拣货计数单位。 +- 一件代发封托明细由 `Task.items` 的 `unitType/palletId/palletNo/indivisible` 标识,`PALLET` 只扫描 DP 码并一次将同托全部明细写入本地草稿,不接受托内逐箱扫码、部分拣货或跳拣;可整托撤销未提交草稿。点击提交时通过同一 `/tasks/{taskId}/batch` 按每个明细提交 `PICK_PALLET + palletNo + version`,由服务端验证封托和完整集合后原子处理,禁止扫码立即写后端。DP 托盘标识不得与库存资源托盘标识混用。 - 进入任务时由服务端标记“拣货中”;扫描结果先写入绑定作业员、任务和柜次的设备持久化草稿,仅在点击提交时批量写后端,禁止逐码提交。 - 允许部分拣货和跳拣,但每个未完成项必须填写异常原因;存在未解决异常时任务挂起,不能完成或推进 `LOADED`。 - 作业提交使用对员工不可见的轻量幂等标识和服务端版本;重复提交返回原结果,版本冲突提示刷新后重试,不静默覆盖。 @@ -27,6 +28,7 @@ - PDA 仅允许现场拍照;Admin 可通过独立受权入口人工上传。五类证据各至少 1 张有效照片,同类型允许多张追加;错误或重复照片标记作废并保留原因、操作人和时间,不硬删除。设备端证据查询、上传、预览和作废统一按当前 `taskId + warehouseId` 走任务专用 API,服务端再绑定真实柜 `containerBookingId`;不得调用旧入仓单/客户作用域证据接口。 - 与管理后台头程订单、仓库任务和 `baiyue-firstleg` Controller/OpenAPI 对齐稳定标识、状态机、时间和异常码,禁止在前端自行发明另一套业务状态。 - 一件代发清点组托使用独立 `/first-leg/pda-dropship` 任务链:箱码先经只读识别再确认实收;系统托盘码可先于或晚于箱码扫描。`count` 携托盘码时直接绑定,箱码先扫则进入待绑托区并由 `bind-pending` 批量绑定;换托只使用服务端 `cartonId`,封托后按整托不可拆。只消费 `platform:firstleg:pda:view` 与 `platform:firstleg:pda:work` 权限结果,不在 PDA 自建权限语义。 +- 清点组托页面有待绑箱时提供“新建托盘并绑定”,调用 `/tasks/{taskId}/pallets/create-and-bind`,只提交 `warehouseId + operationId`。服务端生成 DP 编号并原子绑定当前全部待绑箱,无待绑箱不建空托;失败重试复用幂等键,成功后选中新托盘。此处是独立清点确认命令,不改变装柜拣货扫描仅记录草稿的原则。 ## 设备、安全与可用性 diff --git a/api/pda-dropship.js b/api/pda-dropship.js index 609e061..c178fe2 100644 --- a/api/pda-dropship.js +++ b/api/pda-dropship.js @@ -58,6 +58,12 @@ export function bindPendingDropshipCartons(taskId, payload = {}) { return apiRequest({ url: `${ROOT}/tasks/${encodeURIComponent(taskId)}/pallets/bind-pending`, method: 'POST', header: operationHeader(payload.operationId), data: payload }) } +export function createAndBindDropshipPallet(taskId, payload = {}) { + requireValue(taskId, '缺少清点组托任务标识') + for (const [field, message] of [['warehouseId', '缺少作业仓库标识'], ['operationId', '缺少操作幂等标识']]) requireValue(payload[field], message) + return apiRequest({ url: `${ROOT}/tasks/${encodeURIComponent(taskId)}/pallets/create-and-bind`, method: 'POST', header: operationHeader(payload.operationId), data: { warehouseId: payload.warehouseId, operationId: payload.operationId } }) +} + export function moveDropshipCarton(taskId, cartonId, payload = {}) { requireValue(cartonId, '缺少箱明细标识') for (const [field, message] of [['warehouseId', '缺少作业仓库标识'], ['operationId', '缺少操作幂等标识']]) requireValue(payload[field], message) diff --git a/api/pda-loading.js b/api/pda-loading.js index 4983efb..e101fa4 100644 --- a/api/pda-loading.js +++ b/api/pda-loading.js @@ -107,6 +107,7 @@ export async function submitContainerPickingBatch(task, actions, { warehouseId, const items = (actions || []).map((action) => ({ itemId: action.itemId, action: action.type, + palletNo: action.type === 'PICK_PALLET' ? action.palletNo : null, pickedPackageCount: action.type === 'PICK' ? action.pickedPackageCount : null, finalPickedPackageCount: action.type === 'PARTIAL' ? action.finalPickedPackageCount : null, version: action.version, diff --git a/pages/dropship-palletizing/dropship-palletizing.vue b/pages/dropship-palletizing/dropship-palletizing.vue index ba30bf1..dcf5937 100644 --- a/pages/dropship-palletizing/dropship-palletizing.vue +++ b/pages/dropship-palletizing/dropship-palletizing.vue @@ -21,8 +21,8 @@ 实收与应收不一致,请确认接受差异并填写处理结果。