refactor: 安全提取纯净BOM编号,将原后缀输入框改为备注功能

This commit is contained in:
DXC
2026-03-06 17:32:35 +08:00
parent 59eebb5736
commit bab7f34c17

View File

@ -87,17 +87,20 @@
</el-row>
<el-row :gutter="20">
<el-col :span="14">
<el-form-item label="BOM 编号" required v-if="hasFormFieldPermission('bom_suffix')">
<el-input v-model="form.bom_suffix" placeholder="输入后缀 (如 -001)" :disabled="isEditMode">
<template #prepend v-if="form.bom_prefix">{{ form.bom_prefix }}</template>
</el-input>
<el-col :span="10">
<el-form-item label="BOM 编号" required v-if="hasFormFieldPermission('bom_no')">
<el-input v-model="form.bom_no" placeholder="选择父件后自动生成" disabled />
<div style="font-size: 12px; color: #909399; line-height: 1.2; margin-top: 4px;">
最终编号: <span style="font-weight: bold">{{ fullBomNo }}</span>
编号预览: <span style="font-weight: bold">{{ form.bom_no || '请选择父件' }}</span>
</div>
</el-form-item>
</el-col>
<el-col :span="10">
<el-col :span="6">
<el-form-item label="备注" v-if="hasFormFieldPermission('remark')">
<el-input v-model="form.remark" placeholder="备注信息(可选)" />
</el-form-item>
</el-col>
<el-col :span="8">
<!-- 任务1另存为模式显示版本选项新建/编辑模式显示输入框 -->
<el-form-item label="版本号" prop="version" v-if="hasFormFieldPermission('version')">
<template v-if="isSaveAsMode">
@ -269,7 +272,7 @@ const permissionMap: Record<string, string> = {
// 表单字段
parent_id: 'bom_manage:parent_id',
is_enabled: 'bom_manage:status',
bom_suffix: 'bom_manage:bom_no',
bom_no: 'bom_manage:bom_no',
child_id: 'bom_manage:child_id',
dosage: 'bom_manage:dosage',
remark: 'bom_manage:remark',
@ -295,8 +298,8 @@ const hasFormFieldPermission = (fieldName: string) => {
const formRef = ref<FormInstance>()
const form = reactive({
bom_prefix: '', // 自动生成的父件规格前缀
bom_suffix: '', // 用户输入的后缀
bom_no: '', // 纯净的 BOM 编号(从父件规格提取)
remark: '', // BOM 备注信息
parent_id: null as number | null,
version: 'V1.0',
versionUpgradeType: 'minor' as 'minor' | 'major', // 任务1另存为时的版本升级类型
@ -304,13 +307,8 @@ const form = reactive({
children: [] as ChildRow[]
})
// 计算最终的 BOM 编号
const fullBomNo = computed(() => {
if (form.bom_prefix) {
return form.bom_prefix + (form.bom_suffix ? ('-' + form.bom_suffix) : '')
}
return form.bom_suffix
})
// 纯净 BOM 编号(直接从表单获取,无拼接逻辑)
const pureBomNo = computed(() => form.bom_no)
// 任务1根据原版本号计算升级选项智能避让已占用版本
const versionOptions = computed(() => {
@ -390,13 +388,15 @@ const fetchMaterialOptions = async () => {
}
}
// 监听父件变化,自动设置前缀
// 监听父件变化,自动设置纯净的 BOM 编号
const onParentChange = (val: number) => {
const selected = materialOptions.value.find(m => m.id === val)
if (selected && selected.spec) {
form.bom_prefix = selected.spec
// 安全提取:取 / 前面的部分作为纯净 BOM 编号
const rawSpec = selected.spec || ''
form.bom_no = rawSpec.split('/')[0].trim()
} else {
form.bom_prefix = ''
form.bom_no = ''
}
}
@ -464,17 +464,15 @@ const loadDetail = async (bomNo: string, version: string) => {
remark: child.remark || ''
}))
// 解析编号到 前缀/后缀
if (data.parent_spec && bomNo.startsWith(data.parent_spec)) {
form.bom_prefix = data.parent_spec
// 移除前缀和可能的分隔符
let suffix = bomNo.substring(data.parent_spec.length)
if (suffix.startsWith('-')) suffix = suffix.substring(1)
form.bom_suffix = suffix
// 解析编号:安全提取纯净 BOM 编号
if (data.parent_spec) {
form.bom_no = (data.parent_spec || '').split('/')[0].trim()
} else {
form.bom_prefix = ''
form.bom_suffix = bomNo
// 无父件规格时直接使用 bom_no
form.bom_no = bomNo.split('/')[0].trim()
}
// 加载备注信息
form.remark = data.remark || ''
}
} catch (e) {
// 错误已由全局拦截器统一处理
@ -496,8 +494,8 @@ const handleDelete = (row: BomItem) => {
}
const resetForm = () => {
form.bom_prefix = ''
form.bom_suffix = ''
form.bom_no = ''
form.remark = ''
form.parent_id = null
form.version = 'V1.0'
form.versionUpgradeType = 'minor'
@ -517,7 +515,7 @@ const submitForm = async () => {
if (!formRef.value) return
await formRef.value.validate(async (valid) => {
if (!valid) return
if (!fullBomNo.value) return ElMessage.warning('BOM编号不能为空')
if (!pureBomNo.value) return ElMessage.warning('BOM编号不能为空')
if (form.children.length === 0) return ElMessage.warning('请至少添加一个子件')
// 任务1提交前校验重复子件
@ -543,7 +541,8 @@ const submitForm = async () => {
}
const payload = {
bom_no: fullBomNo.value,
bom_no: pureBomNo.value,
remark: form.remark,
version: form.version,
parent_id: form.parent_id,
is_enabled: form.is_enabled,