feat(scrap): integrate repair items into physical scrap scanning flow and lock manual status

This commit is contained in:
DXC
2026-04-09 09:53:20 +08:00
parent d3a143288b
commit 454f9b1184
3 changed files with 52 additions and 2 deletions

View File

@ -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.utils.decorators import permission_required, audit_log
from app.services.auth_service import AuthService from app.services.auth_service import AuthService
from app.extensions import db 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.buy import StockBuy
from app.models.inbound.semi import StockSemi from app.models.inbound.semi import StockSemi
from app.models.inbound.product import StockProduct from app.models.inbound.product import StockProduct
@ -172,6 +172,28 @@ class ScrapService:
res['price'] = get_price(buy, 'stock_buy') res['price'] = get_price(buy, 'stock_buy')
return res 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 return None
@staticmethod @staticmethod
@ -210,6 +232,31 @@ class ScrapService:
if not stock_id or not source_table or scrap_qty <= 0: if not stock_id or not source_table or scrap_qty <= 0:
continue 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 stock_record = None
if source_table == 'stock_product': if source_table == 'stock_product':

View File

@ -209,6 +209,10 @@ class RepairInboundService:
if status == '已出库': if status == '已出库':
raise ValueError("禁止手动变更为已出库状态,请通过扫码出库模块进行操作") raise ValueError("禁止手动变更为已出库状态,请通过扫码出库模块进行操作")
# 禁止手动变更为报废转出状态,必须通过扫码报废模块进行
if status == '报废转出':
raise ValueError("禁止手动变更为报废状态,请前往报废管理进行扫码操作")
repair = TransRepair.query.get(id) repair = TransRepair.query.get(id)
if not repair: if not repair:
return None return None

View File

@ -186,7 +186,6 @@
<el-option label="维修中" value="维修中" /> <el-option label="维修中" value="维修中" />
<el-option label="等待配件" value="等待配件" /> <el-option label="等待配件" value="等待配件" />
<el-option label="已修复" value="已修复" /> <el-option label="已修复" value="已修复" />
<el-option label="报废转出" value="报废转出" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="追加日志" prop="repair_log"> <el-form-item label="追加日志" prop="repair_log">