feat: 优化BOM表单交互 - 另存为版本号选择与用量输入体验"

This commit is contained in:
dxc
2026-03-06 10:12:12 +08:00
parent 8091c5f326
commit 3cc5e77729

View File

@ -97,8 +97,17 @@
</el-form-item>
</el-col>
<el-col :span="10">
<!-- 任务1另存为模式显示版本选项新建/编辑模式显示输入框 -->
<el-form-item label="版本号" prop="version" v-if="hasFormFieldPermission('version')">
<el-input v-model="form.version" placeholder="如: V1.0" />
<template v-if="isSaveAsMode">
<el-radio-group v-model="form.versionUpgradeType" @change="onVersionUpgradeTypeChange">
<el-radio-button label="minor">升级次版本 ({{ versionOptions.minor }})</el-radio-button>
<el-radio-button label="major">升级主版本 ({{ versionOptions.major }})</el-radio-button>
</el-radio-group>
</template>
<template v-else>
<el-input v-model="form.version" placeholder="如: V1.0" />
</template>
</el-form-item>
</el-col>
</el-row>
@ -113,6 +122,7 @@
placeholder="请搜索原料"
filterable
style="width: 100%"
@change="(val) => onChildChange(val, $index)"
>
<el-option
v-for="item in materialOptions"
@ -131,7 +141,8 @@
<el-table-column label="用量" width="140" v-if="hasFormFieldPermission('dosage')">
<template #default="{ row }">
<el-input-number v-model="row.dosage" :min="0" :precision="4" style="width: 100%" controls-position="right" />
<!-- 任务2整数精度去掉调节按钮 -->
<el-input-number v-model="row.dosage" :min="0" :precision="0" style="width: 100%" :controls="false" />
</template>
</el-table-column>
@ -196,6 +207,8 @@ const loading = ref(false)
const dialogVisible = ref(false)
const saving = ref(false)
const isEditMode = ref(false)
const isSaveAsMode = ref(false) // 任务1标记是否为另存为模式
let originalVersion = '' // 保存原始版本号用于计算升级选项
const bomList = ref<BomItem[]>([])
const materialOptions = ref<MaterialBase[]>([])
@ -242,6 +255,7 @@ const form = reactive({
bom_suffix: '', // 用户输入的后缀
parent_id: null as number | null,
version: 'V1.0',
versionUpgradeType: 'minor' as 'minor' | 'major', // 任务1另存为时的版本升级类型
is_enabled: true,
children: [] as ChildRow[]
})
@ -254,6 +268,28 @@ const fullBomNo = computed(() => {
return form.bom_suffix
})
// 任务1根据原版本号计算升级选项
const versionOptions = computed(() => {
const ver = originalVersion || 'V1.0'
// 解析版本号格式 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`
}
}
// 无法解析时返回默认选项
return { minor: 'V1.1', major: 'V2.0' }
})
// 任务1版本升级类型变更时更新版本号
const onVersionUpgradeTypeChange = (type: 'minor' | 'major') => {
form.version = versionOptions.value[type]
}
const rules = reactive<FormRules>({
parent_id: [{ required: true, message: '请选择父件', trigger: 'change' }],
version: [{ required: true, message: '请输入版本号', trigger: 'blur' }]
@ -291,10 +327,18 @@ const onParentChange = (val: number) => {
}
}
// 任务2子件物料选中后自动设置用量为1
const onChildChange = (val: number | null, index: number) => {
if (val !== null) {
form.children[index].dosage = 1
}
}
const handleCreate = () => {
resetForm()
dialogTitle.value = '新建 BOM'
isEditMode.value = false
isSaveAsMode.value = false // 确保新建模式
dialogVisible.value = true
}
@ -302,16 +346,21 @@ const handleEdit = async (row: BomItem) => {
await loadDetail(row.bom_no, row.version)
dialogTitle.value = '编辑 BOM'
isEditMode.value = true // 编辑时不允许修改编号前缀/后缀
isSaveAsMode.value = false // 确保编辑模式
dialogVisible.value = true
}
const handleSaveAs = async (row: BomItem) => {
await loadDetail(row.bom_no, row.version)
dialogTitle.value = '另存为新版/变体'
isEditMode.value = true // 另存为时,编号部分依然锁定(因为我们是在同一个编号下新增版本)
isEditMode.value = true
isSaveAsMode.value = true // 任务1进入另存为模式显示版本选项
// 提示用户修改版本号
form.version = form.version + '_V2'
// 保存原始版本号用于计算升级选项
originalVersion = form.version
// 默认选中次版本升级
form.versionUpgradeType = 'minor'
form.version = versionOptions.value.minor
dialogVisible.value = true
}
@ -365,8 +414,11 @@ const resetForm = () => {
form.bom_suffix = ''
form.parent_id = null
form.version = 'V1.0'
form.versionUpgradeType = 'minor'
form.is_enabled = true
form.children = []
isSaveAsMode.value = false // 任务1重置另存为模式
originalVersion = ''
if (formRef.value) formRef.value.resetFields()
}