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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + 搜索 + + + + 重置 + + + + 新增 + + + + 导出 + + + + + + + + + + + {{ scope.row.itemName }} + + {{ scope.row.itemCode }} + + + 品牌:{{ scope.row.brandName }} + + + 分类:{{ scope.row.categoryName }} + + + + + + {{ scope.row.name }} + 编号:{{ scope.row.code }} + + 条码:{{ scope.row.barCode }} + + + + + + + 成本价:{{ formatPrice(scope.row.costPrice) }} + + + 销售价:{{ formatPrice(scope.row.sellingPrice) }} + + + + + + + 净重:{{ formatWeight(scope.row.netWeight) }} + + + 毛重:{{ formatWeight(scope.row.grossWeight) }} + + + + + + {{ formatDimensionText(scope.row.length, scope.row.width, scope.row.height) }} + + + + + + 修改 + + + 删除 + + + + + + + + + + + + + + + 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(' ') +}