feat(mes): 更新物料库存模块,优化物料查询逻辑并新增工作站和库区数量统计功能
parent
fff9c7f34e
commit
c454002370
|
|
@ -17,62 +17,34 @@
|
||||||
:inline="true"
|
:inline="true"
|
||||||
label-width="68px"
|
label-width="68px"
|
||||||
>
|
>
|
||||||
<el-form-item label="物料编码" prop="itemCode">
|
<el-form-item label="物料" prop="itemId">
|
||||||
<el-input
|
<MdItemSelect v-model="queryParams.itemId" placeholder="请选择物料" class="!w-240px" />
|
||||||
v-model="queryParams.itemCode"
|
|
||||||
placeholder="请输入物料编码"
|
|
||||||
clearable
|
|
||||||
@keyup.enter="handleQuery"
|
|
||||||
class="!w-200px"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="物料名称" prop="itemName">
|
<el-form-item label="批次号" prop="batchCode">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.itemName"
|
v-model="queryParams.batchCode"
|
||||||
placeholder="请输入物料名称"
|
placeholder="请输入批次号"
|
||||||
clearable
|
clearable
|
||||||
@keyup.enter="handleQuery"
|
@keyup.enter="handleQuery"
|
||||||
class="!w-200px"
|
class="!w-200px"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="仓库" prop="warehouseId">
|
<el-form-item label="仓库" prop="warehouseId">
|
||||||
<el-select
|
<WmWarehouseSelect
|
||||||
v-model="queryParams.warehouseId"
|
v-model="queryParams.warehouseId"
|
||||||
placeholder="请选择仓库"
|
|
||||||
clearable
|
|
||||||
class="!w-200px"
|
class="!w-200px"
|
||||||
@change="handleWarehouseChange"
|
@change="handleWarehouseChange"
|
||||||
>
|
/>
|
||||||
<el-option
|
|
||||||
v-for="item in warehouseList"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.name"
|
|
||||||
:value="item.id"
|
|
||||||
/>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="库区" prop="locationId">
|
<el-form-item label="库区" prop="locationId">
|
||||||
<el-select
|
<WmWarehouseLocationSelect
|
||||||
v-model="queryParams.locationId"
|
v-model="queryParams.locationId"
|
||||||
placeholder="请选择库区"
|
:warehouse-id="queryParams.warehouseId"
|
||||||
clearable
|
|
||||||
class="!w-200px"
|
class="!w-200px"
|
||||||
>
|
/>
|
||||||
<el-option
|
|
||||||
v-for="item in locationList"
|
|
||||||
:key="item.id"
|
|
||||||
:label="item.name"
|
|
||||||
:value="item.id"
|
|
||||||
/>
|
|
||||||
</el-select>
|
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="是否冻结" prop="frozen">
|
<el-form-item label="是否冻结" prop="frozen">
|
||||||
<el-select
|
<el-select v-model="queryParams.frozen" placeholder="请选择" clearable class="!w-200px">
|
||||||
v-model="queryParams.frozen"
|
|
||||||
placeholder="请选择"
|
|
||||||
clearable
|
|
||||||
class="!w-200px"
|
|
||||||
>
|
|
||||||
<el-option :value="true" label="是" />
|
<el-option :value="true" label="是" />
|
||||||
<el-option :value="false" label="否" />
|
<el-option :value="false" label="否" />
|
||||||
</el-select>
|
</el-select>
|
||||||
|
|
@ -105,7 +77,7 @@
|
||||||
<el-table-column label="规格型号" align="center" prop="specification" min-width="120" />
|
<el-table-column label="规格型号" align="center" prop="specification" min-width="120" />
|
||||||
<el-table-column label="在库数量" align="center" prop="quantityOnhand" min-width="100" />
|
<el-table-column label="在库数量" align="center" prop="quantityOnhand" min-width="100" />
|
||||||
<el-table-column label="单位" align="center" prop="unitMeasureName" min-width="80" />
|
<el-table-column label="单位" align="center" prop="unitMeasureName" min-width="80" />
|
||||||
<!-- TODO @芋艿:批次号; -->
|
<!-- TODO @芋艿:批次号,待 mes_wm_batch 模块迁移后补充 -->
|
||||||
<el-table-column label="仓库" align="center" prop="warehouseName" min-width="100" />
|
<el-table-column label="仓库" align="center" prop="warehouseName" min-width="100" />
|
||||||
<el-table-column label="库区" align="center" prop="locationName" min-width="100" />
|
<el-table-column label="库区" align="center" prop="locationName" min-width="100" />
|
||||||
<el-table-column label="库位" align="center" prop="areaName" min-width="100">
|
<el-table-column label="库位" align="center" prop="areaName" min-width="100">
|
||||||
|
|
@ -126,7 +98,7 @@
|
||||||
label="入库日期"
|
label="入库日期"
|
||||||
align="center"
|
align="center"
|
||||||
prop="recptDate"
|
prop="recptDate"
|
||||||
:formatter="dateFormatter"
|
:formatter="dateFormatter2"
|
||||||
width="180px"
|
width="180px"
|
||||||
/>
|
/>
|
||||||
<el-table-column label="冻结" align="center" prop="frozen" min-width="80">
|
<el-table-column label="冻结" align="center" prop="frozen" min-width="80">
|
||||||
|
|
@ -157,13 +129,14 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { dateFormatter } from '@/utils/formatTime'
|
import { dateFormatter2 } from '@/utils/formatTime'
|
||||||
import download from '@/utils/download'
|
import download from '@/utils/download'
|
||||||
import { WmMaterialStockApi, WmMaterialStockVO } from '@/api/mes/wm/materialstock'
|
import { WmMaterialStockApi, WmMaterialStockVO } from '@/api/mes/wm/materialstock'
|
||||||
import { WmWarehouseApi } from '@/api/mes/wm/warehouse'
|
|
||||||
import { WmWarehouseLocationApi } from '@/api/mes/wm/warehouse/location'
|
|
||||||
import ItemTypeTree from '@/views/mes/md/item/ItemTypeTree.vue'
|
import ItemTypeTree from '@/views/mes/md/item/ItemTypeTree.vue'
|
||||||
import AreaForm from '@/views/mes/wm/warehouse/area/AreaForm.vue'
|
import AreaForm from '@/views/mes/wm/warehouse/area/AreaForm.vue'
|
||||||
|
import MdItemSelect from '@/views/mes/md/item/components/MdItemSelect.vue'
|
||||||
|
import WmWarehouseSelect from '@/views/mes/wm/warehouse/components/WmWarehouseSelect.vue'
|
||||||
|
import WmWarehouseLocationSelect from '@/views/mes/wm/warehouse/components/WmWarehouseLocationSelect.vue'
|
||||||
|
|
||||||
defineOptions({ name: 'MesWmMaterialStock' })
|
defineOptions({ name: 'MesWmMaterialStock' })
|
||||||
|
|
||||||
|
|
@ -176,8 +149,8 @@ const queryParams = reactive({
|
||||||
pageNo: 1,
|
pageNo: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
itemTypeId: undefined,
|
itemTypeId: undefined,
|
||||||
itemCode: undefined,
|
itemId: undefined,
|
||||||
itemName: undefined,
|
batchCode: undefined,
|
||||||
warehouseId: undefined,
|
warehouseId: undefined,
|
||||||
locationId: undefined,
|
locationId: undefined,
|
||||||
frozen: undefined
|
frozen: undefined
|
||||||
|
|
@ -185,23 +158,9 @@ const queryParams = reactive({
|
||||||
const queryFormRef = ref() // 搜索的表单
|
const queryFormRef = ref() // 搜索的表单
|
||||||
const exportLoading = ref(false) // 导出的加载中
|
const exportLoading = ref(false) // 导出的加载中
|
||||||
|
|
||||||
// 仓库、库区下拉数据
|
/** 仓库切换时清空库区 */
|
||||||
const warehouseList = ref<any[]>([])
|
const handleWarehouseChange = () => {
|
||||||
const locationList = ref<any[]>([])
|
|
||||||
|
|
||||||
/** 加载仓库列表 */
|
|
||||||
const loadWarehouseList = async () => {
|
|
||||||
warehouseList.value = await WmWarehouseApi.getWarehouseSimpleList()
|
|
||||||
}
|
|
||||||
|
|
||||||
/** 仓库切换时联动加载库区 */
|
|
||||||
const handleWarehouseChange = async (warehouseId: number | undefined) => {
|
|
||||||
queryParams.locationId = undefined
|
queryParams.locationId = undefined
|
||||||
if (warehouseId) {
|
|
||||||
locationList.value = await WmWarehouseLocationApi.getWarehouseLocationSimpleList(warehouseId)
|
|
||||||
} else {
|
|
||||||
locationList.value = []
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 查询列表 */
|
/** 查询列表 */
|
||||||
|
|
@ -226,7 +185,6 @@ const handleQuery = () => {
|
||||||
const resetQuery = () => {
|
const resetQuery = () => {
|
||||||
queryFormRef.value.resetFields()
|
queryFormRef.value.resetFields()
|
||||||
queryParams.itemTypeId = undefined
|
queryParams.itemTypeId = undefined
|
||||||
locationList.value = []
|
|
||||||
handleQuery()
|
handleQuery()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -239,10 +197,12 @@ const handleTypeNodeClick = (row: any) => {
|
||||||
/** 处理冻结状态切换 */
|
/** 处理冻结状态切换 */
|
||||||
const handleFrozenChange = async (row: WmMaterialStockVO) => {
|
const handleFrozenChange = async (row: WmMaterialStockVO) => {
|
||||||
try {
|
try {
|
||||||
|
const text = row.frozen ? '冻结' : '解冻'
|
||||||
|
await message.confirm('确认要"' + text + '"该库存记录吗?')
|
||||||
await WmMaterialStockApi.updateMaterialStockFrozen({ id: row.id, frozen: row.frozen })
|
await WmMaterialStockApi.updateMaterialStockFrozen({ id: row.id, frozen: row.frozen })
|
||||||
message.success(row.frozen ? '冻结成功' : '解冻成功')
|
message.success(text + '成功')
|
||||||
} catch {
|
} catch {
|
||||||
// 失败时回滚
|
// 取消或失败时回滚
|
||||||
row.frozen = !row.frozen
|
row.frozen = !row.frozen
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -268,6 +228,6 @@ const handleExport = async () => {
|
||||||
|
|
||||||
/** 初始化 */
|
/** 初始化 */
|
||||||
onMounted(async () => {
|
onMounted(async () => {
|
||||||
await Promise.all([loadWarehouseList(), getList()])
|
await getList()
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,104 @@
|
||||||
|
<!-- MES 库区选择器:纯下拉,前端过滤(支持 name、code),支持按仓库筛选 -->
|
||||||
|
<template>
|
||||||
|
<el-select
|
||||||
|
v-model="selectValue"
|
||||||
|
:placeholder="placeholder"
|
||||||
|
:disabled="disabled"
|
||||||
|
:clearable="clearable"
|
||||||
|
filterable
|
||||||
|
:filter-method="handleFilter"
|
||||||
|
class="!w-1/1"
|
||||||
|
@change="handleChange"
|
||||||
|
>
|
||||||
|
<el-option v-for="item in filteredList" :key="item.id" :label="item.name" :value="item.id">
|
||||||
|
<div class="flex items-center gap-8px">
|
||||||
|
<span>{{ item.name }}</span>
|
||||||
|
<el-tag v-if="item.code" size="small" type="info" class="ml-4px">
|
||||||
|
编号: {{ item.code }}
|
||||||
|
</el-tag>
|
||||||
|
</div>
|
||||||
|
</el-option>
|
||||||
|
</el-select>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { WmWarehouseLocationApi, WmWarehouseLocationVO } from '@/api/mes/wm/warehouse/location'
|
||||||
|
|
||||||
|
defineOptions({ name: 'WmWarehouseLocationSelect' })
|
||||||
|
|
||||||
|
const props = withDefaults(
|
||||||
|
defineProps<{
|
||||||
|
modelValue?: number
|
||||||
|
warehouseId?: number
|
||||||
|
disabled?: boolean
|
||||||
|
clearable?: boolean
|
||||||
|
placeholder?: string
|
||||||
|
}>(),
|
||||||
|
{
|
||||||
|
disabled: false,
|
||||||
|
clearable: true,
|
||||||
|
placeholder: '请选择库区'
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
const emit = defineEmits<{
|
||||||
|
'update:modelValue': [value: number | undefined]
|
||||||
|
change: [item: WmWarehouseLocationVO | undefined]
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const allList = ref<WmWarehouseLocationVO[]>([])
|
||||||
|
const filteredList = ref<WmWarehouseLocationVO[]>([])
|
||||||
|
const filterQuery = ref('') // 当前过滤关键字
|
||||||
|
|
||||||
|
const selectValue = computed({
|
||||||
|
get: () => props.modelValue,
|
||||||
|
set: (val) => emit('update:modelValue', val)
|
||||||
|
})
|
||||||
|
|
||||||
|
/** 前端过滤(name + code) */
|
||||||
|
const handleFilter = (query: string) => {
|
||||||
|
filterQuery.value = query
|
||||||
|
applyFilter()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 应用过滤 */
|
||||||
|
const applyFilter = () => {
|
||||||
|
if (!filterQuery.value) {
|
||||||
|
filteredList.value = allList.value
|
||||||
|
return
|
||||||
|
}
|
||||||
|
const keyword = filterQuery.value.toLowerCase()
|
||||||
|
filteredList.value = allList.value.filter(
|
||||||
|
(item) =>
|
||||||
|
item.name?.toLowerCase().includes(keyword) ||
|
||||||
|
item.code?.toLowerCase().includes(keyword)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 选中变化 */
|
||||||
|
const handleChange = (val: number | undefined) => {
|
||||||
|
const item = allList.value.find((o) => o.id === val)
|
||||||
|
emit('change', item)
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 加载库区列表 */
|
||||||
|
const loadList = async () => {
|
||||||
|
allList.value = await WmWarehouseLocationApi.getWarehouseLocationSimpleList(props.warehouseId)
|
||||||
|
applyFilter()
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 监听仓库变化,重新加载库区列表 */
|
||||||
|
watch(
|
||||||
|
() => props.warehouseId,
|
||||||
|
async () => {
|
||||||
|
// 仓库变化时,清空当前选中并重新加载
|
||||||
|
selectValue.value = undefined
|
||||||
|
await loadList()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
/** 初始化 */
|
||||||
|
onMounted(async () => {
|
||||||
|
await loadList()
|
||||||
|
})
|
||||||
|
</script>
|
||||||
Loading…
Reference in New Issue