From 33acdc758c671da47e7b9d7053e95eb39ac8da4a Mon Sep 17 00:00:00 2001 From: yueli Date: Fri, 11 Sep 2026 09:06:43 +0800 Subject: [PATCH] =?UTF-8?q?fix(scan-draft):=20=E6=92=A4=E5=9B=9E=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E5=8D=95=E6=97=B6=E6=B8=85=E7=90=86=E5=85=B6=E6=89=AB?= =?UTF-8?q?=E7=A0=81=E8=8D=89=E7=A8=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 问题 ---- 草稿按 (user_id, biz_type, request_id) 存储,而撤回逻辑原先只做两件事: 释放预占、把状态置为 4。没有任何草稿清理 —— 撤回后草稿成为孤儿数据: · 单据状态变为 4,不再出现在扫码页的下拉里(那里只拉 status=1), 草稿从此永远读不到; · 若不清理会持续累积,每行是一个整单 JSON 快照。 实测(撤回前 2 份草稿):撤回后该单草稿数归 0。 ★ 清的是**所有用户**在这张单上的草稿,而非仅撤回者自己的 —— 可能有多人扫过同一张单,只清自己的会留下他人的孤儿数据。 出库 outbound_service._release_and_close 借库 borrow_service._release_and_close 两处共用底层,一并补上。 --- inventory-backend/app/services/borrow_service.py | 8 ++++++++ inventory-backend/app/services/outbound_service.py | 12 ++++++++++++ 2 files changed, 20 insertions(+) diff --git a/inventory-backend/app/services/borrow_service.py b/inventory-backend/app/services/borrow_service.py index df81e17..3dbc33e 100644 --- a/inventory-backend/app/services/borrow_service.py +++ b/inventory-backend/app/services/borrow_service.py @@ -559,6 +559,14 @@ class BorrowApprovalService: from app.services.inventory_reservation import release_reserved restored = release_reserved(approval.get_items()) + # ★ 清理该单据的扫码草稿(含其他用户的)。 + # 撤回后单据状态变为 4,不再出现在扫码页的下拉里(那里只拉 status=1), + # 草稿从此成为永远读不到的死数据。 + from app.models.scan_draft import ScanDraft + ScanDraft.query.filter_by( + biz_type='borrow', request_id=approval.id + ).delete(synchronize_session=False) + approval.status = 4 # 已撤回/已完结 db.session.commit() return True, f"申请单已撤回,释放 {restored} 项预占库存", approval diff --git a/inventory-backend/app/services/outbound_service.py b/inventory-backend/app/services/outbound_service.py index f795b7d..0d2bbf5 100644 --- a/inventory-backend/app/services/outbound_service.py +++ b/inventory-backend/app/services/outbound_service.py @@ -1327,6 +1327,18 @@ class OutboundApprovalService: from app.services.inventory_reservation import release_reserved restored = release_reserved(approval.get_items()) + # ★ 清理该单据的扫码草稿。 + # 草稿按 (user_id, request_id) 隔离,撤回后单据状态变为 4, + # 不会再出现在扫码页的单据下拉里(那里只拉 status=1), + # 草稿从此成为永远读不到的死数据。此处一并清掉。 + # + # 注意:要清**所有用户**在这张单上的草稿,而非仅撤回者自己的 —— + # 可能有多人扫过同一张单,只清自己的会留下他人的孤儿数据。 + from app.models.scan_draft import ScanDraft + ScanDraft.query.filter_by( + biz_type='outbound', request_id=approval.id + ).delete(synchronize_session=False) + approval.status = 4 # 4-已撤回/已完结 approval.actual_approver_id = user_id approval.approved_at = None