feat(borrow): 借库未归还直接报废功能(关联报废单流程)
后端: - trans_service 新增 scrap_borrow 方法:未归还借用标记为 scrapped, 扣减总库存 stock_quantity(可用已在借出时冻结),生成 TransScrap 报废记录 - transactions.py 新增 POST /borrow/scrap 接口(复用 op_return:operation 权限,库管/主管可操作) - scrap.py query_records 支持 trans_borrow 来源的物料名解析 + 行级隔离 前端: - records.vue 未归还记录新增「报废」按钮(库管/主管可见) - 报废弹窗:勾选明细 + 填报废原因 + 二次确认 - 状态显示新增「已报废」标签;整单所有明细报废时标记为 scrapped
This commit is contained in:
@ -356,7 +356,30 @@ class ScrapService:
|
||||
).join(MaterialBase, TransRepair.base_id == MaterialBase.id).filter(
|
||||
MaterialBase.company_name == company_limit
|
||||
)
|
||||
all_matches = buy_subq.union(semi_subq, product_subq, repair_subq).subquery()
|
||||
# ★ 借库转报废:stock_id 指向 trans_borrow.id,通过 borrow 关联源库存表再关联 MaterialBase
|
||||
from app.models.transaction import TransBorrow
|
||||
borrow_stock_buy = db.session.query(TransScrap.id).join(
|
||||
TransBorrow, db.and_(TransScrap.stock_id == TransBorrow.id,
|
||||
TransScrap.source_table == 'trans_borrow')
|
||||
).join(StockBuy, TransBorrow.stock_id == StockBuy.id).join(
|
||||
MaterialBase, StockBuy.base_id == MaterialBase.id
|
||||
).filter(MaterialBase.company_name == company_limit)
|
||||
borrow_stock_semi = db.session.query(TransScrap.id).join(
|
||||
TransBorrow, db.and_(TransScrap.stock_id == TransBorrow.id,
|
||||
TransScrap.source_table == 'trans_borrow')
|
||||
).join(StockSemi, TransBorrow.stock_id == StockSemi.id).join(
|
||||
MaterialBase, StockSemi.base_id == MaterialBase.id
|
||||
).filter(MaterialBase.company_name == company_limit)
|
||||
borrow_stock_product = db.session.query(TransScrap.id).join(
|
||||
TransBorrow, db.and_(TransScrap.stock_id == TransBorrow.id,
|
||||
TransScrap.source_table == 'trans_borrow')
|
||||
).join(StockProduct, TransBorrow.stock_id == StockProduct.id).join(
|
||||
MaterialBase, StockProduct.base_id == MaterialBase.id
|
||||
).filter(MaterialBase.company_name == company_limit)
|
||||
all_matches = buy_subq.union(
|
||||
semi_subq, product_subq, repair_subq,
|
||||
borrow_stock_buy, borrow_stock_semi, borrow_stock_product
|
||||
).subquery()
|
||||
query = query.filter(TransScrap.id.in_(all_matches))
|
||||
|
||||
# 按时间倒序
|
||||
@ -390,7 +413,24 @@ class ScrapService:
|
||||
material_name = ''
|
||||
spec_model = ''
|
||||
|
||||
if r.source_table == 'trans_repair':
|
||||
if r.source_table == 'trans_borrow':
|
||||
# 借库转报废:stock_id 指向 trans_borrow.id,通过源库存表取物料
|
||||
from app.models.transaction import TransBorrow
|
||||
borrow = TransBorrow.query.get(r.stock_id)
|
||||
if borrow:
|
||||
bstock_model = None
|
||||
if borrow.source_table == 'stock_buy':
|
||||
bstock_model = StockBuy.query.get(borrow.stock_id)
|
||||
elif borrow.source_table == 'stock_semi':
|
||||
bstock_model = StockSemi.query.get(borrow.stock_id)
|
||||
elif borrow.source_table == 'stock_product':
|
||||
bstock_model = StockProduct.query.get(borrow.stock_id)
|
||||
if bstock_model and hasattr(bstock_model, 'base_id') and bstock_model.base_id:
|
||||
base = MaterialBase.query.get(bstock_model.base_id)
|
||||
if base:
|
||||
material_name = base.name or ''
|
||||
spec_model = base.spec_model or ''
|
||||
elif r.source_table == 'trans_repair':
|
||||
# 维修单
|
||||
repair = TransRepair.query.get(r.stock_id)
|
||||
if repair:
|
||||
|
||||
Reference in New Issue
Block a user