diff --git a/inventory-web/src/views/bom/BomManage.vue b/inventory-web/src/views/bom/BomManage.vue index eb6019a..4b44476 100644 --- a/inventory-web/src/views/bom/BomManage.vue +++ b/inventory-web/src/views/bom/BomManage.vue @@ -223,6 +223,7 @@ const saving = ref(false) const isEditMode = ref(false) const isSaveAsMode = ref(false) // 任务1:标记是否为另存为模式 let originalVersion = '' // 保存原始版本号用于计算升级选项 +let currentBomNo = '' // 保存当前操作的 BOM 编号用于计算版本避让 const bomList = ref([]) const materialOptions = ref([]) @@ -310,21 +311,50 @@ const fullBomNo = computed(() => { return form.bom_suffix }) -// 任务1:根据原版本号计算升级选项 +// 任务1:根据原版本号计算升级选项(智能避让已占用版本) const versionOptions = computed(() => { const ver = originalVersion || 'V1.0' + + // 获取当前 BOM 编号下所有已占用的版本号集合 + const occupiedVersions = new Set( + bomList.value + .filter(item => item.bom_no === currentBomNo) + .map(item => item.version) + ) + + // 智能递增避让函数 + const getNextMinor = (baseMajor: number, baseMinor: number): string => { + let minor = baseMinor + 1 + let candidate = `V${baseMajor}.${minor}` + while (occupiedVersions.has(candidate)) { + minor++ + candidate = `V${baseMajor}.${minor}` + } + return candidate + } + + const getNextMajor = (baseMajor: number): string => { + let major = baseMajor + 1 + let candidate = `V${major}.0` + while (occupiedVersions.has(candidate)) { + major++ + candidate = `V${major}.0` + } + return candidate + } + // 解析版本号格式 Vx.y const match = ver.match(/^V(\d+)\.(\d+)$/) if (match) { const major = parseInt(match[1]) const minor = parseInt(match[2]) return { - minor: `V${major}.${minor + 1}`, - major: `V${major + 1}.0` + minor: getNextMinor(major, minor), + major: getNextMajor(major) } } - // 无法解析时返回默认选项 - return { minor: 'V1.1', major: 'V2.0' } + // 无法解析时返回默认选项(带避让) + return { minor: getNextMinor(1, 0), major: getNextMajor(1) } }) // 任务1:版本升级类型变更时更新版本号 @@ -408,8 +438,9 @@ const handleSaveAs = async (row: BomItem) => { isEditMode.value = true isSaveAsMode.value = true // 任务1:进入另存为模式,显示版本选项 - // 保存原始版本号用于计算升级选项 + // 保存原始版本号和 BOM 编号用于计算升级选项 originalVersion = form.version + currentBomNo = row.bom_no // 保存当前操作的 BOM 编号 // 默认选中次版本升级 form.versionUpgradeType = 'minor' form.version = versionOptions.value.minor @@ -471,6 +502,7 @@ const resetForm = () => { form.children = [] isSaveAsMode.value = false // 任务1:重置另存为模式 originalVersion = '' + currentBomNo = '' // 重置当前 BOM 编号 childSearchKeyword.value = '' // 任务2:重置搜索关键字 if (formRef.value) formRef.value.resetFields() }