半成品/成品入库:BOM 编号下拉按父件规格联动过滤(前后端双端改造)

- 后端 /inbound/{semi,product}/search-bom 增加 parent_spec 可选参数,Service 层在 MaterialBase.spec_model 上加等值过滤
This commit is contained in:
DXC
2026-06-04 16:01:48 +08:00
parent 332ae3c4cf
commit 8a2da1ac1e
8 changed files with 36 additions and 18 deletions

View File

@ -43,11 +43,11 @@ export function searchMaterialBase(keyword: string, page: number = 1) {
}
// 搜索BOM
export function searchBom(keyword: string) {
export function searchBom(keyword: string, parent_spec?: string) {
return request({
url: '/inbound/product/search-bom',
method: 'get',
params: { keyword }
params: { keyword, parent_spec }
})
}

View File

@ -45,11 +45,11 @@ export function searchMaterialBase(keyword: string, page: number = 1) {
}
// 5.5 搜索BOM (新增)
export function searchBom(keyword: string) {
export function searchBom(keyword: string, parent_spec?: string) {
return request({
url: '/inbound/semi/search-bom',
method: 'get',
params: { keyword }
params: { keyword, parent_spec }
})
}

View File

@ -461,7 +461,8 @@
filterable
remote
clearable
placeholder="搜规格/编号"
:disabled="!form.spec_model"
:placeholder="!form.spec_model ? '请先在上方选择入库物料' : '搜规格/编号'"
:remote-method="handleSearchBom"
:loading="bomSearchLoading"
@change="handleBomSelect"
@ -544,10 +545,10 @@
</el-dialog>
<el-dialog v-model="dialogVisibleImage" append-to-body width="50%">
<el-dialog v-model="dialogVisibleImage" append-to-body width="50%" :close-on-click-modal="false" :close-on-press-escape="false">
<img style="width: 100%" :src="dialogImageUrl" alt="Preview Image" />
</el-dialog>
<el-dialog v-model="cameraDialogVisible" title="拍照上传" width="500px" append-to-body destroy-on-close :close-on-click-modal="false">
<el-dialog v-model="cameraDialogVisible" title="拍照上传" width="500px" append-to-body destroy-on-close :close-on-click-modal="false" :close-on-press-escape="false">
<WebRtcCamera
ref="cameraRef"
@photo-submit="handleCameraConfirm"
@ -555,7 +556,7 @@
/>
</el-dialog>
<el-dialog v-model="printVisible" title="标签打印预览" width="400px" destroy-on-close append-to-body>
<el-dialog v-model="printVisible" title="标签打印预览" width="400px" destroy-on-close append-to-body :close-on-click-modal="false" :close-on-press-escape="false">
<div style="text-align: center;">
<div v-loading="printLoading" class="preview-box">
<img v-if="previewUrl" :src="previewUrl" alt="Label Preview" style="width: 100%; border: 1px solid #ccc;"/>
@ -957,7 +958,7 @@ const form = reactive({
const handleSearchBom = async (query: string) => {
bomSearchLoading.value = true
try {
const res: any = await searchBom(query)
const res: any = await searchBom(query, form.spec_model)
bomOptions.value = res.data || []
} finally { bomSearchLoading.value = false }
}
@ -1108,6 +1109,10 @@ const onMaterialSelected = async (val: number) => {
form.material_type = item.type
form.category = item.category
form.unit = item.unit
// 切换物料时清空已选 BOM防止脏数据
form.bom_code = ''
form.bom_version = ''
bomOptions.value = []
// 获取该物料历史入库库位(新增独立接口)
try {

View File

@ -526,7 +526,8 @@
filterable
remote
clearable
placeholder="搜规格/编号"
:disabled="!form.spec_model"
:placeholder="!form.spec_model ? '请先在上方选择入库物料' : '搜规格/编号'"
:remote-method="handleSearchBom"
:loading="bomSearchLoading"
@change="handleBomSelect"
@ -603,15 +604,15 @@
</template>
</el-dialog>
<el-dialog v-model="dialogVisibleImage" append-to-body width="50%"><img style="width: 100%" :src="dialogImageUrl" alt="Preview Image" /></el-dialog>
<el-dialog v-model="cameraDialogVisible" title="拍照上传" width="500px" append-to-body destroy-on-close :close-on-click-modal="false">
<el-dialog v-model="dialogVisibleImage" append-to-body width="50%" :close-on-click-modal="false" :close-on-press-escape="false"><img style="width: 100%" :src="dialogImageUrl" alt="Preview Image" /></el-dialog>
<el-dialog v-model="cameraDialogVisible" title="拍照上传" width="500px" append-to-body destroy-on-close :close-on-click-modal="false" :close-on-press-escape="false">
<WebRtcCamera
ref="cameraRef"
@photo-submit="handleCameraConfirm"
@cancel="cameraDialogVisible = false"
/>
</el-dialog>
<el-dialog v-model="printVisible" title="标签打印预览" width="400px" destroy-on-close append-to-body>
<el-dialog v-model="printVisible" title="标签打印预览" width="400px" destroy-on-close append-to-body :close-on-click-modal="false" :close-on-press-escape="false">
<div style="text-align: center;">
<div v-loading="printLoading" class="preview-box">
<img v-if="previewUrl" :src="previewUrl" alt="Label Preview" style="width: 100%; border: 1px solid #ccc;"/>
@ -1004,7 +1005,7 @@ watch(
const handleSearchBom = async (query: string) => {
bomSearchLoading.value = true
try {
const res: any = await searchBom(query)
const res: any = await searchBom(query, form.spec_model)
bomOptions.value = res.data || []
} finally { bomSearchLoading.value = false }
}
@ -1102,6 +1103,10 @@ const onMaterialSelected = async (val: number) => {
form.category = item.category
form.unit = item.unit
form.material_type = item.type
// 切换物料时清空已选 BOM防止脏数据
form.bom_code = ''
form.bom_version = ''
bomOptions.value = []
checkHistoryAndSetMode(item.id)
// 获取该物料历史入库库位(新增独立接口)