fix: 完善另存为版本推算逻辑,自动避让已存在的版本号

This commit is contained in:
dxc
2026-03-06 10:33:48 +08:00
parent 9c32733234
commit 902c4f248f

View File

@ -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<BomItem[]>([])
const materialOptions = ref<MaterialBase[]>([])
@ -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()
}