feat: 增加 BOM 另存为跨版本内容查重校验
This commit is contained in:
@ -143,7 +143,7 @@ class BomService:
|
||||
|
||||
@staticmethod
|
||||
def save_bom(data):
|
||||
"""保存 BOM (支持多版本)"""
|
||||
"""保存 BOM (支持多版本),新增跨版本内容查重"""
|
||||
bom_no = data.get('bom_no')
|
||||
version = data.get('version', 'V1.0')
|
||||
parent_id = data['parent_id']
|
||||
@ -157,6 +157,38 @@ class BomService:
|
||||
if child['child_id'] == parent_id:
|
||||
raise ValueError('父件与子件不能是同一物料')
|
||||
|
||||
# ===== 跨版本内容查重 =====
|
||||
# 将当前提交的 children 转换为可比较的集合 (child_id, dosage)
|
||||
current_children_set = set()
|
||||
for child in children:
|
||||
# 用 (child_id, dosage) 元组表示,dosage 转为整数比较
|
||||
dosage_val = int(child.get('dosage', 0)) if child.get('dosage') else 0
|
||||
current_children_set.add((child['child_id'], dosage_val))
|
||||
|
||||
# 查询该 bom_no 下所有其他版本的子件配置
|
||||
existing_versions = db.session.query(
|
||||
BomTable.version,
|
||||
BomTable.child_id,
|
||||
BomTable.dosage
|
||||
).filter(
|
||||
BomTable.bom_no == bom_no,
|
||||
BomTable.version != version # 排除当前正在保存的版本
|
||||
).all()
|
||||
|
||||
# 按版本分组,构建每个版本的子件集合
|
||||
version_children = {}
|
||||
for ver, child_id, dosage in existing_versions:
|
||||
if ver not in version_children:
|
||||
version_children[ver] = set()
|
||||
dosage_val = int(dosage) if dosage else 0
|
||||
version_children[ver].add((child_id, dosage_val))
|
||||
|
||||
# 比对每个版本
|
||||
for ver, existing_set in version_children.items():
|
||||
if current_children_set == existing_set:
|
||||
raise ValueError(f'保存失败!当前子件配置与已有版本 {ver} 完全一致,请勿重复保存')
|
||||
|
||||
# ===== 执行保存 =====
|
||||
# 仅删除当前版本的旧记录
|
||||
BomTable.query.filter_by(bom_no=bom_no, version=version).delete()
|
||||
|
||||
|
||||
Reference in New Issue
Block a user