From 40e405becd3460e296051530027f3bec77a8cbf0 Mon Sep 17 00:00:00 2001 From: dxc Date: Mon, 27 Apr 2026 16:33:54 +0800 Subject: [PATCH] 4.27 --- inventory-backend/app/api/v1/inbound/stock.py | 81 ++++++++++++------- inventory-web/src/App.vue | 2 +- 2 files changed, 55 insertions(+), 28 deletions(-) diff --git a/inventory-backend/app/api/v1/inbound/stock.py b/inventory-backend/app/api/v1/inbound/stock.py index 89fa1b7..9af96a7 100644 --- a/inventory-backend/app/api/v1/inbound/stock.py +++ b/inventory-backend/app/api/v1/inbound/stock.py @@ -22,14 +22,18 @@ except ImportError: SysUser = None # 尝试导入半成品和成品 +import logging + try: from app.models.inbound.semi import StockSemi -except ImportError: +except Exception as e: + logging.error(f"❌ 致命错误:StockSemi 模型导入失败: {e}") StockSemi = None try: from app.models.inbound.product import StockProduct -except ImportError: +except Exception as e: + logging.error(f"❌ 致命错误:StockProduct 模型导入失败: {e}") StockProduct = None @@ -79,28 +83,50 @@ def get_stock_info(uuid_or_barcode): 根据 uuid 或 barcode 查询库存信息 返回: (item, source_table, stock_id) """ + # 清洗输入:去掉前后空格和换行符 + uuid_or_barcode = str(uuid_or_barcode).strip() + # 1. 成品 if StockProduct: + print(f"🔍 [QUERY DEBUG] 正在成品表搜关键词: {uuid_or_barcode}") item = StockProduct.query.filter( - db.or_(StockProduct.barcode == uuid_or_barcode, StockProduct.sku == uuid_or_barcode) + db.or_( + StockProduct.barcode.ilike(f"%{uuid_or_barcode}%"), + StockProduct.sku.ilike(f"%{uuid_or_barcode}%"), + StockProduct.serial_number.ilike(f"%{uuid_or_barcode}%") + ) ).first() if item: + print(f"✅ [QUERY DEBUG] 命中成品! ID={item.id}, SKU={item.sku}") return (item, 'stock_product', item.id) + else: + print(f"❌ [QUERY DEBUG] 成品表查询结束,无匹配项") # 2. 半成品 if StockSemi: + print(f"🔍 [QUERY DEBUG] 正在半成品表搜关键词: {uuid_or_barcode}") item = StockSemi.query.filter( - db.or_(StockSemi.barcode == uuid_or_barcode, StockSemi.sku == uuid_or_barcode) + db.or_( + StockSemi.barcode.ilike(f"%{uuid_or_barcode}%"), + StockSemi.sku.ilike(f"%{uuid_or_barcode}%"), + StockSemi.serial_number.ilike(f"%{uuid_or_barcode}%") + ) ).first() if item: + print(f"✅ [QUERY DEBUG] 命中半成品! ID={item.id}, SKU={item.sku}") return (item, 'stock_semi', item.id) # 3. 采购件 if StockBuy: + print(f"🔍 [QUERY DEBUG] 正在采购件表搜关键词: {uuid_or_barcode}") item = StockBuy.query.filter( - db.or_(StockBuy.barcode == uuid_or_barcode, StockBuy.sku == uuid_or_barcode) + db.or_( + StockBuy.barcode.ilike(f"%{uuid_or_barcode}%"), + StockBuy.sku.ilike(f"%{uuid_or_barcode}%") + ) ).first() if item: + print(f"✅ [QUERY DEBUG] 命中采购件! ID={item.id}, SKU={item.sku}") return (item, 'stock_buy', item.id) return (None, None, None) @@ -216,32 +242,32 @@ def get_stock_list(): except Exception: pass - # 3. 成品 + # 3. 成品 if StockProduct: - try: - q = StockProduct.query.filter(StockProduct.stock_quantity > 0) - if keyword: - q = q.filter( - db.or_( - StockProduct.product_name.ilike(f'%{keyword}%'), - StockProduct.spec_model.ilike(f'%{keyword}%'), - StockProduct.sku.ilike(f'%{keyword}%') - ) + q = StockProduct.query.filter(StockProduct.stock_quantity > 0) + if keyword: + q = q.filter( + db.or_( + StockProduct.base.has(MaterialBase.name.ilike(f'%{keyword}%')), + StockProduct.base.has(MaterialBase.spec_model.ilike(f'%{keyword}%')), + StockProduct.sku.ilike(f'%{keyword}%'), + StockProduct.barcode.ilike(f'%{keyword}%'), + StockProduct.serial_number.ilike(f'%{keyword}%') ) - rows = q.all() - for item in rows: - d = item.to_dict() - d['stock_type'] = 'product' - d['type'] = 'product' - d['typeLabel'] = '成品' - d['name'] = d.get('product_name', d.get('name', '')) - d['standard'] = d.get('spec_model', d.get('standard', '')) - d['available_quantity'] = d.get('qty_available', d.get('available_quantity', 0)) - all_items.append(d) - except Exception: - pass + ) + rows = q.all() + for item in rows: + d = item.to_dict() + d['stock_type'] = 'product' + d['type'] = 'product' + d['typeLabel'] = '成品' + d['name'] = d.get('material_name', d.get('name', '')) + d['standard'] = d.get('spec_model', d.get('standard', '')) + d['available_quantity'] = d.get('qty_available', d.get('available_quantity', 0)) + all_items.append(d) total = len(all_items) + start = (page - 1) * pageSize end = start + pageSize paged = all_items[start:end] @@ -361,6 +387,7 @@ def add_draft(): data = request.json user_id = _normalize_user_id() uuid = data.get('uuid') + print(f"🚀 [SCAN DEBUG] 后端实际接收到的 UUID 原文: |{uuid}| (长度: {len(str(uuid)) if uuid else 0})") quantity = float(data.get('quantity', 1)) session_id = data.get('session_id') # ★ 新增: 提取备注字段 diff --git a/inventory-web/src/App.vue b/inventory-web/src/App.vue index 76b54a2..1b0db14 100644 --- a/inventory-web/src/App.vue +++ b/inventory-web/src/App.vue @@ -234,7 +234,7 @@ const handleLogout = () => {