feat(wms):优化出库的交互,已选择的库存,disabled 掉,体验更好
parent
f6963cde37
commit
073c54bc1d
|
|
@ -78,7 +78,13 @@
|
||||||
@row-dblclick="handleRowDblClick"
|
@row-dblclick="handleRowDblClick"
|
||||||
@selection-change="handleSelectionChange"
|
@selection-change="handleSelectionChange"
|
||||||
>
|
>
|
||||||
<el-table-column :reserve-selection="true" align="center" type="selection" width="50" />
|
<el-table-column
|
||||||
|
:reserve-selection="true"
|
||||||
|
:selectable="isRowSelectable"
|
||||||
|
align="center"
|
||||||
|
type="selection"
|
||||||
|
width="50"
|
||||||
|
/>
|
||||||
<el-table-column label="商品信息" min-width="220">
|
<el-table-column label="商品信息" min-width="220">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<div>{{ row.itemName || '-' }}</div>
|
<div>{{ row.itemName || '-' }}</div>
|
||||||
|
|
@ -146,6 +152,7 @@ const dialogVisible = ref(false) // 弹窗的是否展示
|
||||||
const list = ref<InventorySelectRow[]>([]) // 库存列表
|
const list = ref<InventorySelectRow[]>([]) // 库存列表
|
||||||
const total = ref(0) // 列表的总条数
|
const total = ref(0) // 列表的总条数
|
||||||
const selectedMap = ref<Map<string, InventorySelectRow>>(new Map()) // 跨页已选择库存
|
const selectedMap = ref<Map<string, InventorySelectRow>>(new Map()) // 跨页已选择库存
|
||||||
|
const disabledInventoryKeys = ref<Set<string>>(new Set()) // 已在业务明细中使用的库存
|
||||||
const tableRef = ref<InstanceType<typeof ElTable>>() // 表格 Ref
|
const tableRef = ref<InstanceType<typeof ElTable>>() // 表格 Ref
|
||||||
const queryFormRef = ref() // 搜索的表单
|
const queryFormRef = ref() // 搜索的表单
|
||||||
|
|
||||||
|
|
@ -167,7 +174,7 @@ const emit = defineEmits<{
|
||||||
}>()
|
}>()
|
||||||
|
|
||||||
/** 打开弹窗 */
|
/** 打开弹窗 */
|
||||||
const open = async () => {
|
const open = async (selectedInventoryKeys: string[] = []) => {
|
||||||
if (!props.warehouseId) {
|
if (!props.warehouseId) {
|
||||||
message.warning('请先选择仓库')
|
message.warning('请先选择仓库')
|
||||||
return
|
return
|
||||||
|
|
@ -175,6 +182,7 @@ const open = async () => {
|
||||||
dialogVisible.value = true
|
dialogVisible.value = true
|
||||||
Object.assign(queryParams, getDefaultQueryParams())
|
Object.assign(queryParams, getDefaultQueryParams())
|
||||||
selectedMap.value = new Map()
|
selectedMap.value = new Map()
|
||||||
|
disabledInventoryKeys.value = new Set(selectedInventoryKeys)
|
||||||
await nextTick()
|
await nextTick()
|
||||||
tableRef.value?.clearSelection()
|
tableRef.value?.clearSelection()
|
||||||
await getList()
|
await getList()
|
||||||
|
|
@ -222,6 +230,17 @@ const getRowKey = (row: InventorySelectRow) => {
|
||||||
return `inventory-${row.id || `${row.skuId}-${row.warehouseId}`}`
|
return `inventory-${row.id || `${row.skuId}-${row.warehouseId}`}`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 获得业务库存标识 */
|
||||||
|
const getInventoryKey = (row: Pick<InventorySelectRow, 'skuId' | 'warehouseId'>) => {
|
||||||
|
return row.skuId && row.warehouseId ? `${row.skuId}-${row.warehouseId}` : undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 判断库存是否可选 */
|
||||||
|
const isRowSelectable = (row: InventorySelectRow) => {
|
||||||
|
const key = getInventoryKey(row)
|
||||||
|
return !key || !disabledInventoryKeys.value.has(key)
|
||||||
|
}
|
||||||
|
|
||||||
/** 恢复当前页选择状态 */
|
/** 恢复当前页选择状态 */
|
||||||
const applySelection = () => {
|
const applySelection = () => {
|
||||||
const table = tableRef.value
|
const table = tableRef.value
|
||||||
|
|
@ -239,18 +258,24 @@ const applySelection = () => {
|
||||||
const handleSelectionChange = (rows: InventorySelectRow[]) => {
|
const handleSelectionChange = (rows: InventorySelectRow[]) => {
|
||||||
const currentKeys = new Set(list.value.map((row) => getRowKey(row)))
|
const currentKeys = new Set(list.value.map((row) => getRowKey(row)))
|
||||||
currentKeys.forEach((key) => selectedMap.value.delete(key))
|
currentKeys.forEach((key) => selectedMap.value.delete(key))
|
||||||
rows.forEach((row) => selectedMap.value.set(getRowKey(row), row))
|
rows
|
||||||
|
.filter((row) => isRowSelectable(row))
|
||||||
|
.forEach((row) => selectedMap.value.set(getRowKey(row), row))
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 双击行直接选择 */
|
/** 双击行直接选择 */
|
||||||
const handleRowDblClick = (row: InventorySelectRow) => {
|
const handleRowDblClick = (row: InventorySelectRow) => {
|
||||||
|
if (!isRowSelectable(row)) {
|
||||||
|
message.warning('该库存已添加')
|
||||||
|
return
|
||||||
|
}
|
||||||
selectedMap.value.set(getRowKey(row), row)
|
selectedMap.value.set(getRowKey(row), row)
|
||||||
handleConfirm()
|
handleConfirm()
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 确认选择 */
|
/** 确认选择 */
|
||||||
const handleConfirm = () => {
|
const handleConfirm = () => {
|
||||||
const selectedList = Array.from(selectedMap.value.values())
|
const selectedList = Array.from(selectedMap.value.values()).filter((row) => isRowSelectable(row))
|
||||||
if (selectedList.length === 0) {
|
if (selectedList.length === 0) {
|
||||||
message.warning('请选择库存')
|
message.warning('请选择库存')
|
||||||
return
|
return
|
||||||
|
|
|
||||||
|
|
@ -316,7 +316,7 @@ function normalizeDetails(details: ShipmentOrderDetailVO[]) {
|
||||||
|
|
||||||
/** 添加商品 */
|
/** 添加商品 */
|
||||||
const handleAddDetail = () => {
|
const handleAddDetail = () => {
|
||||||
inventorySelectRef.value?.open()
|
inventorySelectRef.value?.open(getSelectedInventoryKeys())
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 选择库存 */
|
/** 选择库存 */
|
||||||
|
|
@ -340,6 +340,15 @@ const isInventorySelected = (inventory: InventorySelectRow) => {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 获得已选择的库存标识 */
|
||||||
|
const getSelectedInventoryKeys = () => {
|
||||||
|
return (formData.value.details || [])
|
||||||
|
.map((detail) =>
|
||||||
|
detail.skuId && detail.warehouseId ? `${detail.skuId}-${detail.warehouseId}` : undefined
|
||||||
|
)
|
||||||
|
.filter((key): key is string => !!key)
|
||||||
|
}
|
||||||
|
|
||||||
/** 删除明细 */
|
/** 删除明细 */
|
||||||
const handleDeleteDetail = (index: number) => {
|
const handleDeleteDetail = (index: number) => {
|
||||||
formData.value.details?.splice(index, 1)
|
formData.value.details?.splice(index, 1)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue