feat(wms):完成 antd、ele 的 inventory-select.vue 的迁移

pull/345/head
YunaiV 2026-05-18 22:09:49 +08:00
parent 68800c96d7
commit 80f071d57f
4 changed files with 342 additions and 0 deletions

View File

@ -0,0 +1 @@
export { default as WmsInventorySelect } from './inventory-select.vue';

View File

@ -0,0 +1,168 @@
<script lang="ts" setup>
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { WmsInventoryApi } from '#/api/wms/inventory';
import { nextTick, ref } from 'vue';
import { message, Modal } from 'ant-design-vue';
import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { getInventoryPage } from '#/api/wms/inventory';
import { formatQuantity } from '#/views/wms/utils/format';
import {
useInventorySelectGridColumns,
useInventorySelectGridFormSchema,
} from '../index/data';
export interface InventorySelectRow extends WmsInventoryApi.Inventory {
availableQuantity?: number;
price?: number;
}
defineOptions({ name: 'WmsInventorySelect' });
const props = defineProps<{
warehouseId?: number;
}>();
const emit = defineEmits<{
change: [list: InventorySelectRow[]];
}>();
const open = ref(false);
const selectedRows = ref<InventorySelectRow[]>([]);
const disabledInventoryKeys = ref<Set<string>>(new Set());
/** 获得业务库存标识 */
function getInventoryKey(row: Pick<InventorySelectRow, 'skuId' | 'warehouseId'>) {
return row.skuId && row.warehouseId
? `${row.skuId}-${row.warehouseId}`
: undefined;
}
/** 判断库存是否可选 */
function isInventorySelectable(row: InventorySelectRow) {
const key = getInventoryKey(row);
return !key || !disabledInventoryKeys.value.has(key);
}
const [Grid, gridApi] = useVbenVxeGrid({
formOptions: {
schema: useInventorySelectGridFormSchema(),
},
gridOptions: {
columns: useInventorySelectGridColumns(),
height: 560,
keepSource: true,
checkboxConfig: {
checkMethod: ({ row }: { row: InventorySelectRow }) =>
isInventorySelectable(row),
highlight: true,
range: true,
reserve: true,
},
proxyConfig: {
ajax: {
query: async ({ page }, formValues) => {
const data = await getInventoryPage({
pageNo: page.currentPage,
pageSize: page.pageSize,
type: 'warehouse',
warehouseId: props.warehouseId,
onlyPositiveQuantity: true,
...formValues,
});
return {
...data,
list: (data.list || []).map((inventory) => ({
...inventory,
availableQuantity: inventory.quantity,
})),
};
},
},
},
rowConfig: {
keyField: 'id',
isHover: true,
},
toolbarConfig: {
refresh: true,
search: true,
},
} as VxeTableGridOptions<InventorySelectRow>,
gridEvents: {
checkboxAll: ({ records }: { records: InventorySelectRow[] }) => {
selectedRows.value = records.filter((row) => isInventorySelectable(row));
},
checkboxChange: ({ records }: { records: InventorySelectRow[] }) => {
selectedRows.value = records.filter((row) => isInventorySelectable(row));
},
},
});
async function openModal(selectedInventoryKeys: string[] = []) {
if (!props.warehouseId) {
message.warning('请先选择仓库');
return;
}
open.value = true;
selectedRows.value = [];
disabledInventoryKeys.value = new Set(selectedInventoryKeys);
await nextTick();
await gridApi.grid.clearCheckboxRow();
await gridApi.formApi.resetForm();
await gridApi.query();
}
async function closeModal() {
open.value = false;
selectedRows.value = [];
disabledInventoryKeys.value = new Set();
await gridApi.grid.clearCheckboxRow();
}
function handleConfirm() {
const selectedList = selectedRows.value.filter((row) =>
isInventorySelectable(row),
);
if (selectedList.length === 0) {
message.warning('请选择库存');
return;
}
emit('change', selectedList);
closeModal();
}
defineExpose({ open: openModal });
</script>
<template>
<Modal
v-model:open="open"
title="库存选择"
width="80%"
:destroy-on-close="true"
@ok="handleConfirm"
@cancel="closeModal"
>
<Grid table-title="">
<template #itemInfo="{ row }">
<div>{{ row.itemName || '-' }}</div>
<div v-if="row.itemCode" class="text-xs text-gray-500">
商品编号{{ row.itemCode }}
</div>
</template>
<template #skuInfo="{ row }">
<div>{{ row.skuName || '-' }}</div>
<div v-if="row.skuCode" class="text-xs text-gray-500">
规格编号{{ row.skuCode }}
</div>
</template>
<template #availableQuantity="{ row }">
{{ formatQuantity(row.availableQuantity) }}
</template>
</Grid>
</Modal>
</template>

View File

@ -0,0 +1 @@
export { default as WmsInventorySelect } from './inventory-select.vue';

View File

@ -0,0 +1,172 @@
<script lang="ts" setup>
import type { VxeTableGridOptions } from '#/adapter/vxe-table';
import type { WmsInventoryApi } from '#/api/wms/inventory';
import { nextTick, ref } from 'vue';
import { ElButton, ElDialog, ElMessage } from 'element-plus';
import { useVbenVxeGrid } from '#/adapter/vxe-table';
import { getInventoryPage } from '#/api/wms/inventory';
import { formatQuantity } from '#/views/wms/utils/format';
import {
useInventorySelectGridColumns,
useInventorySelectGridFormSchema,
} from '../index/data';
export interface InventorySelectRow extends WmsInventoryApi.Inventory {
availableQuantity?: number;
price?: number;
}
defineOptions({ name: 'WmsInventorySelect' });
const props = defineProps<{
warehouseId?: number;
}>();
const emit = defineEmits<{
change: [list: InventorySelectRow[]];
}>();
const open = ref(false);
const selectedRows = ref<InventorySelectRow[]>([]);
const disabledInventoryKeys = ref<Set<string>>(new Set());
/** 获得业务库存标识 */
function getInventoryKey(row: Pick<InventorySelectRow, 'skuId' | 'warehouseId'>) {
return row.skuId && row.warehouseId
? `${row.skuId}-${row.warehouseId}`
: undefined;
}
/** 判断库存是否可选 */
function isInventorySelectable(row: InventorySelectRow) {
const key = getInventoryKey(row);
return !key || !disabledInventoryKeys.value.has(key);
}
const [Grid, gridApi] = useVbenVxeGrid({
formOptions: {
schema: useInventorySelectGridFormSchema(),
},
gridOptions: {
columns: useInventorySelectGridColumns(),
height: 560,
keepSource: true,
checkboxConfig: {
checkMethod: ({ row }: { row: InventorySelectRow }) =>
isInventorySelectable(row),
highlight: true,
range: true,
reserve: true,
},
proxyConfig: {
ajax: {
query: async ({ page }, formValues) => {
const data = await getInventoryPage({
pageNo: page.currentPage,
pageSize: page.pageSize,
type: 'warehouse',
warehouseId: props.warehouseId,
onlyPositiveQuantity: true,
...formValues,
});
return {
...data,
list: (data.list || []).map((inventory) => ({
...inventory,
availableQuantity: inventory.quantity,
})),
};
},
},
},
rowConfig: {
keyField: 'id',
isHover: true,
},
toolbarConfig: {
refresh: true,
search: true,
},
} as VxeTableGridOptions<InventorySelectRow>,
gridEvents: {
checkboxAll: ({ records }: { records: InventorySelectRow[] }) => {
selectedRows.value = records.filter((row) => isInventorySelectable(row));
},
checkboxChange: ({ records }: { records: InventorySelectRow[] }) => {
selectedRows.value = records.filter((row) => isInventorySelectable(row));
},
},
});
async function openModal(selectedInventoryKeys: string[] = []) {
if (!props.warehouseId) {
ElMessage.warning('请先选择仓库');
return;
}
open.value = true;
selectedRows.value = [];
disabledInventoryKeys.value = new Set(selectedInventoryKeys);
await nextTick();
await gridApi.grid.clearCheckboxRow();
await gridApi.formApi.resetForm();
await gridApi.query();
}
async function closeModal() {
open.value = false;
selectedRows.value = [];
disabledInventoryKeys.value = new Set();
await gridApi.grid.clearCheckboxRow();
}
function handleConfirm() {
const selectedList = selectedRows.value.filter((row) =>
isInventorySelectable(row),
);
if (selectedList.length === 0) {
ElMessage.warning('请选择库存');
return;
}
emit('change', selectedList);
closeModal();
}
defineExpose({ open: openModal });
</script>
<template>
<ElDialog
v-model="open"
title="库存选择"
width="80%"
:append-to-body="true"
:destroy-on-close="true"
@close="closeModal"
>
<Grid table-title="">
<template #itemInfo="{ row }">
<div>{{ row.itemName || '-' }}</div>
<div v-if="row.itemCode" class="text-xs text-gray-500">
商品编号{{ row.itemCode }}
</div>
</template>
<template #skuInfo="{ row }">
<div>{{ row.skuName || '-' }}</div>
<div v-if="row.skuCode" class="text-xs text-gray-500">
规格编号{{ row.skuCode }}
</div>
</template>
<template #availableQuantity="{ row }">
{{ formatQuantity(row.availableQuantity) }}
</template>
</Grid>
<template #footer>
<ElButton @click="closeModal"> </ElButton>
<ElButton type="primary" @click="handleConfirm"> </ElButton>
</template>
</ElDialog>
</template>