feat: implement dynamic inspection requirement logic based on material master data

This commit is contained in:
DXC
2026-03-17 11:56:04 +08:00
parent 368298a29d
commit c1c494893f
8 changed files with 273 additions and 14 deletions

View File

@ -75,7 +75,9 @@ class MaterialBaseService:
'category': item.category,
'unit': item.unit,
'type': item.material_type,
'status': '启用'
'status': '启用',
# 强制质检标记
'isInspectionRequired': bool(item.is_inspection_required)
})
return results
except Exception as e:

View File

@ -94,6 +94,22 @@ class BuyInboundService:
if not material: raise ValueError("所选物料不存在")
if not material.is_enabled: raise ValueError(f"物料【{material.name}】已停用")
# ============================================================
# 强制质检校验:如果物料标记为强制质检,则必须提供到检状态和检测报告
# ============================================================
if material.is_inspection_required:
inspection_status = data.get('inspection_status')
if not inspection_status:
raise ValueError(f"物料【{material.name}】为强管控物料,必须选择到检状态")
# 检查检测报告:文件列表或外部链接至少有一个
# 前端会将外部链接添加到 inspection_report 数组中一起提交
inspection_report_list = data.get('inspection_report', [])
has_report_file = inspection_report_list and len(inspection_report_list) > 0
if not has_report_file:
raise ValueError(f"物料【{material.name}】为强管控物料,必须提供检测报告文件或外部链接")
BuyInboundService._check_unique(
base_id=base_id,
serial_number=data.get('serial_number'),
@ -171,7 +187,36 @@ class BuyInboundService:
try:
stock = StockBuy.query.get(stock_id)
if not stock: raise ValueError("记录不存在")
BuyInboundService._check_unique(base_id=data.get('base_id', stock.base_id),
# 获取物料信息用于校验
base_id = data.get('base_id', stock.base_id)
material = MaterialBase.query.get(base_id)
# ============================================================
# 强制质检校验:如果物料标记为强制质检,则必须提供到检状态和检测报告
# ============================================================
if material and material.is_inspection_required:
inspection_status = data.get('inspection_status', stock.inspection_status)
if not inspection_status:
raise ValueError(f"物料【{material.name}】为强管控物料,必须选择到检状态")
# 检查检测报告:文件列表至少有一个
inspection_report_list = data.get('inspection_report')
if inspection_report_list is None:
# 如果没有传入,使用现有的
import json as json_module
try:
existing_reports = json_module.loads(stock.inspection_report) if stock.inspection_report else []
except:
existing_reports = []
has_report_file = existing_reports and len(existing_reports) > 0
else:
has_report_file = inspection_report_list and len(inspection_report_list) > 0
if not has_report_file:
raise ValueError(f"物料【{material.name}】为强管控物料,必须提供检测报告文件或外部链接")
BuyInboundService._check_unique(base_id=base_id,
serial_number=data.get('serial_number', stock.serial_number),
batch_number=data.get('batch_number', stock.batch_number),
exclude_id=stock_id)