feat(mes): 增加库位编号和相关查询功能

在库存物资选择对话框中新增库位编号字段,更新查询参数以支持库位的选择和过滤。调整相关组件以确保库位信息的正确显示和交互。
pull/871/MERGE
YunaiV 2026-04-06 11:28:35 +08:00
parent a29ea8e4e4
commit 5f61294aad
1 changed files with 145 additions and 99 deletions

View File

@ -11,104 +11,123 @@
--> -->
<template> <template>
<Dialog title="库存物资选择" v-model="dialogVisible" width="80%"> <Dialog title="库存物资选择" v-model="dialogVisible" width="80%">
<!-- TODO @AI增加 /Users/yunai/Java/yudao-all-in-one/yudao-ui-admin-vue3/src/views/mes/md/item/type/components/MdItemTypeSelect.vue --> <el-row :gutter="20">
<!-- 左侧分类树 -->
<!-- 搜索 --> <el-col :span="4" :xs="24">
<ContentWrap> <ContentWrap class="h-1/1">
<el-form :inline="true" :model="queryParams" label-width="80px"> <MdItemTypeTree ref="typeTreeRef" @node-click="handleNodeClick" />
<el-form-item label="物料"> </ContentWrap>
<MdItemSelect v-model="queryParams.itemId" class="!w-240px" /> </el-col>
</el-form-item> <!-- 右侧搜索 + 表格 -->
<el-form-item label="供应商"> <el-col :span="20" :xs="24">
<MdVendorSelect v-model="queryParams.vendorId" class="!w-240px" /> <!-- 搜索 -->
</el-form-item> <ContentWrap>
<el-form-item label="批次号"> <el-form :inline="true" :model="queryParams" label-width="68px">
<el-input <el-form-item label="物料">
v-model="queryParams.batchCode" <MdItemSelect v-model="queryParams.itemId" class="!w-220px" />
placeholder="请输入批次号" </el-form-item>
clearable <el-form-item label="供应商">
@keyup.enter="handleQuery" <MdVendorSelect v-model="queryParams.vendorId" class="!w-220px" />
class="!w-240px" </el-form-item>
/> <el-form-item label="批次号">
</el-form-item> <el-input
<el-form-item label="仓库"> v-model="queryParams.batchCode"
<WmWarehouseSelect placeholder="请输入批次号"
v-model="queryParams.warehouseId" clearable
@change="handleWarehouseChange" @keyup.enter="handleQuery"
class="!w-240px" class="!w-220px"
/> />
</el-form-item> </el-form-item>
<!-- TODO @AIareaId 增加一个 --> <el-form-item label="仓库">
<el-form-item label="库区"> <WmWarehouseSelect
<WmWarehouseLocationSelect v-model="queryParams.warehouseId"
v-model="queryParams.locationId" @change="handleWarehouseChange"
:warehouse-id="queryParams.warehouseId" class="!w-220px"
class="!w-240px" />
/> </el-form-item>
</el-form-item> <!-- DONE @AIareaId 增加一个 -->
<el-form-item> <el-form-item label="库区">
<el-button @click="handleQuery"><Icon icon="ep:search" />搜索</el-button> <WmWarehouseLocationSelect
<el-button @click="resetQuery"><Icon icon="ep:refresh" />重置</el-button> v-model="queryParams.locationId"
</el-form-item> :warehouse-id="queryParams.warehouseId"
</el-form> @change="handleLocationChange"
</ContentWrap> class="!w-220px"
<!-- 列表 --> />
<ContentWrap> </el-form-item>
<el-table <el-form-item label="库位">
ref="tableRef" <WmWarehouseAreaSelect
v-loading="loading" v-model="queryParams.areaId"
:data="list" :location-id="queryParams.locationId"
:stripe="true" class="!w-220px"
:show-overflow-tooltip="true" />
row-key="id" </el-form-item>
:highlight-current-row="!multiple" <el-form-item>
@selection-change="handleSelectionChange" <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button>
@row-click="handleRowClick" <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
@row-dblclick="handleRowDblClick" </el-form-item>
> </el-form>
<!-- 多选checkboxreserve-selection 保证跨页勾选不丢失 --> </ContentWrap>
<el-table-column <!-- 列表 -->
v-if="multiple" <ContentWrap>
type="selection" <el-table
:reserve-selection="true" ref="tableRef"
width="50" v-loading="loading"
align="center" :data="list"
/> :stripe="true"
<!-- 单选radio --> :show-overflow-tooltip="true"
<el-table-column v-else width="50" align="center"> border
<template #default="{ row }"> row-key="id"
<el-radio :highlight-current-row="!multiple"
v-model="selectedRadioId" @selection-change="handleSelectionChange"
:value="row.id" @row-click="handleRowClick"
class="radio-no-label" @row-dblclick="handleRowDblClick"
@change="handleRadioChange(row)" >
<!-- 多选checkboxreserve-selection 保证跨页勾选不丢失 -->
<el-table-column
v-if="multiple"
type="selection"
:reserve-selection="true"
width="50"
align="center"
/> />
</template> <!-- 单选radio -->
</el-table-column> <el-table-column v-else width="50" align="center">
<el-table-column label="产品物料编码" align="center" prop="itemCode" min-width="120" /> <template #default="{ row }">
<el-table-column label="产品物料名称" align="center" prop="itemName" min-width="140" /> <el-radio
<el-table-column label="规格型号" align="center" prop="specification" min-width="120" /> v-model="selectedRadioId"
<el-table-column label="单位" align="center" prop="unitMeasureName" min-width="80" /> :value="row.id"
<el-table-column label="入库批次号" align="center" prop="batchCode" min-width="120" /> class="radio-no-label"
<el-table-column label="仓库" align="center" prop="warehouseName" min-width="100" /> @change="handleRadioChange(row)"
<el-table-column label="库区" align="center" prop="locationName" min-width="100" /> />
<el-table-column label="库位" align="center" prop="areaName" min-width="100" /> </template>
<el-table-column label="在库数量" align="center" prop="quantity" min-width="100" /> </el-table-column>
<el-table-column <el-table-column label="产品物料编码" align="center" prop="itemCode" min-width="120" />
label="入库日期" <el-table-column label="产品物料名称" align="center" prop="itemName" min-width="140" />
align="center" <el-table-column label="规格型号" align="center" prop="specification" min-width="120" />
prop="receiptTime" <el-table-column label="单位" align="center" prop="unitMeasureName" min-width="80" />
:formatter="dateFormatter2" <el-table-column label="入库批次号" align="center" prop="batchCode" min-width="120" />
width="180px" <el-table-column label="仓库" align="center" prop="warehouseName" min-width="100" />
/> <el-table-column label="库区" align="center" prop="locationName" min-width="100" />
</el-table> <el-table-column label="库位" align="center" prop="areaName" min-width="100" />
<Pagination <el-table-column label="在库数量" align="center" prop="quantity" min-width="100" />
:total="total" <el-table-column
v-model:page="queryParams.pageNo" label="入库日期"
v-model:limit="queryParams.pageSize" align="center"
@pagination="getList" prop="receiptTime"
/> :formatter="dateFormatter2"
</ContentWrap> width="180px"
/>
</el-table>
<!-- 分页 -->
<Pagination
:total="total"
v-model:page="queryParams.pageNo"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</ContentWrap>
</el-col>
</el-row>
<template #footer> <template #footer>
<el-button type="primary" @click="confirmSelect"> </el-button> <el-button type="primary" @click="confirmSelect"> </el-button>
<el-button @click="dialogVisible = false"> </el-button> <el-button @click="dialogVisible = false"> </el-button>
@ -119,10 +138,13 @@
<script setup lang="ts"> <script setup lang="ts">
import { dateFormatter2 } from '@/utils/formatTime' import { dateFormatter2 } from '@/utils/formatTime'
import { WmMaterialStockApi, WmMaterialStockVO } from '@/api/mes/wm/materialstock' import { WmMaterialStockApi, WmMaterialStockVO } from '@/api/mes/wm/materialstock'
import { MdItemTypeVO } from '@/api/mes/md/item/type'
import MdItemTypeTree from '@/views/mes/md/item/type/components/MdItemTypeTree.vue'
import MdItemSelect from '@/views/mes/md/item/components/MdItemSelect.vue' import MdItemSelect from '@/views/mes/md/item/components/MdItemSelect.vue'
import MdVendorSelect from '@/views/mes/md/vendor/components/MdVendorSelect.vue' import MdVendorSelect from '@/views/mes/md/vendor/components/MdVendorSelect.vue'
import WmWarehouseSelect from '@/views/mes/wm/warehouse/components/WmWarehouseSelect.vue' import WmWarehouseSelect from '@/views/mes/wm/warehouse/components/WmWarehouseSelect.vue'
import WmWarehouseLocationSelect from '@/views/mes/wm/warehouse/components/WmWarehouseLocationSelect.vue' import WmWarehouseLocationSelect from '@/views/mes/wm/warehouse/components/WmWarehouseLocationSelect.vue'
import WmWarehouseAreaSelect from '@/views/mes/wm/warehouse/components/WmWarehouseAreaSelect.vue'
defineOptions({ name: 'WmMaterialStockSelectDialog' }) defineOptions({ name: 'WmMaterialStockSelectDialog' })
@ -148,6 +170,7 @@ const total = ref(0) // 总条数
// ==================== ==================== // ==================== ====================
const tableRef = ref() // Ref const tableRef = ref() // Ref
const typeTreeRef = ref() // Ref
const selectedRows = ref<WmMaterialStockVO[]>([]) // const selectedRows = ref<WmMaterialStockVO[]>([]) //
const selectedRadioId = ref<number>() // ID const selectedRadioId = ref<number>() // ID
const currentRadioRow = ref<WmMaterialStockVO>() // const currentRadioRow = ref<WmMaterialStockVO>() //
@ -185,21 +208,37 @@ const handleRowDblClick = (row: WmMaterialStockVO) => {
confirmSelect() confirmSelect()
} }
// ==================== ====================
/** 点击分类树节点,按分类筛选(支持取消选中) */
const handleNodeClick = (data: MdItemTypeVO | undefined) => {
queryParams.itemTypeId = data?.id
handleQuery()
}
// ==================== ==================== // ==================== ====================
const queryParams = reactive({ const queryParams = reactive({
pageNo: 1, // pageNo: 1, //
pageSize: 10, // pageSize: 10, //
itemTypeId: undefined as number | undefined, //
itemId: undefined as number | undefined, // itemId: undefined as number | undefined, //
vendorId: undefined as number | undefined, // vendorId: undefined as number | undefined, //
batchCode: undefined as string | undefined, // batchCode: undefined as string | undefined, //
warehouseId: undefined as number | undefined, // warehouseId: undefined as number | undefined, //
locationId: undefined as number | undefined, // locationId: undefined as number | undefined, //
areaId: undefined as number | undefined, //
frozen: false as boolean | undefined // frozen: false as boolean | undefined //
}) })
/** 仓库切换时清空库区 */ /** 仓库切换时清空库区、库位 */
const handleWarehouseChange = () => { const handleWarehouseChange = () => {
queryParams.locationId = undefined queryParams.locationId = undefined
queryParams.areaId = undefined
}
/** 库区切换时清空库位 */
const handleLocationChange = () => {
queryParams.areaId = undefined
} }
/** 查询库存列表 */ /** 查询库存列表 */
@ -246,13 +285,16 @@ const handleQuery = () => {
getList() getList()
} }
/** 重置查询条件 */ /** 重置查询条件(同步清除左侧树高亮和搜索词) */
const resetQuery = () => { const resetQuery = () => {
queryParams.itemTypeId = undefined
queryParams.itemId = props.itemId // props queryParams.itemId = props.itemId // props
queryParams.vendorId = undefined queryParams.vendorId = undefined
queryParams.batchCode = undefined queryParams.batchCode = undefined
queryParams.warehouseId = undefined queryParams.warehouseId = undefined
queryParams.locationId = undefined queryParams.locationId = undefined
queryParams.areaId = undefined
typeTreeRef.value?.reset()
handleQuery() handleQuery()
} }
@ -280,15 +322,19 @@ const confirmSelect = () => {
const open = async (selectedIds?: number[]) => { const open = async (selectedIds?: number[]) => {
dialogVisible.value = true dialogVisible.value = true
// + // +
queryParams.itemTypeId = undefined
queryParams.vendorId = undefined queryParams.vendorId = undefined
queryParams.batchCode = undefined queryParams.batchCode = undefined
queryParams.warehouseId = undefined queryParams.warehouseId = undefined
queryParams.locationId = undefined queryParams.locationId = undefined
queryParams.areaId = undefined
queryParams.pageNo = 1 queryParams.pageNo = 1
// itemId props // itemId props
queryParams.itemId = props.itemId queryParams.itemId = props.itemId
// //
queryParams.frozen = false queryParams.frozen = false
// +
typeTreeRef.value?.reset()
// //
selectedRows.value = [] selectedRows.value = []
selectedRadioId.value = undefined selectedRadioId.value = undefined