feat: fix stocktake deletion bug, and add pagination, search, sorting to stocktake lists

This commit is contained in:
DXC
2026-03-19 16:21:09 +08:00
parent 5510bae3b2
commit 53c198f363
4 changed files with 255 additions and 50 deletions

View File

@ -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'])