From 454f9b1184cc16835025a332ee6b9c1acdd44566 Mon Sep 17 00:00:00 2001 From: DXC Date: Thu, 9 Apr 2026 09:53:20 +0800 Subject: [PATCH] feat(scrap): integrate repair items into physical scrap scanning flow and lock manual status --- inventory-backend/app/api/v1/scrap.py | 49 ++++++++++++++++++- .../app/services/inbound/repair_service.py | 4 ++ .../src/views/stock/inbound/repair.vue | 1 - 3 files changed, 52 insertions(+), 2 deletions(-) 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 @@ -