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

View File

@ -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
}
})