diff --git a/inventory-backend/app/api/v1/inbound/stock.py b/inventory-backend/app/api/v1/inbound/stock.py index 7f326f1..f4331d6 100644 --- a/inventory-backend/app/api/v1/inbound/stock.py +++ b/inventory-backend/app/api/v1/inbound/stock.py @@ -50,6 +50,17 @@ try: except ImportError: StockProduct = None + +def get_stock_model(source_table): + """根据source_table获取对应的库存模型""" + if source_table == 'stock_buy': + return StockBuy + elif source_table == 'stock_semi': + return StockSemi + elif source_table == 'stock_product': + return StockProduct + return None + from app.services.print.network_print_service import NetworkPrintService bp = Blueprint('stock_ops', __name__) @@ -145,9 +156,13 @@ def get_all_stock(): @permission_required('inventory_stocktake') def get_drafts(): """ - 获取当前用户的盘点进度 - 支持过滤: session_id + 获取盘点草稿列表 + 支持分页、搜索(SKU)和排序 """ + # 获取分页参数 + page = request.args.get('page', 1, type=int) + limit = request.args.get('limit', 20, type=int) + keyword = request.args.get('keyword', '', type=str) session_id = request.args.get('session_id') query = StocktakeDraft.query @@ -155,8 +170,58 @@ def get_drafts(): if session_id: query = query.filter_by(session_id=session_id) - drafts = query.order_by(StocktakeDraft.scan_time.desc()).all() - return jsonify([d.to_dict() for d in drafts]), 200 + # 先执行查询获取所有记录 + drafts = query.all() + + items = [] + + for draft in drafts: + # 获取 SKU 信息 + sku = '' + material_name = '' + spec_model = '' + + # 根据source_table获取对应的库存记录 + stock_model = get_stock_model(draft.source_table) + if stock_model and draft.stock_id: + stock = stock_model.query.get(draft.stock_id) + if stock: + sku = getattr(stock, 'sku', None) or getattr(stock, 'SKU', '') + + # 如果有关键词,进行 SKU 模糊匹配 + if keyword and sku: + if keyword.lower() not in sku.lower(): + continue + + # 获取物料基础信息 + base_id = getattr(stock, 'base_id', None) + if base_id: + material = MaterialBase.query.get(base_id) + if material: + material_name = material.name + spec_model = material.spec_model + + item = draft.to_dict() + item['sku'] = sku + item['material_name'] = material_name + item['spec_model'] = spec_model + items.append(item) + + # 按 SKU 升序排序 + items.sort(key=lambda x: (x['sku'] or '').lower()) + + # 手动分页 + total = len(items) + start = (page - 1) * limit + end = start + limit + paginated_items = items[start:end] + + return jsonify({ + 'items': paginated_items, + 'total': total, + 'page': page, + 'limit': limit + }), 200 @bp.route('/draft/add', methods=['POST']) diff --git a/inventory-backend/app/api/v1/stock/adjustment.py b/inventory-backend/app/api/v1/stock/adjustment.py index eb29563..04fed31 100644 --- a/inventory-backend/app/api/v1/stock/adjustment.py +++ b/inventory-backend/app/api/v1/stock/adjustment.py @@ -256,12 +256,21 @@ def get_stocks(): @jwt_required() @permission_required('stock_adjustment:list') def get_stocktake_discrepancies(): - """获取所有有差异的盘点记录""" + """获取所有有差异的盘点记录,支持分页、搜索和排序""" try: - # 查询所有有差异的盘点记录 - drafts = StocktakeDraft.query.filter(StocktakeDraft.diff_qty != 0).all() + # 获取分页参数 + page = request.args.get('page', 1, type=int) + limit = request.args.get('limit', 20, type=int) + keyword = request.args.get('keyword', '', type=str) + + # 先查询有差异的记录 + query = StocktakeDraft.query.filter(StocktakeDraft.diff_qty != 0) + + # 执行查询(不排序,因为在 Python 中排序) + drafts = query.all() items = [] + for draft in drafts: diff = float(draft.diff_qty or 0) if diff == 0: @@ -283,6 +292,11 @@ def get_stocktake_discrepancies(): sku = getattr(stock, 'sku', None) or getattr(stock, 'SKU', '') warehouse_location = getattr(stock, 'warehouse_location', '') + # 如果有关键词,进行 SKU 模糊匹配 + if keyword and sku: + if keyword.lower() not in sku.lower(): + continue + # 联表查询 MaterialBase if base_id: material = MaterialBase.query.get(base_id) @@ -306,11 +320,22 @@ def get_stocktake_discrepancies(): 'remark': draft.remark or '' }) + # 按 SKU 升序排序 + items.sort(key=lambda x: (x['sku'] or '').lower()) + + # 手动分页 + total = len(items) + start = (page - 1) * limit + end = start + limit + paginated_items = items[start:end] + return jsonify({ 'code': 200, 'data': { - 'items': items, - 'total': len(items) + 'items': paginated_items, + 'total': total, + 'page': page, + 'limit': limit } }) diff --git a/inventory-web/src/views/stock/adjustment/index.vue b/inventory-web/src/views/stock/adjustment/index.vue index 90fd286..d52d019 100644 --- a/inventory-web/src/views/stock/adjustment/index.vue +++ b/inventory-web/src/views/stock/adjustment/index.vue @@ -154,6 +154,23 @@
+ +
+ + + + 搜索 +
+ @@ -182,6 +199,20 @@ + + +
+ +
+
暂无盘点差异记录
@@ -223,6 +254,7 @@