From d8907811496931d38e4fa69b37f16301d7b9b87e Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 10 May 2026 21:33:42 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=95=86=E5=93=81=E4=BF=A1=E6=81=AF=E3=80=81SKU=20?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/wms/md/item/index.ts | 55 +++ src/api/wms/md/item/sku/index.ts | 23 ++ src/views/wms/md/item/ItemForm.vue | 291 ++++++++++++++++ .../item/brand/components/ItemBrandSelect.vue | 81 +++++ .../wms/md/item/category/ItemCategoryForm.vue | 7 +- .../components/ItemCategorySelect.vue | 57 ++++ .../category/components/ItemCategoryTree.vue | 100 ++++++ src/views/wms/md/item/index.vue | 312 ++++++++++++++++++ src/views/wms/md/warehouse/WarehouseForm.vue | 7 +- .../md/warehouse/area/WarehouseAreaForm.vue | 4 +- src/views/wms/md/warehouse/area/index.vue | 4 +- src/views/wms/md/warehouse/index.vue | 4 +- src/views/wms/utils/format.ts | 62 ++++ 13 files changed, 1002 insertions(+), 5 deletions(-) create mode 100644 src/api/wms/md/item/index.ts create mode 100644 src/api/wms/md/item/sku/index.ts create mode 100644 src/views/wms/md/item/ItemForm.vue create mode 100644 src/views/wms/md/item/brand/components/ItemBrandSelect.vue create mode 100644 src/views/wms/md/item/category/components/ItemCategorySelect.vue create mode 100644 src/views/wms/md/item/category/components/ItemCategoryTree.vue create mode 100644 src/views/wms/md/item/index.vue create mode 100644 src/views/wms/utils/format.ts diff --git a/src/api/wms/md/item/index.ts b/src/api/wms/md/item/index.ts new file mode 100644 index 000000000..77ad3f12d --- /dev/null +++ b/src/api/wms/md/item/index.ts @@ -0,0 +1,55 @@ +import request from '@/config/axios' +import { ItemSkuVO } from './sku' + +// WMS 商品 VO +export interface ItemVO { + id?: number + code?: string + name?: string + categoryId?: number + categoryName?: string + unit?: string + brandId?: number + brandName?: string + remark?: string + skus?: ItemSkuVO[] + createTime?: Date +} + +// WMS 商品 API +export const ItemApi = { + // 查询商品分页 + getItemPage: async (params: any) => { + return await request.get({ url: '/wms/item/page', params }) + }, + + // 查询商品精简列表 + getItemSimpleList: async (params?: any) => { + return await request.get({ url: '/wms/item/simple-list', params }) + }, + + // 查询商品详情 + getItem: async (id: number) => { + return await request.get({ url: '/wms/item/get?id=' + id }) + }, + + // 新增商品 + createItem: async (data: ItemVO) => { + return await request.post({ url: '/wms/item/create', data }) + }, + + // 修改商品 + updateItem: async (data: ItemVO) => { + return await request.put({ url: '/wms/item/update', data }) + }, + + // 删除商品 + deleteItem: async (id: number) => { + return await request.delete({ url: '/wms/item/delete?id=' + id }) + }, + + // 导出商品 + exportItem: async (params: any) => { + return await request.download({ url: '/wms/item/export-excel', params }) + } +} diff --git a/src/api/wms/md/item/sku/index.ts b/src/api/wms/md/item/sku/index.ts new file mode 100644 index 000000000..be07f41ff --- /dev/null +++ b/src/api/wms/md/item/sku/index.ts @@ -0,0 +1,23 @@ +// WMS 商品 SKU VO +export interface ItemSkuVO { + id?: number + name?: string + itemId?: number + itemCode?: string + itemName?: string + categoryId?: number + categoryName?: string + unit?: string + brandId?: number + brandName?: string + barCode?: string + code?: string + length?: number + width?: number + height?: number + grossWeight?: number + netWeight?: number + costPrice?: number + sellingPrice?: number + createTime?: Date +} diff --git a/src/views/wms/md/item/ItemForm.vue b/src/views/wms/md/item/ItemForm.vue new file mode 100644 index 000000000..d0b5aa5c6 --- /dev/null +++ b/src/views/wms/md/item/ItemForm.vue @@ -0,0 +1,291 @@ + + + + diff --git a/src/views/wms/md/item/brand/components/ItemBrandSelect.vue b/src/views/wms/md/item/brand/components/ItemBrandSelect.vue new file mode 100644 index 000000000..87ea86a71 --- /dev/null +++ b/src/views/wms/md/item/brand/components/ItemBrandSelect.vue @@ -0,0 +1,81 @@ + + + + diff --git a/src/views/wms/md/item/category/ItemCategoryForm.vue b/src/views/wms/md/item/category/ItemCategoryForm.vue index 443f4de21..030ab7ea1 100644 --- a/src/views/wms/md/item/category/ItemCategoryForm.vue +++ b/src/views/wms/md/item/category/ItemCategoryForm.vue @@ -23,7 +23,12 @@ - + diff --git a/src/views/wms/md/item/category/components/ItemCategorySelect.vue b/src/views/wms/md/item/category/components/ItemCategorySelect.vue new file mode 100644 index 000000000..5df2a5f1e --- /dev/null +++ b/src/views/wms/md/item/category/components/ItemCategorySelect.vue @@ -0,0 +1,57 @@ + + + + diff --git a/src/views/wms/md/item/category/components/ItemCategoryTree.vue b/src/views/wms/md/item/category/components/ItemCategoryTree.vue new file mode 100644 index 000000000..53a00182a --- /dev/null +++ b/src/views/wms/md/item/category/components/ItemCategoryTree.vue @@ -0,0 +1,100 @@ + + + + diff --git a/src/views/wms/md/item/index.vue b/src/views/wms/md/item/index.vue new file mode 100644 index 000000000..f87befa4d --- /dev/null +++ b/src/views/wms/md/item/index.vue @@ -0,0 +1,312 @@ + + + + diff --git a/src/views/wms/md/warehouse/WarehouseForm.vue b/src/views/wms/md/warehouse/WarehouseForm.vue index 90b886d87..0d3f6e423 100644 --- a/src/views/wms/md/warehouse/WarehouseForm.vue +++ b/src/views/wms/md/warehouse/WarehouseForm.vue @@ -15,7 +15,12 @@ - + ([]) // 仓库精简列表 const selectableWarehouseList = computed(() => - warehouseList.value.filter((warehouse): warehouse is WarehouseVO & { id: number } => !!warehouse.id) + warehouseList.value.filter( + (warehouse): warehouse is WarehouseVO & { id: number } => !!warehouse.id + ) ) const formData = ref({ id: undefined, diff --git a/src/views/wms/md/warehouse/area/index.vue b/src/views/wms/md/warehouse/area/index.vue index 1c51fefc5..8ebb695fb 100644 --- a/src/views/wms/md/warehouse/area/index.vue +++ b/src/views/wms/md/warehouse/area/index.vue @@ -154,7 +154,9 @@ const queryFormRef = ref() // 搜索的表单 const exportLoading = ref(false) // 导出的加载中 const warehouseList = ref([]) // 仓库精简列表 const selectableWarehouseList = computed(() => - warehouseList.value.filter((warehouse): warehouse is WarehouseVO & { id: number } => !!warehouse.id) + warehouseList.value.filter( + (warehouse): warehouse is WarehouseVO & { id: number } => !!warehouse.id + ) ) /** 查询库区列表 */ diff --git a/src/views/wms/md/warehouse/index.vue b/src/views/wms/md/warehouse/index.vue index 329f3caad..178443245 100644 --- a/src/views/wms/md/warehouse/index.vue +++ b/src/views/wms/md/warehouse/index.vue @@ -79,7 +79,9 @@ v-if="AREA_ENABLE" :to="{ name: 'WmsWarehouseArea', params: { warehouseId: scope.row.id } }" > - 库区 + + 库区 + { + if (isNullOrUnDef(value)) { + return '' + } + if (typeof value === 'string' && value.trim() === '') { + return '' + } + const numberValue = typeof value === 'string' ? Number(value) : value + if (!Number.isFinite(numberValue)) { + return '' + } + return numberValue.toFixed(digit) +} + +/** 格式化金额,保留 2 位小数 */ +export const formatPrice = (value?: number | string | null) => { + return formatNumber(value, PRICE_PRECISION) +} + +/** 格式化重量,保留 3 位小数 */ +export const formatWeight = (value?: number | string | null) => { + return formatNumber(value, WEIGHT_PRECISION) +} + +/** 格式化长宽高,保留 1 位小数 */ +export const formatDimension = (value?: number | string | null) => { + return formatNumber(value, DIMENSION_PRECISION) +} + +/** 格式化长宽高组合,保留 1 位小数 */ +export const formatDimensionText = ( + length?: number | string | null, + width?: number | string | null, + height?: number | string | null +) => { + if (!isNullOrUnDef(length) && !isNullOrUnDef(width) && !isNullOrUnDef(height)) { + return [formatDimension(length), formatDimension(width), formatDimension(height)].join(' * ') + } + return [ + !isNullOrUnDef(length) ? `长:${formatDimension(length)}` : undefined, + !isNullOrUnDef(width) ? `宽:${formatDimension(width)}` : undefined, + !isNullOrUnDef(height) ? `高:${formatDimension(height)}` : undefined + ] + .filter(Boolean) + .join(' ') +}