From 00dde3a896de88c628cd680528bc78eab9f9f989 Mon Sep 17 00:00:00 2001 From: yueli Date: Tue, 8 Sep 2026 18:16:08 +0800 Subject: [PATCH] =?UTF-8?q?fix(inbound/buy):=20=E9=87=87=E8=B4=AD=E5=85=A5?= =?UTF-8?q?=E5=BA=93=E8=A1=A8=E5=8D=95=E6=89=B9=E5=8F=B7=E7=BB=AD=E5=8F=B7?= =?UTF-8?q?=E6=94=B9=E7=94=A8=E7=B2=BE=E5=87=86=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - checkHistoryAndSetMode 改调 /inbound/buy/latest-record 续号,不再依赖 getBuyList 前1000条 - 采购单导入“仅有 base_id”分支也自动续批号并带历史库位 --- inventory-web/src/api/inbound/buy.ts | 9 +++++++ inventory-web/src/views/stock/inbound/buy.vue | 24 +++++++++++-------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/inventory-web/src/api/inbound/buy.ts b/inventory-web/src/api/inbound/buy.ts index e0108b4..9b0706a 100644 --- a/inventory-web/src/api/inbound/buy.ts +++ b/inventory-web/src/api/inbound/buy.ts @@ -54,6 +54,15 @@ export function searchMaterialBase(keyword: string, page: number = 1, company?: }) } +// 6.1 按物料精准取“最近一次采购入库记录”(批号自增用;不再全局拉前 N 条再前端过滤) +export function getBuyLatestRecord(baseId: number) { + return request({ + url: '/inbound/buy/latest-record', + method: 'get', + params: { base_id: baseId } + }) +} + // 7. 文件上传 export function uploadFile(data: FormData) { return request({ diff --git a/inventory-web/src/views/stock/inbound/buy.vue b/inventory-web/src/views/stock/inbound/buy.vue index 4fb0b34..a5be10a 100644 --- a/inventory-web/src/views/stock/inbound/buy.vue +++ b/inventory-web/src/views/stock/inbound/buy.vue @@ -799,7 +799,8 @@ import { getSupplierSuggestions, getUserSuggestions, getLocationSuggestions, - getFilterOptions + getFilterOptions, + getBuyLatestRecord } from '@/api/inbound/buy' import { getApprovedUnstockedRequests } from '@/api/purchase' import {getLabelPreview, executePrint} from '@/api/common/print' @@ -1352,24 +1353,25 @@ const rules = computed(() => { const checkHistoryAndSetMode = async (baseId: number) => { try { - const res: any = await getBuyList({page: 1, pageSize: 1000}) - const historyItems = (res.data.items || []).filter((item: any) => item.base_id === baseId) + // ★ 改用后端“按物料精准取最近一条”接口(O(1)、不分页、不受历史行数/前1000条截断影响) + const res: any = await getBuyLatestRecord(baseId) + const rec = res?.data || {} - if (historyItems.length > 0) { + if (rec.has_history) { modeLocked.value = true - const latest = historyItems.sort((a: any, b: any) => b.id - a.id)[0] - if (latest.serial_number) { + if (rec.mode === 'serial') { entryMode.value = 'serial' form.serial_number = '' form.batch_number = '' } else { entryMode.value = 'batch' form.serial_number = '' - form.batch_number = incrementBatchNumber(latest.batch_number || '000000') + form.batch_number = incrementBatchNumber(rec.latest_batch || '000000') } } else { modeLocked.value = false entryMode.value = 'batch' + form.serial_number = '' form.batch_number = '000001' } if (formRef.value) { @@ -1379,6 +1381,7 @@ const checkHistoryAndSetMode = async (baseId: number) => { } catch (e) { modeLocked.value = false entryMode.value = 'batch' + form.serial_number = '' form.batch_number = '000001' } } @@ -1916,10 +1919,11 @@ const confirmPurchaseImport = () => { isInspectionRequired: mat.is_inspection_required }] } else if (po.base_id) { - // 如果 material 为空但 base_id 有值,尝试通过 base_id 查询 - // 这里简单处理:直接设置 base_id 让用户手动搜索 + // 如果 material 为空但 base_id 有值:仍按 base_id 续批号/带历史库位,物料详情让用户手动搜索确认 form.base_id = po.base_id - ElMessage.info('该采购单未附带物料详情,已填充 base_id,请手动搜索物料确认') + checkHistoryAndSetMode(po.base_id) + fetchLastLocation(po.base_id) + ElMessage.info('该采购单未附带物料详情,已按物料填充批号/库位,请手动搜索确认物料信息') } else { ElMessage.warning('该采购单未关联基础物料,无法自动填充物料信息') return