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