修改是基础信息内容展示库存数和可用数

This commit is contained in:
dxc
2026-02-11 10:12:10 +08:00
parent 64efbb97d6
commit 706476d421
4 changed files with 135 additions and 16 deletions

View File

@ -4,6 +4,9 @@ from app.extensions import db
from app.models.base import MaterialBase
from app.models.inbound.buy import StockBuy
from app.models.inbound.semi import StockSemi
# 假设您有 StockProduct 和 StockService 的模型定义
# from app.models.inbound.product import StockProduct
# from app.models.inbound.service import StockService
from sqlalchemy import or_
import traceback
import json
@ -51,10 +54,46 @@ class MaterialBaseService:
traceback.print_exc()
return []
@staticmethod
def _get_stock_counts(stock_query):
"""
辅助函数:安全计算库存列表的总数量
修复逻辑:优先查找 'stock_quantity' (Buy/Semi/Product表中实际使用的字段)
"""
total_inv = 0
total_avail = 0
# 如果 stock_query 是动态加载的查询对象 (AppenderQuery),需要迭代它
# 如果是列表,直接迭代
try:
items = list(stock_query) # 触发查询
except:
items = []
for x in items:
# 1. 获取库存数
# 【修复点】根据你提供的 Service 代码Buy/Semi/Product 均使用 stock_quantity
# Service 使用 actual_quantity这里做兼容查找
q = getattr(x, 'stock_quantity', getattr(x, 'actual_quantity', getattr(x, 'quantity', 0)))
# 2. 获取可用数
# 这里的字段名通常都是 available_quantity
a = getattr(x, 'available_quantity', q)
# 累加 (转 float 防止 None 或 Decimal 计算报错)
try:
total_inv += float(q if q is not None else 0)
total_avail += float(a if a is not None else 0)
except:
pass
return total_inv, total_avail
@staticmethod
def get_list(page, limit, filters=None):
"""
获取基础信息列表 (带分页和筛选)
并聚合库存总数和可用总数
"""
try:
query = MaterialBase.query
@ -84,10 +123,36 @@ class MaterialBaseService:
# 按 ID 倒序排列
pagination = query.order_by(MaterialBase.id.desc()).paginate(page=page, per_page=limit, error_out=False)
items = [item.to_dict() for item in pagination.items]
return {"total": pagination.total, "items": items}
items_list = []
for item in pagination.items:
# 获取基础字典
item_dict = item.to_dict()
# [调用修复后的辅助函数]
# 1. 采购库存 (StockBuy)
buy_inv, buy_avail = MaterialBaseService._get_stock_counts(item.stock_buys)
# 2. 半成品库存 (StockSemi)
semi_inv, semi_avail = MaterialBaseService._get_stock_counts(item.stock_semis)
# 3. 成品库存 (StockProduct)
prod_inv, prod_avail = MaterialBaseService._get_stock_counts(item.stock_products)
# 4. 服务库存 (StockService)
# 使用 getattr 防止关联不存在时报错
serv_inv, serv_avail = MaterialBaseService._get_stock_counts(getattr(item, 'stock_services', []))
# 合并总数
item_dict['inventoryCount'] = buy_inv + semi_inv + prod_inv + serv_inv
item_dict['availableCount'] = buy_avail + semi_avail + prod_avail + serv_avail
items_list.append(item_dict)
return {"total": pagination.total, "items": items_list}
except Exception as e:
traceback.print_exc()
print(f"查询基础信息列表失败: {e}")
return {"total": 0, "items": []}
@ -175,6 +240,11 @@ class MaterialBaseService:
buy_usage_count = StockBuy.query.filter_by(base_id=m_id).count()
semi_usage_count = StockSemi.query.filter_by(base_id=m_id).count()
# 如果需要检查成品和服务,可以解开注释
# from app.models.inbound.product import StockProduct
# prod_usage_count = StockProduct.query.filter_by(base_id=m_id).count()
total_usage = buy_usage_count + semi_usage_count
if total_usage > 0: