diff --git a/inventory-backend/app/api/v1/scrap.py b/inventory-backend/app/api/v1/scrap.py
index 186b915..0a81639 100644
--- a/inventory-backend/app/api/v1/scrap.py
+++ b/inventory-backend/app/api/v1/scrap.py
@@ -4,7 +4,7 @@ from flask_jwt_extended import jwt_required, get_jwt_identity, get_jwt
from app.utils.decorators import permission_required, audit_log
from app.services.auth_service import AuthService
from app.extensions import db
-from app.models.transaction import TransScrap
+from app.models.transaction import TransScrap, TransRepair
from app.models.inbound.buy import StockBuy
from app.models.inbound.semi import StockSemi
from app.models.inbound.product import StockProduct
@@ -172,6 +172,28 @@ class ScrapService:
res['price'] = get_price(buy, 'stock_buy')
return res
+ # 4. 查询维修单 (TransRepair)
+ repair = TransRepair.query.filter(
+ db.or_(TransRepair.sku == clean_code, TransRepair.serial_number == clean_code)
+ ).filter(
+ TransRepair.repair_status.notin_(['已出库', '报废转出'])
+ ).first()
+ if repair:
+ return {
+ 'id': repair.id,
+ 'sku': repair.sku,
+ 'barcode': repair.sku,
+ 'name': repair.material_name or '维修件',
+ 'spec': '',
+ 'category': '',
+ 'material_type': '',
+ 'warehouse_loc': repair.customer_location or '',
+ 'stock_quantity': 1,
+ 'available_quantity': 1,
+ 'source_table': 'trans_repair',
+ 'price': float(repair.sale_price) if repair.sale_price else 0
+ }
+
return None
@staticmethod
@@ -210,6 +232,31 @@ class ScrapService:
if not stock_id or not source_table or scrap_qty <= 0:
continue
+ # 处理维修单报废
+ if source_table == 'trans_repair':
+ repair = TransRepair.query.get(stock_id)
+ if not repair:
+ raise ValueError(f'维修单不存在: ID={stock_id}')
+
+ # 更新维修单状态为报废转出
+ repair.repair_status = '报废转出'
+
+ # 创建报废记录
+ scrap_record = TransScrap(
+ sku=repair.sku,
+ source_table='trans_repair',
+ stock_id=stock_id,
+ quantity=1,
+ reason=reason,
+ operator_name=operator_name,
+ approval_status='approved',
+ cost_at_scrap=float(repair.cost_price) if repair.cost_price else 0,
+ total_loss=float(repair.cost_price) if repair.cost_price else 0
+ )
+ db.session.add(scrap_record)
+ created_records.append(scrap_record)
+ continue
+
# 获取库存记录
stock_record = None
if source_table == 'stock_product':
diff --git a/inventory-backend/app/services/inbound/repair_service.py b/inventory-backend/app/services/inbound/repair_service.py
index 7b57f4b..0bd8021 100644
--- a/inventory-backend/app/services/inbound/repair_service.py
+++ b/inventory-backend/app/services/inbound/repair_service.py
@@ -209,6 +209,10 @@ class RepairInboundService:
if status == '已出库':
raise ValueError("禁止手动变更为已出库状态,请通过扫码出库模块进行操作")
+ # 禁止手动变更为报废转出状态,必须通过扫码报废模块进行
+ if status == '报废转出':
+ raise ValueError("禁止手动变更为报废状态,请前往报废管理进行扫码操作")
+
repair = TransRepair.query.get(id)
if not repair:
return None
diff --git a/inventory-web/src/views/stock/inbound/repair.vue b/inventory-web/src/views/stock/inbound/repair.vue
index 21ab4eb..b1cdcd5 100644
--- a/inventory-web/src/views/stock/inbound/repair.vue
+++ b/inventory-web/src/views/stock/inbound/repair.vue
@@ -186,7 +186,6 @@
-