✨ feat(select): 增加批次和仓库过滤功能,优化库存选择器
parent
606a9ed6e8
commit
55cb175f5a
|
|
@ -12,6 +12,7 @@ export interface WmMaterialStockVO {
|
|||
batchId: number
|
||||
batchCode: string
|
||||
warehouseId: number
|
||||
warehouseCode: string
|
||||
warehouseName: string
|
||||
locationId: number
|
||||
locationName: string
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
<!--
|
||||
MES 生产任务弹窗选择器(支持单选/多选)
|
||||
|
||||
搜索字段、展示字段对齐 KTG TaskSelect
|
||||
|
||||
Props:
|
||||
multiple — true 多选(checkbox),false 单选(radio);默认 true
|
||||
Events:
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
<!--
|
||||
MES 质检指标弹窗选择器(支持单选/多选)
|
||||
|
||||
搜索字段、展示字段对齐 KTG qcindexSelect/single.vue
|
||||
|
||||
Props:
|
||||
multiple — true 多选(checkbox),false 单选(radio);默认 true
|
||||
Events:
|
||||
|
|
|
|||
|
|
@ -1,9 +1,6 @@
|
|||
<!--
|
||||
MES 到货通知单行弹窗选择器(单选模式)
|
||||
|
||||
对齐 KTG noticeSelect/lineSingle.vue:
|
||||
展示字段:物料编码、物料名称、规格型号、单位、到货数量、是否检验、合格数量、检验单号、备注
|
||||
|
||||
Props:
|
||||
noticeId — 到货通知单编号(必传,按此筛选行数据)
|
||||
Events:
|
||||
|
|
|
|||
|
|
@ -5,6 +5,9 @@
|
|||
Props:
|
||||
modelValue — 绑定的批次 ID(v-model)
|
||||
itemId — 默认过滤的物料 ID(打开弹窗时预设物料过滤条件)
|
||||
clientId — 默认过滤的客户 ID
|
||||
vendorId — 默认过滤的供应商 ID
|
||||
salesOrderCode — 默认过滤的销售订单编号
|
||||
disabled — 是否禁用
|
||||
clearable — 是否允许清空(鼠标悬停时显示清除图标)
|
||||
placeholder — 占位文字
|
||||
|
|
@ -61,6 +64,7 @@ const props = withDefaults(
|
|||
itemId?: number // 默认过滤的物料 ID
|
||||
clientId?: number // 默认过滤的客户 ID
|
||||
vendorId?: number // 默认过滤的供应商 ID
|
||||
salesOrderCode?: string // 默认过滤的销售订单编号
|
||||
disabled?: boolean // 是否禁用
|
||||
clearable?: boolean // 是否允许清空
|
||||
placeholder?: string // 占位文字
|
||||
|
|
@ -141,7 +145,7 @@ const handleClick = (e: MouseEvent) => {
|
|||
}
|
||||
// 打开弹窗,传入当前选中 ID 用于预选高亮,传入 itemId 用于默认过滤
|
||||
const selectedIds = props.modelValue != null ? [props.modelValue] : []
|
||||
dialogRef.value.open(selectedIds, props.itemId, props.clientId, props.vendorId)
|
||||
dialogRef.value.open(selectedIds, props.itemId, props.clientId, props.vendorId, props.salesOrderCode)
|
||||
}
|
||||
|
||||
/** 弹窗选中回调 */
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@
|
|||
<Dialog title="批次选择" v-model="dialogVisible" width="75%">
|
||||
<ContentWrap>
|
||||
<el-alert
|
||||
v-if="externalClientId != null || externalVendorId != null"
|
||||
v-if="showAlert"
|
||||
:title="alertTitle"
|
||||
type="info"
|
||||
:closable="false"
|
||||
|
|
@ -402,7 +402,7 @@ const resetQuery = () => {
|
|||
queryParams.workstationId = undefined
|
||||
queryParams.toolId = undefined
|
||||
queryParams.moldId = undefined
|
||||
queryParams.salesOrderCode = undefined
|
||||
queryParams.salesOrderCode = externalSalesOrderCode.value
|
||||
queryParams.purchaseOrderCode = undefined
|
||||
queryParams.lotNumber = undefined
|
||||
queryParams.qualityStatus = undefined
|
||||
|
|
@ -432,31 +432,51 @@ const confirmSelect = () => {
|
|||
|
||||
const externalClientId = ref<number | undefined>() // 记录外部传入的 clientId
|
||||
const externalVendorId = ref<number | undefined>() // 记录外部传入的 vendorId
|
||||
const externalSalesOrderCode = ref<string | undefined>() // 记录外部传入的 salesOrderCode
|
||||
|
||||
/** 拼装 el-alert 提示文字 */
|
||||
const alertTitle = computed(() => {
|
||||
const parts: string[] = []
|
||||
if (externalClientId.value != null) parts.push('客户')
|
||||
if (externalVendorId.value != null) parts.push('供应商')
|
||||
if (externalClientId.value != null) {
|
||||
parts.push('客户')
|
||||
}
|
||||
if (externalVendorId.value != null) {
|
||||
parts.push('供应商')
|
||||
}
|
||||
if (externalSalesOrderCode.value != null) {
|
||||
parts.push('销售订单')
|
||||
}
|
||||
return `已按${parts.join('/')}预过滤`
|
||||
})
|
||||
|
||||
/** 是否显示 alert 提示 */
|
||||
const showAlert = computed(() => {
|
||||
return (
|
||||
externalClientId.value != null ||
|
||||
externalVendorId.value != null ||
|
||||
externalSalesOrderCode.value != null
|
||||
)
|
||||
})
|
||||
|
||||
/**
|
||||
* 打开弹窗
|
||||
* @param selectedIds 已选 ID,用于预选高亮
|
||||
* @param itemId 默认过滤的物料 ID
|
||||
* @param clientId 默认过滤的客户 ID
|
||||
* @param vendorId 默认过滤的供应商 ID
|
||||
* @param salesOrderCode 默认过滤的销售订单编号
|
||||
*/
|
||||
const open = async (
|
||||
selectedIds?: number[],
|
||||
itemId?: number,
|
||||
clientId?: number,
|
||||
vendorId?: number
|
||||
vendorId?: number,
|
||||
salesOrderCode?: string
|
||||
) => {
|
||||
dialogVisible.value = true
|
||||
externalClientId.value = clientId
|
||||
externalVendorId.value = vendorId
|
||||
externalSalesOrderCode.value = salesOrderCode
|
||||
// 重置查询条件 + 页码
|
||||
queryParams.code = undefined
|
||||
queryParams.itemId = itemId ?? undefined
|
||||
|
|
@ -467,7 +487,7 @@ const open = async (
|
|||
queryParams.workstationId = undefined
|
||||
queryParams.toolId = undefined
|
||||
queryParams.moldId = undefined
|
||||
queryParams.salesOrderCode = undefined
|
||||
queryParams.salesOrderCode = salesOrderCode ?? undefined
|
||||
queryParams.purchaseOrderCode = undefined
|
||||
queryParams.lotNumber = undefined
|
||||
queryParams.qualityStatus = undefined
|
||||
|
|
|
|||
|
|
@ -5,6 +5,9 @@
|
|||
Props:
|
||||
modelValue — 绑定的库存 ID(v-model)
|
||||
itemId — 按物料 ID 过滤库存(可选,透传给弹窗)
|
||||
batchId — 按批次 ID 过滤库存(可选,透传给弹窗)
|
||||
warehouseId — 按仓库 ID 过滤库存(可选,透传给弹窗)
|
||||
excludeVirtual — 是否排除虚拟线边仓库存(默认 true)
|
||||
disabled — 是否禁用
|
||||
clearable — 是否允许清空(鼠标悬停时显示清除图标)
|
||||
placeholder — 占位文字
|
||||
|
|
@ -47,6 +50,9 @@
|
|||
ref="dialogRef"
|
||||
:multiple="false"
|
||||
:item-id="itemId"
|
||||
:batch-id="batchId"
|
||||
:warehouse-id="warehouseId"
|
||||
:exclude-virtual="excludeVirtual"
|
||||
@selected="handleSelected"
|
||||
/>
|
||||
</template>
|
||||
|
|
@ -66,11 +72,15 @@ const props = withDefaults(
|
|||
defineProps<{
|
||||
modelValue?: number // 绑定的库存 ID
|
||||
itemId?: number // 按物料 ID 过滤
|
||||
batchId?: number // 按批次 ID 过滤
|
||||
warehouseId?: number // 按仓库 ID 过滤
|
||||
excludeVirtual?: boolean // 是否排除虚拟线边仓库存(默认 true)
|
||||
disabled?: boolean // 是否禁用
|
||||
clearable?: boolean // 是否允许清空
|
||||
placeholder?: string // 占位文字
|
||||
}>(),
|
||||
{
|
||||
excludeVirtual: true,
|
||||
disabled: false,
|
||||
clearable: true,
|
||||
placeholder: '请选择库存'
|
||||
|
|
|
|||
|
|
@ -4,6 +4,9 @@
|
|||
Props:
|
||||
multiple — true 多选(checkbox),false 单选(radio);默认 true
|
||||
itemId — 按物料 ID 过滤库存(可选)
|
||||
batchId — 按批次 ID 过滤库存(可选)
|
||||
warehouseId — 按仓库 ID 过滤库存(可选)
|
||||
excludeVirtual — 是否排除虚拟线边仓库存(默认 true)
|
||||
Events:
|
||||
selected(rows: WmMaterialStockVO[]) — 确认选择后触发,单选时数组长度为 1
|
||||
Expose:
|
||||
|
|
@ -20,8 +23,16 @@
|
|||
</el-col>
|
||||
<!-- 右侧:搜索 + 表格 -->
|
||||
<el-col :span="20" :xs="24">
|
||||
<!-- 搜索 -->
|
||||
<!-- 预过滤提示 -->
|
||||
<ContentWrap>
|
||||
<el-alert
|
||||
v-if="showAlert"
|
||||
:title="alertTitle"
|
||||
type="info"
|
||||
:closable="false"
|
||||
show-icon
|
||||
class="!mb-10px"
|
||||
/>
|
||||
<el-form :inline="true" :model="queryParams" label-width="68px">
|
||||
<el-form-item label="物料">
|
||||
<MdItemSelect v-model="queryParams.itemId" class="!w-220px" />
|
||||
|
|
@ -155,9 +166,13 @@ const props = withDefaults(
|
|||
defineProps<{
|
||||
multiple?: boolean // true 多选(checkbox),false 单选(radio)
|
||||
itemId?: number // 按物料 ID 过滤
|
||||
batchId?: number // 按批次 ID 过滤
|
||||
warehouseId?: number // 按仓库 ID 过滤
|
||||
excludeVirtual?: boolean // 是否排除虚拟线边仓库存(默认 true)
|
||||
}>(),
|
||||
{
|
||||
multiple: true
|
||||
multiple: true,
|
||||
excludeVirtual: true
|
||||
}
|
||||
)
|
||||
|
||||
|
|
@ -227,6 +242,7 @@ const queryParams = reactive({
|
|||
itemId: undefined as number | undefined, // 物料编号
|
||||
vendorId: undefined as number | undefined, // 供应商编号
|
||||
batchCode: undefined as string | undefined, // 批次号
|
||||
batchId: undefined as number | undefined, // 批次 ID
|
||||
warehouseId: undefined as number | undefined, // 仓库编号
|
||||
locationId: undefined as number | undefined, // 库区编号
|
||||
areaId: undefined as number | undefined, // 库位编号
|
||||
|
|
@ -249,7 +265,14 @@ const getList = async () => {
|
|||
loading.value = true
|
||||
try {
|
||||
const data = await WmMaterialStockApi.getMaterialStockPage(queryParams)
|
||||
// 前端过滤虚拟线边仓(非虚拟仓查询时排除 warehouseCode 含 WIP_VIRTUAL 的记录)
|
||||
if (props.excludeVirtual) {
|
||||
list.value = data.list.filter(
|
||||
(row: WmMaterialStockVO) => !row.warehouseCode?.includes('WIP_VIRTUAL')
|
||||
)
|
||||
} else {
|
||||
list.value = data.list
|
||||
}
|
||||
total.value = data.total
|
||||
await nextTick()
|
||||
applyPreSelection()
|
||||
|
|
@ -294,7 +317,8 @@ const resetQuery = () => {
|
|||
queryParams.itemId = props.itemId // 保持 props 传入的物料过滤
|
||||
queryParams.vendorId = undefined
|
||||
queryParams.batchCode = undefined
|
||||
queryParams.warehouseId = undefined
|
||||
queryParams.batchId = props.batchId // 保持 props 传入的批次过滤
|
||||
queryParams.warehouseId = props.warehouseId // 保持 props 传入的仓库过滤
|
||||
queryParams.locationId = undefined
|
||||
queryParams.areaId = undefined
|
||||
typeTreeRef.value?.reset()
|
||||
|
|
@ -328,12 +352,13 @@ const open = async (selectedIds?: number[]) => {
|
|||
queryParams.itemTypeId = undefined
|
||||
queryParams.vendorId = undefined
|
||||
queryParams.batchCode = undefined
|
||||
queryParams.warehouseId = undefined
|
||||
queryParams.locationId = undefined
|
||||
queryParams.areaId = undefined
|
||||
queryParams.pageNo = 1
|
||||
// 固定 itemId 过滤条件(从 props 传入)
|
||||
// 固定过滤条件(从 props 传入)
|
||||
queryParams.itemId = props.itemId
|
||||
queryParams.batchId = props.batchId
|
||||
queryParams.warehouseId = props.warehouseId
|
||||
// 默认只查未冻结
|
||||
queryParams.frozen = false
|
||||
// 重置分类树(清高亮 + 清搜索词)
|
||||
|
|
@ -349,6 +374,22 @@ const open = async (selectedIds?: number[]) => {
|
|||
await getList()
|
||||
}
|
||||
defineExpose({ open })
|
||||
|
||||
// ==================== 预过滤提示 ====================
|
||||
|
||||
/** 拼装 el-alert 提示文字 */
|
||||
const alertTitle = computed(() => {
|
||||
const parts: string[] = []
|
||||
if (props.batchId != null) parts.push('批次')
|
||||
if (props.warehouseId != null) parts.push('仓库')
|
||||
if (props.excludeVirtual) parts.push('排除虚拟仓')
|
||||
return `已按${parts.join('/')}预过滤`
|
||||
})
|
||||
|
||||
/** 是否显示 alert 提示 */
|
||||
const showAlert = computed(() => {
|
||||
return props.batchId != null || props.warehouseId != null
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
|
|
|||
|
|
@ -78,6 +78,7 @@
|
|||
v-model="formData.materialStockId"
|
||||
placeholder="请选择库存"
|
||||
class="!w-1/1"
|
||||
:exclude-virtual="false"
|
||||
@change="handleStockChange"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
<WmMaterialStockSelect
|
||||
v-model="formData.materialStockId"
|
||||
:item-id="formData.itemId"
|
||||
:batch-id="formData.batchId"
|
||||
@change="handleStockChange"
|
||||
/>
|
||||
</el-form-item>
|
||||
|
|
|
|||
|
|
@ -92,6 +92,7 @@
|
|||
:return-id="formData.id"
|
||||
:form-type="formType"
|
||||
:client-id="formData.clientId"
|
||||
:sales-order-code="formData.salesOrderCode"
|
||||
/>
|
||||
</template>
|
||||
<template #footer>
|
||||
|
|
|
|||
|
|
@ -104,6 +104,7 @@
|
|||
v-model="formData.batchId"
|
||||
:item-id="formData.itemId"
|
||||
:client-id="props.clientId"
|
||||
:sales-order-code="props.salesOrderCode"
|
||||
placeholder="请选择批次"
|
||||
class="!w-1/1"
|
||||
/>
|
||||
|
|
@ -151,6 +152,7 @@ const props = defineProps<{
|
|||
returnId: number
|
||||
formType: string
|
||||
clientId?: number // 客户 ID,用于透传给批次选择器过滤
|
||||
salesOrderCode?: string // 销售订单编号,用于透传给批次选择器过滤
|
||||
}>()
|
||||
|
||||
const { t } = useI18n() // 国际化
|
||||
|
|
|
|||
Loading…
Reference in New Issue