fix(stocktake): resolve 500 error caused by missing batch or sn attributes using strict getattr fallback
This commit is contained in:
@ -976,19 +976,21 @@ def export_stocktake():
|
|||||||
if expected_qty > 0:
|
if expected_qty > 0:
|
||||||
# ★ 直接使用预加载的 base 关系,避免额外查询
|
# ★ 直接使用预加载的 base 关系,避免额外查询
|
||||||
material = stock.base
|
material = stock.base
|
||||||
|
# ★ 安全提取批号/序列号:使用 getattr 降级链
|
||||||
|
batch_sn = getattr(stock, 'batch_number', None) or getattr(stock, 'sn', None) or getattr(stock, 'serial_number', None) or '-'
|
||||||
mat_info = {
|
mat_info = {
|
||||||
'name': material.name if material else '-',
|
'name': material.name if material else '-',
|
||||||
'sku': getattr(stock, 'sku', None) or '-',
|
'sku': getattr(stock, 'sku', None) or '-',
|
||||||
'spec': getattr(material, 'spec_model', None) if material else '-',
|
'spec': getattr(material, 'spec_model', None) if material else '-',
|
||||||
'location': getattr(stock, 'warehouse_location', None) or '-',
|
'location': getattr(stock, 'warehouse_location', None) or '-',
|
||||||
'batch_no': getattr(stock, 'batch_number', None) or '-' # ★ 批号字段
|
'batch_no': batch_sn
|
||||||
}
|
}
|
||||||
unscanned_items.append({
|
unscanned_items.append({
|
||||||
'name': mat_info['name'],
|
'name': mat_info['name'],
|
||||||
'sku': mat_info['sku'],
|
'sku': mat_info['sku'],
|
||||||
'spec': mat_info['spec'],
|
'spec': mat_info['spec'],
|
||||||
'location': mat_info['location'],
|
'location': mat_info['location'],
|
||||||
'batch_no': mat_info['batch_no'], # ★ 批号字段
|
'batch_no': mat_info['batch_no'],
|
||||||
'stock_qty': expected_qty,
|
'stock_qty': expected_qty,
|
||||||
'actual_qty': 0,
|
'actual_qty': 0,
|
||||||
'diff_qty': -expected_qty,
|
'diff_qty': -expected_qty,
|
||||||
@ -1007,19 +1009,21 @@ def export_stocktake():
|
|||||||
if expected_qty > 0:
|
if expected_qty > 0:
|
||||||
# ★ 直接使用预加载的 base 关系,避免额外查询
|
# ★ 直接使用预加载的 base 关系,避免额外查询
|
||||||
material = stock.base
|
material = stock.base
|
||||||
|
# ★ 安全提取批号/序列号:使用 getattr 降级链
|
||||||
|
batch_sn = getattr(stock, 'batch_number', None) or getattr(stock, 'sn', None) or getattr(stock, 'serial_number', None) or '-'
|
||||||
mat_info = {
|
mat_info = {
|
||||||
'name': material.name if material else '-',
|
'name': material.name if material else '-',
|
||||||
'sku': getattr(stock, 'sku', None) or '-',
|
'sku': getattr(stock, 'sku', None) or '-',
|
||||||
'spec': getattr(material, 'spec_model', None) if material else '-',
|
'spec': getattr(material, 'spec_model', None) if material else '-',
|
||||||
'location': getattr(stock, 'warehouse_location', None) or '-',
|
'location': getattr(stock, 'warehouse_location', None) or '-',
|
||||||
'batch_no': getattr(stock, 'batch_number', None) or '-' # ★ 批号字段
|
'batch_no': batch_sn
|
||||||
}
|
}
|
||||||
unscanned_items.append({
|
unscanned_items.append({
|
||||||
'name': mat_info['name'],
|
'name': mat_info['name'],
|
||||||
'sku': mat_info['sku'],
|
'sku': mat_info['sku'],
|
||||||
'spec': mat_info['spec'],
|
'spec': mat_info['spec'],
|
||||||
'location': mat_info['location'],
|
'location': mat_info['location'],
|
||||||
'batch_no': mat_info['batch_no'], # ★ 批号字段
|
'batch_no': mat_info['batch_no'],
|
||||||
'stock_qty': expected_qty,
|
'stock_qty': expected_qty,
|
||||||
'actual_qty': 0,
|
'actual_qty': 0,
|
||||||
'diff_qty': -expected_qty,
|
'diff_qty': -expected_qty,
|
||||||
@ -1040,19 +1044,21 @@ def export_stocktake():
|
|||||||
if expected_qty > 0:
|
if expected_qty > 0:
|
||||||
# ★ 直接使用预加载的 base 关系,避免额外查询
|
# ★ 直接使用预加载的 base 关系,避免额外查询
|
||||||
material = stock.base
|
material = stock.base
|
||||||
|
# ★ 安全提取批号/序列号:使用 getattr 降级链 (成品可能无此字段)
|
||||||
|
batch_sn = getattr(stock, 'batch_number', None) or getattr(stock, 'sn', None) or getattr(stock, 'serial_number', None) or '-'
|
||||||
mat_info = {
|
mat_info = {
|
||||||
'name': material.name if material else '-',
|
'name': material.name if material else '-',
|
||||||
'sku': getattr(stock, 'sku', None) or '-',
|
'sku': getattr(stock, 'sku', None) or '-',
|
||||||
'spec': getattr(material, 'spec_model', None) if material else '-',
|
'spec': getattr(material, 'spec_model', None) if material else '-',
|
||||||
'location': getattr(stock, 'warehouse_location', None) or '-',
|
'location': getattr(stock, 'warehouse_location', None) or '-',
|
||||||
'batch_no': '-' # ★ 成品无批号字段
|
'batch_no': batch_sn
|
||||||
}
|
}
|
||||||
unscanned_items.append({
|
unscanned_items.append({
|
||||||
'name': mat_info['name'],
|
'name': mat_info['name'],
|
||||||
'sku': mat_info['sku'],
|
'sku': mat_info['sku'],
|
||||||
'spec': mat_info['spec'],
|
'spec': mat_info['spec'],
|
||||||
'location': mat_info['location'],
|
'location': mat_info['location'],
|
||||||
'batch_no': mat_info['batch_no'], # ★ 成品无批号字段
|
'batch_no': mat_info['batch_no'],
|
||||||
'stock_qty': expected_qty,
|
'stock_qty': expected_qty,
|
||||||
'actual_qty': 0,
|
'actual_qty': 0,
|
||||||
'diff_qty': -expected_qty,
|
'diff_qty': -expected_qty,
|
||||||
@ -1239,7 +1245,8 @@ def get_all_stocktake_items():
|
|||||||
'id': item.id,
|
'id': item.id,
|
||||||
'sku': item.sku or '',
|
'sku': item.sku or '',
|
||||||
'barcode': item.barcode or '',
|
'barcode': item.barcode or '',
|
||||||
'batch_no': item.batch_number or '', # ★ 批号字段
|
# ★ 安全提取批号/序列号:使用 getattr 降级
|
||||||
|
'batch_no': getattr(item, 'batch_number', None) or getattr(item, 'sn', None) or getattr(item, 'serial_number', None) or '',
|
||||||
'material_name': item.base.name if item.base else '',
|
'material_name': item.base.name if item.base else '',
|
||||||
'spec_model': item.base.spec_model if item.base else '',
|
'spec_model': item.base.spec_model if item.base else '',
|
||||||
'stock_qty': float(item.stock_quantity or 0),
|
'stock_qty': float(item.stock_quantity or 0),
|
||||||
@ -1264,7 +1271,8 @@ def get_all_stocktake_items():
|
|||||||
'id': item.id,
|
'id': item.id,
|
||||||
'sku': item.sku or '',
|
'sku': item.sku or '',
|
||||||
'barcode': item.barcode or '',
|
'barcode': item.barcode or '',
|
||||||
'batch_no': item.batch_number or '', # ★ 批号字段
|
# ★ 安全提取批号/序列号:使用 getattr 降级
|
||||||
|
'batch_no': getattr(item, 'batch_number', None) or getattr(item, 'sn', None) or getattr(item, 'serial_number', None) or '',
|
||||||
'material_name': item.base.name if item.base else '',
|
'material_name': item.base.name if item.base else '',
|
||||||
'spec_model': item.base.spec_model if item.base else '',
|
'spec_model': item.base.spec_model if item.base else '',
|
||||||
'stock_qty': float(item.stock_quantity or 0),
|
'stock_qty': float(item.stock_quantity or 0),
|
||||||
@ -1289,7 +1297,8 @@ def get_all_stocktake_items():
|
|||||||
'id': item.id,
|
'id': item.id,
|
||||||
'sku': item.sku or '',
|
'sku': item.sku or '',
|
||||||
'barcode': item.barcode or '',
|
'barcode': item.barcode or '',
|
||||||
'batch_no': item.batch_number or '', # ★ 批号字段 (成品无此字段则为空)
|
# ★ 安全提取批号/序列号:使用 getattr 降级 (成品无此字段则为空)
|
||||||
|
'batch_no': getattr(item, 'batch_number', None) or getattr(item, 'sn', None) or getattr(item, 'serial_number', None) or '',
|
||||||
'material_name': item.base.name if item.base else '',
|
'material_name': item.base.name if item.base else '',
|
||||||
'spec_model': item.base.spec_model if item.base else '',
|
'spec_model': item.base.spec_model if item.base else '',
|
||||||
'stock_qty': float(item.stock_quantity or 0),
|
'stock_qty': float(item.stock_quantity or 0),
|
||||||
|
|||||||
Reference in New Issue
Block a user