From c3737d3b7a97d310b367a3b6406b970ba97b2847 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 10 May 2026 01:22:38 +0800 Subject: [PATCH 01/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20warehouse=20=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/wms/warehouse/area/index.ts | 45 ++++ src/api/wms/warehouse/index.ts | 44 ++++ src/router/modules/remaining.ts | 23 ++ src/views/wms/utils/config.ts | 17 ++ src/views/wms/warehouse/WarehouseForm.vue | 116 ++++++++++ .../wms/warehouse/area/WarehouseAreaForm.vue | 137 ++++++++++++ src/views/wms/warehouse/area/index.vue | 211 ++++++++++++++++++ src/views/wms/warehouse/index.vue | 181 +++++++++++++++ 8 files changed, 774 insertions(+) create mode 100644 src/api/wms/warehouse/area/index.ts create mode 100644 src/api/wms/warehouse/index.ts create mode 100644 src/views/wms/utils/config.ts create mode 100644 src/views/wms/warehouse/WarehouseForm.vue create mode 100644 src/views/wms/warehouse/area/WarehouseAreaForm.vue create mode 100644 src/views/wms/warehouse/area/index.vue create mode 100644 src/views/wms/warehouse/index.vue diff --git a/src/api/wms/warehouse/area/index.ts b/src/api/wms/warehouse/area/index.ts new file mode 100644 index 000000000..e6acb247b --- /dev/null +++ b/src/api/wms/warehouse/area/index.ts @@ -0,0 +1,45 @@ +import request from '@/config/axios' + +// WMS 库区 VO +export interface WarehouseAreaVO { + id?: number + code?: string + name?: string + warehouseId?: number + warehouseName?: string + remark?: string + createTime?: Date +} + +// WMS 库区 API +export const WarehouseAreaApi = { + // 查询库区分页 + getWarehouseAreaPage: async (params: any) => { + return await request.get({ url: '/wms/warehouse-area/page', params }) + }, + + // 查询库区精简列表 + getWarehouseAreaSimpleList: async (warehouseId?: number) => { + return await request.get({ url: '/wms/warehouse-area/simple-list', params: { warehouseId } }) + }, + + // 查询库区详情 + getWarehouseArea: async (id: number) => { + return await request.get({ url: '/wms/warehouse-area/get?id=' + id }) + }, + + // 新增库区 + createWarehouseArea: async (data: WarehouseAreaVO) => { + return await request.post({ url: '/wms/warehouse-area/create', data }) + }, + + // 修改库区 + updateWarehouseArea: async (data: WarehouseAreaVO) => { + return await request.put({ url: '/wms/warehouse-area/update', data }) + }, + + // 删除库区 + deleteWarehouseArea: async (id: number) => { + return await request.delete({ url: '/wms/warehouse-area/delete?id=' + id }) + } +} diff --git a/src/api/wms/warehouse/index.ts b/src/api/wms/warehouse/index.ts new file mode 100644 index 000000000..2ed849625 --- /dev/null +++ b/src/api/wms/warehouse/index.ts @@ -0,0 +1,44 @@ +import request from '@/config/axios' + +// WMS 仓库 VO +export interface WarehouseVO { + id?: number + code?: string + name?: string + remark?: string + sort?: number + createTime?: Date +} + +// WMS 仓库 API +export const WarehouseApi = { + // 查询仓库分页 + getWarehousePage: async (params: any) => { + return await request.get({ url: '/wms/warehouse/page', params }) + }, + + // 查询仓库精简列表 + getWarehouseSimpleList: async () => { + return await request.get({ url: '/wms/warehouse/simple-list' }) + }, + + // 查询仓库详情 + getWarehouse: async (id: number) => { + return await request.get({ url: '/wms/warehouse/get?id=' + id }) + }, + + // 新增仓库 + createWarehouse: async (data: WarehouseVO) => { + return await request.post({ url: '/wms/warehouse/create', data }) + }, + + // 修改仓库 + updateWarehouse: async (data: WarehouseVO) => { + return await request.put({ url: '/wms/warehouse/update', data }) + }, + + // 删除仓库 + deleteWarehouse: async (id: number) => { + return await request.delete({ url: '/wms/warehouse/delete?id=' + id }) + } +} diff --git a/src/router/modules/remaining.ts b/src/router/modules/remaining.ts index ac59b3ab0..1ed0b0627 100644 --- a/src/router/modules/remaining.ts +++ b/src/router/modules/remaining.ts @@ -127,6 +127,29 @@ const remainingRouter: AppRouteRecordRaw[] = [ } ] }, + { + path: '/wms', + component: Layout, + name: 'Wms', + meta: { + hidden: true + }, + children: [ + { + path: 'warehouse/area/:warehouseId', + component: () => import('@/views/wms/warehouse/area/index.vue'), + name: 'WmsWarehouseArea', + meta: { + title: '库区管理', + noCache: true, + hidden: true, + canTo: true, + icon: '', + activeMenu: '/wms/basic/warehouse' + } + } + ] + }, { path: '/codegen', component: Layout, diff --git a/src/views/wms/utils/config.ts b/src/views/wms/utils/config.ts new file mode 100644 index 000000000..7a6f79260 --- /dev/null +++ b/src/views/wms/utils/config.ts @@ -0,0 +1,17 @@ +/** + * WMS 前端运行参数 + * + * 标注「后端镜像」的常量与 yudao.wms.* 配置默认值一致;调整后端配置时需同步修改这里 + */ + +// ==================== 后端镜像(与 WmsProperties 默认值对齐) ==================== + +/** 是否启用库区模式(对齐 yudao.wms.area-enable) */ +export const AREA_ENABLE = true + +/** + * 是否启用批次/效期/库存明细模式(对齐 yudao.wms.batch-enable) + * + * 依赖 AREA_ENABLE = true + */ +export const BATCH_ENABLE = true diff --git a/src/views/wms/warehouse/WarehouseForm.vue b/src/views/wms/warehouse/WarehouseForm.vue new file mode 100644 index 000000000..e703117d4 --- /dev/null +++ b/src/views/wms/warehouse/WarehouseForm.vue @@ -0,0 +1,116 @@ + + + + diff --git a/src/views/wms/warehouse/area/WarehouseAreaForm.vue b/src/views/wms/warehouse/area/WarehouseAreaForm.vue new file mode 100644 index 000000000..09195a47d --- /dev/null +++ b/src/views/wms/warehouse/area/WarehouseAreaForm.vue @@ -0,0 +1,137 @@ + + + + diff --git a/src/views/wms/warehouse/area/index.vue b/src/views/wms/warehouse/area/index.vue new file mode 100644 index 000000000..fad5e2d16 --- /dev/null +++ b/src/views/wms/warehouse/area/index.vue @@ -0,0 +1,211 @@ + + + + diff --git a/src/views/wms/warehouse/index.vue b/src/views/wms/warehouse/index.vue new file mode 100644 index 000000000..b0def6622 --- /dev/null +++ b/src/views/wms/warehouse/index.vue @@ -0,0 +1,181 @@ + + + + From 1aad2f1648b778743b4f52c765ed25e9e73152dc Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 10 May 2026 09:02:51 +0800 Subject: [PATCH 02/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E8=BF=81=E7=A7=BB=E5=88=B0=20md=20=E6=9B=B4=E6=95=B4=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/wms/{ => md}/warehouse/area/index.ts | 0 src/api/wms/{ => md}/warehouse/index.ts | 0 src/router/modules/remaining.ts | 6 +++--- src/views/wms/{ => md}/warehouse/WarehouseForm.vue | 2 +- src/views/wms/{ => md}/warehouse/area/WarehouseAreaForm.vue | 4 ++-- src/views/wms/{ => md}/warehouse/area/index.vue | 4 ++-- src/views/wms/{ => md}/warehouse/index.vue | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) rename src/api/wms/{ => md}/warehouse/area/index.ts (100%) rename src/api/wms/{ => md}/warehouse/index.ts (100%) rename src/views/wms/{ => md}/warehouse/WarehouseForm.vue (98%) rename src/views/wms/{ => md}/warehouse/area/WarehouseAreaForm.vue (96%) rename src/views/wms/{ => md}/warehouse/area/index.vue (97%) rename src/views/wms/{ => md}/warehouse/index.vue (98%) diff --git a/src/api/wms/warehouse/area/index.ts b/src/api/wms/md/warehouse/area/index.ts similarity index 100% rename from src/api/wms/warehouse/area/index.ts rename to src/api/wms/md/warehouse/area/index.ts diff --git a/src/api/wms/warehouse/index.ts b/src/api/wms/md/warehouse/index.ts similarity index 100% rename from src/api/wms/warehouse/index.ts rename to src/api/wms/md/warehouse/index.ts diff --git a/src/router/modules/remaining.ts b/src/router/modules/remaining.ts index 1ed0b0627..a2ea1fbd9 100644 --- a/src/router/modules/remaining.ts +++ b/src/router/modules/remaining.ts @@ -136,8 +136,8 @@ const remainingRouter: AppRouteRecordRaw[] = [ }, children: [ { - path: 'warehouse/area/:warehouseId', - component: () => import('@/views/wms/warehouse/area/index.vue'), + path: 'md/warehouse/area/:warehouseId', + component: () => import('@/views/wms/md/warehouse/area/index.vue'), name: 'WmsWarehouseArea', meta: { title: '库区管理', @@ -145,7 +145,7 @@ const remainingRouter: AppRouteRecordRaw[] = [ hidden: true, canTo: true, icon: '', - activeMenu: '/wms/basic/warehouse' + activeMenu: '/wms/md/warehouse' } } ] diff --git a/src/views/wms/warehouse/WarehouseForm.vue b/src/views/wms/md/warehouse/WarehouseForm.vue similarity index 98% rename from src/views/wms/warehouse/WarehouseForm.vue rename to src/views/wms/md/warehouse/WarehouseForm.vue index e703117d4..90b886d87 100644 --- a/src/views/wms/warehouse/WarehouseForm.vue +++ b/src/views/wms/md/warehouse/WarehouseForm.vue @@ -34,7 +34,7 @@ diff --git a/src/views/wms/md/item/brand/index.vue b/src/views/wms/md/item/brand/index.vue new file mode 100644 index 000000000..ab342d1ba --- /dev/null +++ b/src/views/wms/md/item/brand/index.vue @@ -0,0 +1,183 @@ + + + + diff --git a/src/views/wms/md/item/category/ItemCategoryForm.vue b/src/views/wms/md/item/category/ItemCategoryForm.vue new file mode 100644 index 000000000..443f4de21 --- /dev/null +++ b/src/views/wms/md/item/category/ItemCategoryForm.vue @@ -0,0 +1,144 @@ + + + diff --git a/src/views/wms/md/item/category/index.vue b/src/views/wms/md/item/category/index.vue new file mode 100644 index 000000000..c62ef651c --- /dev/null +++ b/src/views/wms/md/item/category/index.vue @@ -0,0 +1,202 @@ + + + + diff --git a/src/views/wms/md/warehouse/area/index.vue b/src/views/wms/md/warehouse/area/index.vue index 39d041f8b..1c51fefc5 100644 --- a/src/views/wms/md/warehouse/area/index.vue +++ b/src/views/wms/md/warehouse/area/index.vue @@ -60,6 +60,16 @@ 新增 + + + 导出 + @@ -121,6 +131,7 @@ import { dateFormatter } from '@/utils/formatTime' import { WarehouseApi, WarehouseVO } from '@/api/wms/md/warehouse' import { WarehouseAreaApi, WarehouseAreaVO } from '@/api/wms/md/warehouse/area' import WarehouseAreaForm from './WarehouseAreaForm.vue' +import download from '@/utils/download' /** WMS 库区管理 */ defineOptions({ name: 'WmsWarehouseArea' }) @@ -140,6 +151,7 @@ const queryParams = reactive({ name: undefined }) const queryFormRef = ref() // 搜索的表单 +const exportLoading = ref(false) // 导出的加载中 const warehouseList = ref([]) // 仓库精简列表 const selectableWarehouseList = computed(() => warehouseList.value.filter((warehouse): warehouse is WarehouseVO & { id: number } => !!warehouse.id) @@ -203,6 +215,21 @@ const handleDelete = async (id: number) => { } catch {} } +/** 导出按钮操作 */ +const handleExport = async () => { + try { + // 导出的二次确认 + await message.exportConfirm() + // 发起导出 + exportLoading.value = true + const data = await WarehouseAreaApi.exportWarehouseArea(queryParams) + download.excel(data, '库区.xls') + } catch { + } finally { + exportLoading.value = false + } +} + /** 初始化 */ onMounted(async () => { await getWarehouseList() diff --git a/src/views/wms/md/warehouse/index.vue b/src/views/wms/md/warehouse/index.vue index 213cf29c7..329f3caad 100644 --- a/src/views/wms/md/warehouse/index.vue +++ b/src/views/wms/md/warehouse/index.vue @@ -45,6 +45,16 @@ 新增 + + + 导出 + @@ -108,6 +118,7 @@ import { dateFormatter } from '@/utils/formatTime' import { WarehouseApi, WarehouseVO } from '@/api/wms/md/warehouse' import { AREA_ENABLE } from '@/views/wms/utils/config' import WarehouseForm from './WarehouseForm.vue' +import download from '@/utils/download' /** WMS 仓库管理 */ defineOptions({ name: 'WmsWarehouse' }) @@ -125,6 +136,7 @@ const queryParams = reactive({ name: undefined }) const queryFormRef = ref() // 搜索的表单 +const exportLoading = ref(false) // 导出的加载中 /** 查询仓库列表 */ const getList = async () => { @@ -174,6 +186,21 @@ const handleDelete = async (id: number) => { } catch {} } +/** 导出按钮操作 */ +const handleExport = async () => { + try { + // 导出的二次确认 + await message.exportConfirm() + // 发起导出 + exportLoading.value = true + const data = await WarehouseApi.exportWarehouse(queryParams) + download.excel(data, '仓库.xls') + } catch { + } finally { + exportLoading.value = false + } +} + /** 初始化 */ onMounted(() => { getList() From d8907811496931d38e4fa69b37f16301d7b9b87e Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 10 May 2026 21:33:42 +0800 Subject: [PATCH 04/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=95=86=E5=93=81=E4=BF=A1=E6=81=AF=E3=80=81?= =?UTF-8?q?SKU=20=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(' ') +} From 4da16e95f5a873760b1abfa0adbb7df21d59d4d1 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 10 May 2026 22:46:23 +0800 Subject: [PATCH 05/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=95=86=E5=93=81=E4=BF=A1=E6=81=AF=E3=80=81?= =?UTF-8?q?SKU=20=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/dict.ts | 3 +++ src/views/wms/md/item/ItemForm.vue | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/utils/dict.ts b/src/utils/dict.ts index 91909f538..455c3d656 100644 --- a/src/utils/dict.ts +++ b/src/utils/dict.ts @@ -216,6 +216,9 @@ export enum DICT_TYPE { ERP_AUDIT_STATUS = 'erp_audit_status', // ERP 审批状态 ERP_STOCK_RECORD_BIZ_TYPE = 'erp_stock_record_biz_type', // 库存明细的业务类型 + // ========== WMS - 仓库管理模块 ========== + WMS_MERCHANT_TYPE = 'merchant_type', // WMS 供应商企业类型 + // ========== AI - 人工智能模块 ========== AI_PLATFORM = 'ai_platform', // AI 平台 AI_MODEL_TYPE = 'ai_model_type', // AI 模型类型 diff --git a/src/views/wms/md/item/ItemForm.vue b/src/views/wms/md/item/ItemForm.vue index d0b5aa5c6..79b78d646 100644 --- a/src/views/wms/md/item/ItemForm.vue +++ b/src/views/wms/md/item/ItemForm.vue @@ -35,7 +35,7 @@ - + From 711d5abc0aba33606d92332a26b82a55022b6fb8 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 10 May 2026 23:56:28 +0800 Subject: [PATCH 06/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=BE=80=E6=9D=A5=E4=BC=81=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/wms/md/merchant/index.ts | 57 ++++++ src/utils/dict.ts | 2 +- src/views/wms/md/merchant/MerchantForm.vue | 185 ++++++++++++++++++ src/views/wms/md/merchant/index.vue | 211 +++++++++++++++++++++ 4 files changed, 454 insertions(+), 1 deletion(-) create mode 100644 src/api/wms/md/merchant/index.ts create mode 100644 src/views/wms/md/merchant/MerchantForm.vue create mode 100644 src/views/wms/md/merchant/index.vue diff --git a/src/api/wms/md/merchant/index.ts b/src/api/wms/md/merchant/index.ts new file mode 100644 index 000000000..7a552a29a --- /dev/null +++ b/src/api/wms/md/merchant/index.ts @@ -0,0 +1,57 @@ +import request from '@/config/axios' + +// WMS 往来企业 VO +export interface MerchantVO { + id?: number + code?: string + name?: string + type?: number + level?: string + bankName?: string + bankAccount?: string + address?: string + mobile?: string + telephone?: string + contact?: string + email?: string + remark?: string + createTime?: Date +} + +// WMS 往来企业 API +export const MerchantApi = { + // 查询往来企业分页 + getMerchantPage: async (params: any) => { + return await request.get({ url: '/wms/merchant/page', params }) + }, + + // 查询往来企业精简列表 + getMerchantSimpleList: async (params?: any) => { + return await request.get({ url: '/wms/merchant/simple-list', params }) + }, + + // 查询往来企业详情 + getMerchant: async (id: number) => { + return await request.get({ url: '/wms/merchant/get?id=' + id }) + }, + + // 新增往来企业 + createMerchant: async (data: MerchantVO) => { + return await request.post({ url: '/wms/merchant/create', data }) + }, + + // 修改往来企业 + updateMerchant: async (data: MerchantVO) => { + return await request.put({ url: '/wms/merchant/update', data }) + }, + + // 删除往来企业 + deleteMerchant: async (id: number) => { + return await request.delete({ url: '/wms/merchant/delete?id=' + id }) + }, + + // 导出往来企业 + exportMerchant: async (params: any) => { + return await request.download({ url: '/wms/merchant/export-excel', params }) + } +} diff --git a/src/utils/dict.ts b/src/utils/dict.ts index 455c3d656..130c239ab 100644 --- a/src/utils/dict.ts +++ b/src/utils/dict.ts @@ -217,7 +217,7 @@ export enum DICT_TYPE { ERP_STOCK_RECORD_BIZ_TYPE = 'erp_stock_record_biz_type', // 库存明细的业务类型 // ========== WMS - 仓库管理模块 ========== - WMS_MERCHANT_TYPE = 'merchant_type', // WMS 供应商企业类型 + WMS_MERCHANT_TYPE = 'merchant_type', // WMS 往来企业类型 // ========== AI - 人工智能模块 ========== AI_PLATFORM = 'ai_platform', // AI 平台 diff --git a/src/views/wms/md/merchant/MerchantForm.vue b/src/views/wms/md/merchant/MerchantForm.vue new file mode 100644 index 000000000..6571f0066 --- /dev/null +++ b/src/views/wms/md/merchant/MerchantForm.vue @@ -0,0 +1,185 @@ + + + + diff --git a/src/views/wms/md/merchant/index.vue b/src/views/wms/md/merchant/index.vue new file mode 100644 index 000000000..5aa27392f --- /dev/null +++ b/src/views/wms/md/merchant/index.vue @@ -0,0 +1,211 @@ + + + + From 32442830b0606edc99944efa0cd989af716a7a67 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 11 May 2026 09:45:24 +0800 Subject: [PATCH 07/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20inventory?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/dict.ts | 1 + src/views/wms/inventory/statistics/index.vue | 342 ++++++++++++++++++ .../md/warehouse/area/WarehouseAreaForm.vue | 23 +- src/views/wms/md/warehouse/area/index.vue | 17 +- .../components/WarehouseAreaSelect.vue | 83 +++++ .../warehouse/components/WarehouseSelect.vue | 81 +++++ 6 files changed, 512 insertions(+), 35 deletions(-) create mode 100644 src/views/wms/inventory/statistics/index.vue create mode 100644 src/views/wms/md/warehouse/components/WarehouseAreaSelect.vue create mode 100644 src/views/wms/md/warehouse/components/WarehouseSelect.vue diff --git a/src/utils/dict.ts b/src/utils/dict.ts index 130c239ab..6334cae2b 100644 --- a/src/utils/dict.ts +++ b/src/utils/dict.ts @@ -218,6 +218,7 @@ export enum DICT_TYPE { // ========== WMS - 仓库管理模块 ========== WMS_MERCHANT_TYPE = 'merchant_type', // WMS 往来企业类型 + WMS_INVENTORY_HISTORY_TYPE = 'wms_inventory_history_type', // WMS 库存记录类型 // ========== AI - 人工智能模块 ========== AI_PLATFORM = 'ai_platform', // AI 平台 diff --git a/src/views/wms/inventory/statistics/index.vue b/src/views/wms/inventory/statistics/index.vue new file mode 100644 index 000000000..f5aa31026 --- /dev/null +++ b/src/views/wms/inventory/statistics/index.vue @@ -0,0 +1,342 @@ + + + + + + diff --git a/src/views/wms/md/warehouse/area/WarehouseAreaForm.vue b/src/views/wms/md/warehouse/area/WarehouseAreaForm.vue index 3d234c3ff..5b1e12185 100644 --- a/src/views/wms/md/warehouse/area/WarehouseAreaForm.vue +++ b/src/views/wms/md/warehouse/area/WarehouseAreaForm.vue @@ -9,14 +9,7 @@ label-width="100px" > - - - + @@ -41,8 +34,8 @@ diff --git a/src/views/wms/md/warehouse/components/WarehouseSelect.vue b/src/views/wms/md/warehouse/components/WarehouseSelect.vue new file mode 100644 index 000000000..b652ea596 --- /dev/null +++ b/src/views/wms/md/warehouse/components/WarehouseSelect.vue @@ -0,0 +1,81 @@ + + + + From 32bbd912a2573bdc11c0003c8519d3be456e85ea Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 11 May 2026 13:07:35 +0800 Subject: [PATCH 08/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20inventory=20history?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/wms/inventory/detail/index.ts | 36 ++ src/api/wms/inventory/history/index.ts | 37 ++ src/api/wms/inventory/index.ts | 28 ++ src/views/wms/inventory/detail/index.vue | 374 ++++++++++++++++++ src/views/wms/inventory/history/index.vue | 281 +++++++++++++ .../inventory/{statistics => index}/index.vue | 11 +- 6 files changed, 763 insertions(+), 4 deletions(-) create mode 100644 src/api/wms/inventory/detail/index.ts create mode 100644 src/api/wms/inventory/history/index.ts create mode 100644 src/api/wms/inventory/index.ts create mode 100644 src/views/wms/inventory/detail/index.vue create mode 100644 src/views/wms/inventory/history/index.vue rename src/views/wms/inventory/{statistics => index}/index.vue (97%) diff --git a/src/api/wms/inventory/detail/index.ts b/src/api/wms/inventory/detail/index.ts new file mode 100644 index 000000000..d34dc613a --- /dev/null +++ b/src/api/wms/inventory/detail/index.ts @@ -0,0 +1,36 @@ +import request from '@/config/axios' + +// WMS 库存明细 VO +export interface InventoryDetailVO { + id?: number + itemId?: number + itemCode?: string + itemName?: string + unit?: string + skuId?: number + skuCode?: string + skuName?: string + warehouseId?: number + warehouseName?: string + areaId?: number + areaName?: string + quantity?: number + remainQuantity?: number + batchNo?: string + productionDate?: Date + expirationDate?: Date + amount?: number + remark?: string + orderId?: number + orderNo?: string + orderType?: number + createTime?: Date +} + +// WMS 库存明细 API +export const InventoryDetailApi = { + // 查询库存明细分页 + getInventoryDetailPage: async (params: any) => { + return await request.get({ url: '/wms/inventory-detail/page', params }) + } +} diff --git a/src/api/wms/inventory/history/index.ts b/src/api/wms/inventory/history/index.ts new file mode 100644 index 000000000..c2db7d786 --- /dev/null +++ b/src/api/wms/inventory/history/index.ts @@ -0,0 +1,37 @@ +import request from '@/config/axios' + +// WMS 库存记录 VO +export interface InventoryHistoryVO { + id?: number + itemId?: number + itemCode?: string + itemName?: string + unit?: string + skuId?: number + skuCode?: string + skuName?: string + warehouseId?: number + warehouseName?: string + areaId?: number + areaName?: string + quantity?: number + beforeQuantity?: number + afterQuantity?: number + batchNo?: string + productionDate?: Date + expirationDate?: Date + amount?: number + remark?: string + orderId?: number + orderNo?: string + orderType?: number + createTime?: Date +} + +// WMS 库存记录 API +export const InventoryHistoryApi = { + // 查询库存记录分页 + getInventoryHistoryPage: async (params: any) => { + return await request.get({ url: '/wms/inventory-history/page', params }) + } +} diff --git a/src/api/wms/inventory/index.ts b/src/api/wms/inventory/index.ts new file mode 100644 index 000000000..3f8d65a6d --- /dev/null +++ b/src/api/wms/inventory/index.ts @@ -0,0 +1,28 @@ +import request from '@/config/axios' + +// WMS 库存统计 VO +export interface InventoryVO { + id?: number + itemId?: number + itemCode?: string + itemName?: string + unit?: string + skuId?: number + skuCode?: string + skuName?: string + warehouseId?: number + warehouseName?: string + areaId?: number + areaName?: string + quantity?: number + remark?: string + createTime?: Date +} + +// WMS 库存统计 API +export const InventoryApi = { + // 查询库存统计分页 + getInventoryPage: async (params: any) => { + return await request.get({ url: '/wms/inventory/page', params }) + } +} diff --git a/src/views/wms/inventory/detail/index.vue b/src/views/wms/inventory/detail/index.vue new file mode 100644 index 000000000..bee68a602 --- /dev/null +++ b/src/views/wms/inventory/detail/index.vue @@ -0,0 +1,374 @@ + + + + + + diff --git a/src/views/wms/inventory/history/index.vue b/src/views/wms/inventory/history/index.vue new file mode 100644 index 000000000..e408b324d --- /dev/null +++ b/src/views/wms/inventory/history/index.vue @@ -0,0 +1,281 @@ + + + + + + diff --git a/src/views/wms/inventory/statistics/index.vue b/src/views/wms/inventory/index/index.vue similarity index 97% rename from src/views/wms/inventory/statistics/index.vue rename to src/views/wms/inventory/index/index.vue index f5aa31026..e5d24355b 100644 --- a/src/views/wms/inventory/statistics/index.vue +++ b/src/views/wms/inventory/index/index.vue @@ -93,7 +93,7 @@ [ ...(AREA_ENABLE ? [{ label: '库区', value: INVENTORY_DIMENSION.AREA }] : []), { label: '商品', value: INVENTORY_DIMENSION.ITEM } ]) -const warehouseDimensionList = [INVENTORY_DIMENSION.WAREHOUSE, INVENTORY_DIMENSION.AREA] +const warehouseDimensionList: InventoryDimension[] = [ + INVENTORY_DIMENSION.WAREHOUSE, + INVENTORY_DIMENSION.AREA +] interface InventoryRow extends InventoryVO { warehouseItemId?: string @@ -336,7 +339,7 @@ onMounted(async () => { From 314293ced3ba9f7fe2cab42a658b593ec6e3f3bc Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 11 May 2026 14:10:16 +0800 Subject: [PATCH 09/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20inventory=20=E7=9A=84=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/wms/inventory/index/index.vue | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/views/wms/inventory/index/index.vue b/src/views/wms/inventory/index/index.vue index e5d24355b..f70cfe56a 100644 --- a/src/views/wms/inventory/index/index.vue +++ b/src/views/wms/inventory/index/index.vue @@ -27,7 +27,7 @@ @change="handleWarehouseChange" /> - + { try { const data = await InventoryApi.getInventoryPage({ ...queryParams, - areaId: AREA_ENABLE ? queryParams.areaId : undefined, + areaId: isAreaQueryVisible.value ? queryParams.areaId : undefined, minQuantity: filterZero.value ? 1 : undefined }) list.value = data.list.map((item: InventoryVO) => ({ @@ -295,6 +295,11 @@ const handleWarehouseChange = () => { queryParams.areaId = undefined } +/** 是否展示库区搜索项 */ +const isAreaQueryVisible = computed(() => { + return AREA_ENABLE && queryParams.type !== INVENTORY_DIMENSION.WAREHOUSE +}) + /** 合并库存统计的维度单元格 */ const spanMethod = ({ column, rowIndex }: SpanMethodProps) => { const property = column.property From f0cd6391370ac7ccbda3145b3e2a2709d30b2019 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Mon, 11 May 2026 15:11:39 +0800 Subject: [PATCH 10/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20inventory=20history?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/wms/inventory/detail/index.vue | 34 +++++++++++++++++++++--- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/src/views/wms/inventory/detail/index.vue b/src/views/wms/inventory/detail/index.vue index bee68a602..52516f3bd 100644 --- a/src/views/wms/inventory/detail/index.vue +++ b/src/views/wms/inventory/detail/index.vue @@ -79,9 +79,25 @@ @keyup.enter="handleQuery" /> - + + + + + + Date: Tue, 12 May 2026 11:14:21 +0800 Subject: [PATCH 11/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20inv=20=E5=BA=93=E5=AD=98=E7=9A=84=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E3=80=81=E4=BF=AE=E6=94=B9=E6=96=B9=E6=B3=95=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E6=8F=90=E4=BE=9B=E7=9B=B8=E5=85=B3=E5=8D=95=E6=B5=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/wms/order/receipt/detail/index.ts | 23 ++++++++ src/api/wms/order/receipt/index.ts | 70 +++++++++++++++++++++++ src/utils/dict.ts | 2 + 3 files changed, 95 insertions(+) create mode 100644 src/api/wms/order/receipt/detail/index.ts create mode 100644 src/api/wms/order/receipt/index.ts diff --git a/src/api/wms/order/receipt/detail/index.ts b/src/api/wms/order/receipt/detail/index.ts new file mode 100644 index 000000000..7d6990a39 --- /dev/null +++ b/src/api/wms/order/receipt/detail/index.ts @@ -0,0 +1,23 @@ +// WMS 入库单明细 VO +export interface ReceiptOrderDetailVO { + id?: number + orderId?: number + itemId?: number + itemCode?: string + itemName?: string + unit?: string + skuId?: number + skuCode?: string + skuName?: string + warehouseId?: number + warehouseName?: string + areaId?: number + areaName?: string + batchNo?: string + productionDate?: Date + expirationDate?: Date + quantity?: number + amount?: number + remark?: string + createTime?: Date +} diff --git a/src/api/wms/order/receipt/index.ts b/src/api/wms/order/receipt/index.ts new file mode 100644 index 000000000..6b2992ea5 --- /dev/null +++ b/src/api/wms/order/receipt/index.ts @@ -0,0 +1,70 @@ +import request from '@/config/axios' +import { ReceiptOrderDetailVO } from './detail' + +// WMS 入库单 VO +export interface ReceiptOrderVO { + id?: number + no?: string + type?: number + status?: number + bizOrderNo?: string + merchantId?: number + merchantName?: string + remark?: string + warehouseId?: number + warehouseName?: string + areaId?: number + areaName?: string + totalQuantity?: number + totalAmount?: number + details?: ReceiptOrderDetailVO[] + createTime?: Date + creator?: string + updateTime?: Date + updater?: string +} + +// WMS 入库单 API +export const ReceiptOrderApi = { + // 查询入库单分页 + getReceiptOrderPage: async (params: any) => { + return await request.get({ url: '/wms/receipt-order/page', params }) + }, + + // 查询入库单详情 + getReceiptOrder: async (id: number) => { + return await request.get({ url: '/wms/receipt-order/get?id=' + id }) + }, + + // 查询入库单明细 + getReceiptOrderDetailListByOrderId: async (orderId: number) => { + return await request.get({ + url: '/wms/receipt-order-detail/list-by-order-id?orderId=' + orderId + }) + }, + + // 新增入库单 + createReceiptOrder: async (data: ReceiptOrderVO) => { + return await request.post({ url: '/wms/receipt-order/create', data }) + }, + + // 修改入库单 + updateReceiptOrder: async (data: ReceiptOrderVO) => { + return await request.put({ url: '/wms/receipt-order/update', data }) + }, + + // 完成入库 + completeReceiptOrder: async (data: ReceiptOrderVO) => { + return await request.put({ url: '/wms/receipt-order/complete', data }) + }, + + // 删除入库单 + deleteReceiptOrder: async (id: number) => { + return await request.delete({ url: '/wms/receipt-order/delete?id=' + id }) + }, + + // 导出入库单 + exportReceiptOrder: async (params: any) => { + return await request.download({ url: '/wms/receipt-order/export-excel', params }) + } +} diff --git a/src/utils/dict.ts b/src/utils/dict.ts index 6334cae2b..d549f0152 100644 --- a/src/utils/dict.ts +++ b/src/utils/dict.ts @@ -219,6 +219,8 @@ export enum DICT_TYPE { // ========== WMS - 仓库管理模块 ========== WMS_MERCHANT_TYPE = 'merchant_type', // WMS 往来企业类型 WMS_INVENTORY_HISTORY_TYPE = 'wms_inventory_history_type', // WMS 库存记录类型 + WMS_RECEIPT_ORDER_STATUS = 'wms_receipt_order_status', // WMS 入库单状态 + WMS_RECEIPT_ORDER_TYPE = 'wms_receipt_order_type', // WMS 入库单类型 // ========== AI - 人工智能模块 ========== AI_PLATFORM = 'ai_platform', // AI 平台 From c865dfe4882b1b1e4acd1a87987e3a66b5230e14 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 12 May 2026 23:02:46 +0800 Subject: [PATCH 12/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E8=BF=9B=E4=B8=80=E6=AD=A5=E4=BC=98=E5=8C=96=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E5=8D=95=E7=9A=84=E5=90=8E=E7=AB=AF=E5=AE=9E=E7=8E=B0=EF=BC=88?= =?UTF-8?q?=E5=AF=B9=E9=BD=90=20mes=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/wms/order/receipt/index.ts | 11 +++- src/utils/dict.ts | 2 +- src/views/wms/inventory/detail/index.vue | 6 +- src/views/wms/inventory/history/index.vue | 8 +-- src/views/wms/inventory/index/index.vue | 4 +- src/views/wms/utils/constants.ts | 19 ++++++ src/views/wms/utils/format.ts | 71 +++++++++++++++++------ 7 files changed, 92 insertions(+), 29 deletions(-) create mode 100644 src/views/wms/utils/constants.ts diff --git a/src/api/wms/order/receipt/index.ts b/src/api/wms/order/receipt/index.ts index 6b2992ea5..3defe4216 100644 --- a/src/api/wms/order/receipt/index.ts +++ b/src/api/wms/order/receipt/index.ts @@ -20,8 +20,10 @@ export interface ReceiptOrderVO { details?: ReceiptOrderDetailVO[] createTime?: Date creator?: string + creatorName?: string updateTime?: Date updater?: string + updaterName?: string } // WMS 入库单 API @@ -54,8 +56,13 @@ export const ReceiptOrderApi = { }, // 完成入库 - completeReceiptOrder: async (data: ReceiptOrderVO) => { - return await request.put({ url: '/wms/receipt-order/complete', data }) + completeReceiptOrder: async (id: number) => { + return await request.put({ url: '/wms/receipt-order/complete?id=' + id }) + }, + + // 作废入库单 + cancelReceiptOrder: async (id: number) => { + return await request.put({ url: '/wms/receipt-order/cancel?id=' + id }) }, // 删除入库单 diff --git a/src/utils/dict.ts b/src/utils/dict.ts index d549f0152..02d91adde 100644 --- a/src/utils/dict.ts +++ b/src/utils/dict.ts @@ -219,7 +219,7 @@ export enum DICT_TYPE { // ========== WMS - 仓库管理模块 ========== WMS_MERCHANT_TYPE = 'merchant_type', // WMS 往来企业类型 WMS_INVENTORY_HISTORY_TYPE = 'wms_inventory_history_type', // WMS 库存记录类型 - WMS_RECEIPT_ORDER_STATUS = 'wms_receipt_order_status', // WMS 入库单状态 + WMS_ORDER_STATUS = 'wms_order_status', // WMS 单据状态 WMS_RECEIPT_ORDER_TYPE = 'wms_receipt_order_type', // WMS 入库单类型 // ========== AI - 人工智能模块 ========== diff --git a/src/views/wms/inventory/detail/index.vue b/src/views/wms/inventory/detail/index.vue index 52516f3bd..5df1470a7 100644 --- a/src/views/wms/inventory/detail/index.vue +++ b/src/views/wms/inventory/detail/index.vue @@ -203,8 +203,8 @@ /> @@ -187,7 +187,7 @@ import { InventoryApi, InventoryVO } from '@/api/wms/inventory' import WarehouseAreaSelect from '@/views/wms/md/warehouse/components/WarehouseAreaSelect.vue' import WarehouseSelect from '@/views/wms/md/warehouse/components/WarehouseSelect.vue' import { AREA_ENABLE } from '@/views/wms/utils/config' -import { formatNumber } from '@/views/wms/utils/format' +import { formatQuantity } from '@/views/wms/utils/format' /** WMS 库存统计 */ defineOptions({ name: 'WmsInventory' }) diff --git a/src/views/wms/utils/constants.ts b/src/views/wms/utils/constants.ts new file mode 100644 index 000000000..ff922ce07 --- /dev/null +++ b/src/views/wms/utils/constants.ts @@ -0,0 +1,19 @@ +/** 单据状态枚举 */ +export const OrderStatusEnum = { + PREPARE: 0, // 草稿 + FINISHED: 4, // 已完成 + CANCELED: 5 // 已作废 +} as const + +/** 往来企业类型枚举 */ +export const MerchantTypeEnum = { + CUSTOMER: 1, // 客户 + SUPPLIER: 2, // 供应商 + CUSTOMER_SUPPLIER: 3 // 客户/供应商 +} as const + +/** 供应商类型的往来企业 */ +export const SupplierMerchantTypeList = [ + MerchantTypeEnum.SUPPLIER, + MerchantTypeEnum.CUSTOMER_SUPPLIER +] diff --git a/src/views/wms/utils/format.ts b/src/views/wms/utils/format.ts index 5b955746e..4f2a3b338 100644 --- a/src/views/wms/utils/format.ts +++ b/src/views/wms/utils/format.ts @@ -4,6 +4,10 @@ import { isNullOrUnDef } from '@/utils/is' +type DecimalValue = number | string | null | undefined + +/** 数量小数位 */ +export const QUANTITY_PRECISION = 2 /** 金额小数位 */ export const PRICE_PRECISION = 2 /** 重量小数位 */ @@ -11,39 +15,72 @@ export const WEIGHT_PRECISION = 3 /** 长宽高小数位 */ export const DIMENSION_PRECISION = 1 -export const formatNumber = ( - value?: number | string | null, - digit: number = PRICE_PRECISION -) => { +const toFiniteDecimal = (value: DecimalValue) => { if (isNullOrUnDef(value)) { - return '' + return undefined } if (typeof value === 'string' && value.trim() === '') { - return '' + return undefined } - const numberValue = typeof value === 'string' ? Number(value) : value - if (!Number.isFinite(numberValue)) { - return '' + const decimalValue = typeof value === 'string' ? Number(value) : value + if (!Number.isFinite(decimalValue)) { + return undefined } - return numberValue.toFixed(digit) + return decimalValue } -/** 格式化金额,保留 2 位小数 */ +const sumDecimal = (list: T[], getter: (item: T) => DecimalValue) => { + return list.reduce((sum, item) => { + const decimalValue = toFiniteDecimal(getter(item)) + return decimalValue === undefined ? sum : sum + decimalValue + }, 0) +} + +/** 格式化数量 */ +export const formatQuantity = (value?: number | string | null) => { + const decimalValue = toFiniteDecimal(value) + return decimalValue === undefined ? '' : decimalValue.toFixed(QUANTITY_PRECISION) +} + +/** 格式化金额 */ export const formatPrice = (value?: number | string | null) => { - return formatNumber(value, PRICE_PRECISION) + const decimalValue = toFiniteDecimal(value) + return decimalValue === undefined ? '' : decimalValue.toFixed(PRICE_PRECISION) } -/** 格式化重量,保留 3 位小数 */ +/** 汇总数量 */ +export const sumQuantity = (list: T[], getter: (item: T) => DecimalValue) => { + return sumDecimal(list, getter) +} + +/** 汇总金额 */ +export const sumPrice = (list: T[], getter: (item: T) => DecimalValue) => { + return sumDecimal(list, getter) +} + +/** 格式化汇总数量 */ +export const formatSumQuantity = (list: T[], getter: (item: T) => DecimalValue) => { + return formatQuantity(sumQuantity(list, getter)) +} + +/** 格式化汇总金额 */ +export const formatSumPrice = (list: T[], getter: (item: T) => DecimalValue) => { + return formatPrice(sumPrice(list, getter)) +} + +/** 格式化重量 */ export const formatWeight = (value?: number | string | null) => { - return formatNumber(value, WEIGHT_PRECISION) + const decimalValue = toFiniteDecimal(value) + return decimalValue === undefined ? '' : decimalValue.toFixed(WEIGHT_PRECISION) } -/** 格式化长宽高,保留 1 位小数 */ +/** 格式化长宽高 */ export const formatDimension = (value?: number | string | null) => { - return formatNumber(value, DIMENSION_PRECISION) + const decimalValue = toFiniteDecimal(value) + return decimalValue === undefined ? '' : decimalValue.toFixed(DIMENSION_PRECISION) } -/** 格式化长宽高组合,保留 1 位小数 */ +/** 格式化长宽高组合 */ export const formatDimensionText = ( length?: number | string | null, width?: number | string | null, From 3ef4e8424fe1958b6a49437223320f413e4015f6 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 12 May 2026 23:30:06 +0800 Subject: [PATCH 13/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=85=A5=E5=BA=93=E5=88=97=E8=A1=A8=E7=9A=84?= =?UTF-8?q?=E8=AF=84=E5=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wms/order/receipt/ReceiptOrderDetail.vue | 173 +++++ .../wms/order/receipt/ReceiptOrderPrint.vue | 133 ++++ src/views/wms/order/receipt/index.vue | 613 ++++++++++++++++++ 3 files changed, 919 insertions(+) create mode 100644 src/views/wms/order/receipt/ReceiptOrderDetail.vue create mode 100644 src/views/wms/order/receipt/ReceiptOrderPrint.vue create mode 100644 src/views/wms/order/receipt/index.vue diff --git a/src/views/wms/order/receipt/ReceiptOrderDetail.vue b/src/views/wms/order/receipt/ReceiptOrderDetail.vue new file mode 100644 index 000000000..fee28e295 --- /dev/null +++ b/src/views/wms/order/receipt/ReceiptOrderDetail.vue @@ -0,0 +1,173 @@ + + + + diff --git a/src/views/wms/order/receipt/ReceiptOrderPrint.vue b/src/views/wms/order/receipt/ReceiptOrderPrint.vue new file mode 100644 index 000000000..6a2062d21 --- /dev/null +++ b/src/views/wms/order/receipt/ReceiptOrderPrint.vue @@ -0,0 +1,133 @@ + + + + diff --git a/src/views/wms/order/receipt/index.vue b/src/views/wms/order/receipt/index.vue new file mode 100644 index 000000000..7a486c9a0 --- /dev/null +++ b/src/views/wms/order/receipt/index.vue @@ -0,0 +1,613 @@ + + + + + + From ac49ba5c6d2b5e41d06723046bc54f7b1ca1cde2 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Tue, 12 May 2026 23:34:45 +0800 Subject: [PATCH 14/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BE=9B=E5=BA=94=E5=95=86=20select=20?= =?UTF-8?q?=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/wms/md/merchant/index.ts | 6 +- .../md/merchant/components/MerchantSelect.vue | 94 +++++++++++++++++++ 2 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 src/views/wms/md/merchant/components/MerchantSelect.vue diff --git a/src/api/wms/md/merchant/index.ts b/src/api/wms/md/merchant/index.ts index 7a552a29a..94527ce18 100644 --- a/src/api/wms/md/merchant/index.ts +++ b/src/api/wms/md/merchant/index.ts @@ -18,6 +18,10 @@ export interface MerchantVO { createTime?: Date } +export interface MerchantSimpleListReqVO { + types?: number[] +} + // WMS 往来企业 API export const MerchantApi = { // 查询往来企业分页 @@ -26,7 +30,7 @@ export const MerchantApi = { }, // 查询往来企业精简列表 - getMerchantSimpleList: async (params?: any) => { + getMerchantSimpleList: async (params?: MerchantSimpleListReqVO) => { return await request.get({ url: '/wms/merchant/simple-list', params }) }, diff --git a/src/views/wms/md/merchant/components/MerchantSelect.vue b/src/views/wms/md/merchant/components/MerchantSelect.vue new file mode 100644 index 000000000..5f2b3f6e9 --- /dev/null +++ b/src/views/wms/md/merchant/components/MerchantSelect.vue @@ -0,0 +1,94 @@ + + + + From 765c8ea94f7a63b5d1d5788fe3febb434a1f287e Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 13 May 2026 00:42:29 +0800 Subject: [PATCH 15/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=AA=E8=83=BD=E5=88=A0=E9=99=A4=E4=BD=9C?= =?UTF-8?q?=E5=BA=9F=E7=9A=84=E5=85=A5=E5=BA=93=E5=8D=95=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/formatTime.ts | 21 +- .../md/item/sku/components/ItemSkuSelect.vue | 295 +++++++++++ .../wms/order/receipt/ReceiptOrderDetail.vue | 15 +- .../wms/order/receipt/ReceiptOrderForm.vue | 480 ++++++++++++++++++ .../wms/order/receipt/ReceiptOrderPrint.vue | 13 +- src/views/wms/order/receipt/index.vue | 21 +- src/views/wms/utils/order.ts | 12 + 7 files changed, 826 insertions(+), 31 deletions(-) create mode 100644 src/views/wms/md/item/sku/components/ItemSkuSelect.vue create mode 100644 src/views/wms/order/receipt/ReceiptOrderForm.vue create mode 100644 src/views/wms/utils/order.ts diff --git a/src/utils/formatTime.ts b/src/utils/formatTime.ts index 99eb428c3..570464823 100644 --- a/src/utils/formatTime.ts +++ b/src/utils/formatTime.ts @@ -63,7 +63,7 @@ export const defaultShortcuts = [ * @description format 季度 + 星期 + 几周:"YYYY-MM-DD HH:mm:ss WWW QQQQ ZZZ" * @returns 返回拼接后的时间字符串 */ -export function formatDate(date: Date, format?: string): string { +export function formatDate(date: Date | string, format?: string): string { // 日期不存在,则返回空 if (!date) { return '' @@ -72,6 +72,25 @@ export function formatDate(date: Date, format?: string): string { return date ? dayjs(date).format(format ?? 'YYYY-MM-DD HH:mm:ss') : '' } +/** + * 格式化可为空的时间日期 + * + * @param date 当前时间,new Date() 格式或者字符串时间格式 + * @param format 需要转换的时间格式字符串 + * @param emptyText 空值展示文案 + * @returns 返回格式化后的时间字符串 + */ +export function formatNullableDate( + date?: Date | string | null, + format = 'YYYY-MM-DD HH:mm:ss', + emptyText = '-' +): string { + if (!date) { + return emptyText + } + return formatDate(date, format) || emptyText +} + /** * 获取当前的日期+时间 */ diff --git a/src/views/wms/md/item/sku/components/ItemSkuSelect.vue b/src/views/wms/md/item/sku/components/ItemSkuSelect.vue new file mode 100644 index 000000000..ba9970aa0 --- /dev/null +++ b/src/views/wms/md/item/sku/components/ItemSkuSelect.vue @@ -0,0 +1,295 @@ + + + + diff --git a/src/views/wms/order/receipt/ReceiptOrderDetail.vue b/src/views/wms/order/receipt/ReceiptOrderDetail.vue index fee28e295..12e1c3076 100644 --- a/src/views/wms/order/receipt/ReceiptOrderDetail.vue +++ b/src/views/wms/order/receipt/ReceiptOrderDetail.vue @@ -40,13 +40,13 @@ {{ formatPrice(detailData.totalAmount) || '-' }} - {{ formatNullableDate(detailData.createTime) || '-' }} + {{ formatNullableDate(detailData.createTime) }} {{ detailData.creatorName || detailData.creator || '-' }} - {{ formatNullableDate(detailData.updateTime) || '-' }} + {{ formatNullableDate(detailData.updateTime) }} {{ detailData.updaterName || detailData.updater || '-' }} @@ -78,12 +78,12 @@ @@ -108,7 +108,7 @@ diff --git a/src/views/wms/order/receipt/ReceiptOrderPrint.vue b/src/views/wms/order/receipt/ReceiptOrderPrint.vue index 6a2062d21..da0b23715 100644 --- a/src/views/wms/order/receipt/ReceiptOrderPrint.vue +++ b/src/views/wms/order/receipt/ReceiptOrderPrint.vue @@ -16,7 +16,7 @@
库区:{{ printData.areaName || '-' }}
总数量:{{ formatQuantity(printData.totalQuantity) || '-' }}
总金额:{{ formatPrice(printData.totalAmount) || '-' }}
-
创建时间:{{ formatNullableDate(printData.createTime) || '-' }}
+
创建时间:{{ formatNullableDate(printData.createTime) }}
备注:{{ printData.remark || '-' }}
@@ -70,10 +70,10 @@ {{ detail.batchNo || '-' }} + - + + - + + + + + + + + - + + - + + + + + + +
- {{ formatNullableDate(detail.productionDate, 'YYYY-MM-DD') || '-' }} + {{ formatNullableDate(detail.productionDate, 'YYYY-MM-DD') }} - {{ formatNullableDate(detail.expirationDate, 'YYYY-MM-DD') || '-' }} + {{ formatNullableDate(detail.expirationDate, 'YYYY-MM-DD') }} {{ formatQuantity(detail.quantity) || '-' }} @@ -98,7 +98,7 @@ diff --git a/src/views/wms/order/shipment/ShipmentOrderForm.vue b/src/views/wms/order/shipment/ShipmentOrderForm.vue new file mode 100644 index 000000000..90a3319d1 --- /dev/null +++ b/src/views/wms/order/shipment/ShipmentOrderForm.vue @@ -0,0 +1,524 @@ + + + + diff --git a/src/views/wms/order/shipment/ShipmentOrderPrint.vue b/src/views/wms/order/shipment/ShipmentOrderPrint.vue new file mode 100644 index 000000000..ce3e39052 --- /dev/null +++ b/src/views/wms/order/shipment/ShipmentOrderPrint.vue @@ -0,0 +1,128 @@ + + + + diff --git a/src/views/wms/order/shipment/index.vue b/src/views/wms/order/shipment/index.vue new file mode 100644 index 000000000..289405f22 --- /dev/null +++ b/src/views/wms/order/shipment/index.vue @@ -0,0 +1,649 @@ + + + + + + diff --git a/src/views/wms/utils/constants.ts b/src/views/wms/utils/constants.ts index ff922ce07..3a2baf0c7 100644 --- a/src/views/wms/utils/constants.ts +++ b/src/views/wms/utils/constants.ts @@ -5,6 +5,12 @@ export const OrderStatusEnum = { CANCELED: 5 // 已作废 } as const +/** 可修改的单据状态 */ +export const OrderUpdateStatusList: number[] = [OrderStatusEnum.PREPARE] + +/** 可删除的单据状态 */ +export const OrderDeleteStatusList: number[] = [OrderStatusEnum.PREPARE, OrderStatusEnum.CANCELED] + /** 往来企业类型枚举 */ export const MerchantTypeEnum = { CUSTOMER: 1, // 客户 @@ -17,3 +23,9 @@ export const SupplierMerchantTypeList = [ MerchantTypeEnum.SUPPLIER, MerchantTypeEnum.CUSTOMER_SUPPLIER ] + +/** 客户类型的往来企业 */ +export const CustomerMerchantTypeList = [ + MerchantTypeEnum.CUSTOMER, + MerchantTypeEnum.CUSTOMER_SUPPLIER +] From 70aff05ef5b041118007877bc4fbf5b2a20093eb Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 13 May 2026 09:47:45 +0800 Subject: [PATCH 17/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=A7=BB=E5=BA=93=E3=80=81=E7=9B=98=E5=BA=93?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/wms/order/check/detail/index.ts | 29 ++ src/api/wms/order/check/index.ts | 73 +++ src/api/wms/order/movement/detail/index.ts | 29 ++ src/api/wms/order/movement/index.ts | 77 +++ .../wms/order/check/CheckOrderDetail.vue | 107 +++++ src/views/wms/order/check/CheckOrderForm.vue | 388 ++++++++++++++++ src/views/wms/order/check/index.vue | 284 +++++++++++ .../order/movement/MovementOrderDetail.vue | 112 +++++ .../wms/order/movement/MovementOrderForm.vue | 439 ++++++++++++++++++ src/views/wms/order/movement/index.vue | 287 ++++++++++++ 10 files changed, 1825 insertions(+) create mode 100644 src/api/wms/order/check/detail/index.ts create mode 100644 src/api/wms/order/check/index.ts create mode 100644 src/api/wms/order/movement/detail/index.ts create mode 100644 src/api/wms/order/movement/index.ts create mode 100644 src/views/wms/order/check/CheckOrderDetail.vue create mode 100644 src/views/wms/order/check/CheckOrderForm.vue create mode 100644 src/views/wms/order/check/index.vue create mode 100644 src/views/wms/order/movement/MovementOrderDetail.vue create mode 100644 src/views/wms/order/movement/MovementOrderForm.vue create mode 100644 src/views/wms/order/movement/index.vue diff --git a/src/api/wms/order/check/detail/index.ts b/src/api/wms/order/check/detail/index.ts new file mode 100644 index 000000000..cc6cc3f5e --- /dev/null +++ b/src/api/wms/order/check/detail/index.ts @@ -0,0 +1,29 @@ +// WMS 盘库单明细 VO +export interface CheckOrderDetailVO { + id?: number + orderId?: number + itemId?: number + itemCode?: string + itemName?: string + unit?: string + skuId?: number + skuCode?: string + skuName?: string + inventoryId?: number + inventoryDetailId?: number + warehouseId?: number + warehouseName?: string + areaId?: number + areaName?: string + batchNo?: string + productionDate?: Date + expirationDate?: Date + receiptTime?: Date + quantity?: number + checkQuantity?: number + differenceQuantity?: number + availableQuantity?: number + amount?: number + remark?: string + createTime?: Date +} diff --git a/src/api/wms/order/check/index.ts b/src/api/wms/order/check/index.ts new file mode 100644 index 000000000..be3c3dbbd --- /dev/null +++ b/src/api/wms/order/check/index.ts @@ -0,0 +1,73 @@ +import request from '@/config/axios' +import { CheckOrderDetailVO } from './detail' + +// WMS 盘库单 VO +export interface CheckOrderVO { + id?: number + no?: string + status?: number + remark?: string + warehouseId?: number + warehouseName?: string + areaId?: number + areaName?: string + totalQuantity?: number + totalAmount?: number + details?: CheckOrderDetailVO[] + createTime?: Date + creator?: string + creatorName?: string + updateTime?: Date + updater?: string + updaterName?: string +} + +// WMS 盘库单 API +export const CheckOrderApi = { + // 查询盘库单分页 + getCheckOrderPage: async (params: any) => { + return await request.get({ url: '/wms/check-order/page', params }) + }, + + // 查询盘库单详情 + getCheckOrder: async (id: number) => { + return await request.get({ url: '/wms/check-order/get?id=' + id }) + }, + + // 查询盘库单明细 + getCheckOrderDetailListByOrderId: async (orderId: number) => { + return await request.get({ + url: '/wms/check-order-detail/list-by-order-id?orderId=' + orderId + }) + }, + + // 新增盘库单 + createCheckOrder: async (data: CheckOrderVO) => { + return await request.post({ url: '/wms/check-order/create', data }) + }, + + // 修改盘库单 + updateCheckOrder: async (data: CheckOrderVO) => { + return await request.put({ url: '/wms/check-order/update', data }) + }, + + // 完成盘库 + completeCheckOrder: async (id: number) => { + return await request.put({ url: '/wms/check-order/complete?id=' + id }) + }, + + // 作废盘库单 + cancelCheckOrder: async (id: number) => { + return await request.put({ url: '/wms/check-order/cancel?id=' + id }) + }, + + // 删除盘库单 + deleteCheckOrder: async (id: number) => { + return await request.delete({ url: '/wms/check-order/delete?id=' + id }) + }, + + // 导出盘库单 + exportCheckOrder: async (params: any) => { + return await request.download({ url: '/wms/check-order/export-excel', params }) + } +} diff --git a/src/api/wms/order/movement/detail/index.ts b/src/api/wms/order/movement/detail/index.ts new file mode 100644 index 000000000..4c10f3d2d --- /dev/null +++ b/src/api/wms/order/movement/detail/index.ts @@ -0,0 +1,29 @@ +// WMS 移库单明细 VO +export interface MovementOrderDetailVO { + id?: number + orderId?: number + itemId?: number + itemCode?: string + itemName?: string + unit?: string + skuId?: number + skuCode?: string + skuName?: string + inventoryDetailId?: number + sourceWarehouseId?: number + sourceWarehouseName?: string + sourceAreaId?: number + sourceAreaName?: string + targetWarehouseId?: number + targetWarehouseName?: string + targetAreaId?: number + targetAreaName?: string + batchNo?: string + productionDate?: Date + expirationDate?: Date + quantity?: number + availableQuantity?: number + amount?: number + remark?: string + createTime?: Date +} diff --git a/src/api/wms/order/movement/index.ts b/src/api/wms/order/movement/index.ts new file mode 100644 index 000000000..b5fcf41a9 --- /dev/null +++ b/src/api/wms/order/movement/index.ts @@ -0,0 +1,77 @@ +import request from '@/config/axios' +import { MovementOrderDetailVO } from './detail' + +// WMS 移库单 VO +export interface MovementOrderVO { + id?: number + no?: string + status?: number + remark?: string + sourceWarehouseId?: number + sourceWarehouseName?: string + sourceAreaId?: number + sourceAreaName?: string + targetWarehouseId?: number + targetWarehouseName?: string + targetAreaId?: number + targetAreaName?: string + totalQuantity?: number + totalAmount?: number + details?: MovementOrderDetailVO[] + createTime?: Date + creator?: string + creatorName?: string + updateTime?: Date + updater?: string + updaterName?: string +} + +// WMS 移库单 API +export const MovementOrderApi = { + // 查询移库单分页 + getMovementOrderPage: async (params: any) => { + return await request.get({ url: '/wms/movement-order/page', params }) + }, + + // 查询移库单详情 + getMovementOrder: async (id: number) => { + return await request.get({ url: '/wms/movement-order/get?id=' + id }) + }, + + // 查询移库单明细 + getMovementOrderDetailListByOrderId: async (orderId: number) => { + return await request.get({ + url: '/wms/movement-order-detail/list-by-order-id?orderId=' + orderId + }) + }, + + // 新增移库单 + createMovementOrder: async (data: MovementOrderVO) => { + return await request.post({ url: '/wms/movement-order/create', data }) + }, + + // 修改移库单 + updateMovementOrder: async (data: MovementOrderVO) => { + return await request.put({ url: '/wms/movement-order/update', data }) + }, + + // 完成移库 + completeMovementOrder: async (id: number) => { + return await request.put({ url: '/wms/movement-order/complete?id=' + id }) + }, + + // 作废移库单 + cancelMovementOrder: async (id: number) => { + return await request.put({ url: '/wms/movement-order/cancel?id=' + id }) + }, + + // 删除移库单 + deleteMovementOrder: async (id: number) => { + return await request.delete({ url: '/wms/movement-order/delete?id=' + id }) + }, + + // 导出移库单 + exportMovementOrder: async (params: any) => { + return await request.download({ url: '/wms/movement-order/export-excel', params }) + } +} diff --git a/src/views/wms/order/check/CheckOrderDetail.vue b/src/views/wms/order/check/CheckOrderDetail.vue new file mode 100644 index 000000000..537d3b1c9 --- /dev/null +++ b/src/views/wms/order/check/CheckOrderDetail.vue @@ -0,0 +1,107 @@ + + + + diff --git a/src/views/wms/order/check/CheckOrderForm.vue b/src/views/wms/order/check/CheckOrderForm.vue new file mode 100644 index 000000000..cddadf2a3 --- /dev/null +++ b/src/views/wms/order/check/CheckOrderForm.vue @@ -0,0 +1,388 @@ + + + + diff --git a/src/views/wms/order/check/index.vue b/src/views/wms/order/check/index.vue new file mode 100644 index 000000000..001571b4c --- /dev/null +++ b/src/views/wms/order/check/index.vue @@ -0,0 +1,284 @@ + + + + diff --git a/src/views/wms/order/movement/MovementOrderDetail.vue b/src/views/wms/order/movement/MovementOrderDetail.vue new file mode 100644 index 000000000..7f6cc6b64 --- /dev/null +++ b/src/views/wms/order/movement/MovementOrderDetail.vue @@ -0,0 +1,112 @@ + + + + diff --git a/src/views/wms/order/movement/MovementOrderForm.vue b/src/views/wms/order/movement/MovementOrderForm.vue new file mode 100644 index 000000000..94d3194c6 --- /dev/null +++ b/src/views/wms/order/movement/MovementOrderForm.vue @@ -0,0 +1,439 @@ + + + + diff --git a/src/views/wms/order/movement/index.vue b/src/views/wms/order/movement/index.vue new file mode 100644 index 000000000..4469b2535 --- /dev/null +++ b/src/views/wms/order/movement/index.vue @@ -0,0 +1,287 @@ + + + + From c5948d405e95be0db6388db25cc617966013bba2 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 13 May 2026 18:42:51 +0800 Subject: [PATCH 18/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=87=8F=E6=B3=95=EF=BC=8C=E5=8E=BB=E6=8E=89=20detail=20?= =?UTF-8?q?=E8=A1=A8=EF=BC=8C=E5=92=8C=20mes=20=E6=9B=B4=E5=AF=B9=E9=BD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/wms/inventory/detail/index.ts | 36 -- src/api/wms/order/check/detail/index.ts | 1 - src/api/wms/order/movement/detail/index.ts | 1 - src/api/wms/order/shipment/detail/index.ts | 1 - src/views/wms/inventory/detail/index.vue | 400 ------------------ src/views/wms/inventory/history/index.vue | 16 +- .../wms/order/check/CheckOrderDetail.vue | 4 +- src/views/wms/order/check/CheckOrderForm.vue | 6 +- src/views/wms/order/check/index.vue | 161 ++++++- .../order/movement/MovementOrderDetail.vue | 4 +- .../wms/order/movement/MovementOrderForm.vue | 6 +- src/views/wms/order/movement/index.vue | 176 +++++++- .../wms/order/receipt/ReceiptOrderDetail.vue | 8 +- .../wms/order/receipt/ReceiptOrderForm.vue | 8 +- .../wms/order/receipt/ReceiptOrderPrint.vue | 13 +- src/views/wms/order/receipt/index.vue | 12 +- .../order/shipment/ShipmentOrderDetail.vue | 8 +- .../wms/order/shipment/ShipmentOrderForm.vue | 12 +- .../wms/order/shipment/ShipmentOrderPrint.vue | 13 +- src/views/wms/order/shipment/index.vue | 12 +- src/views/wms/utils/config.ts | 7 - 21 files changed, 360 insertions(+), 545 deletions(-) delete mode 100644 src/api/wms/inventory/detail/index.ts delete mode 100644 src/views/wms/inventory/detail/index.vue diff --git a/src/api/wms/inventory/detail/index.ts b/src/api/wms/inventory/detail/index.ts deleted file mode 100644 index d34dc613a..000000000 --- a/src/api/wms/inventory/detail/index.ts +++ /dev/null @@ -1,36 +0,0 @@ -import request from '@/config/axios' - -// WMS 库存明细 VO -export interface InventoryDetailVO { - id?: number - itemId?: number - itemCode?: string - itemName?: string - unit?: string - skuId?: number - skuCode?: string - skuName?: string - warehouseId?: number - warehouseName?: string - areaId?: number - areaName?: string - quantity?: number - remainQuantity?: number - batchNo?: string - productionDate?: Date - expirationDate?: Date - amount?: number - remark?: string - orderId?: number - orderNo?: string - orderType?: number - createTime?: Date -} - -// WMS 库存明细 API -export const InventoryDetailApi = { - // 查询库存明细分页 - getInventoryDetailPage: async (params: any) => { - return await request.get({ url: '/wms/inventory-detail/page', params }) - } -} diff --git a/src/api/wms/order/check/detail/index.ts b/src/api/wms/order/check/detail/index.ts index cc6cc3f5e..9c1f679ff 100644 --- a/src/api/wms/order/check/detail/index.ts +++ b/src/api/wms/order/check/detail/index.ts @@ -10,7 +10,6 @@ export interface CheckOrderDetailVO { skuCode?: string skuName?: string inventoryId?: number - inventoryDetailId?: number warehouseId?: number warehouseName?: string areaId?: number diff --git a/src/api/wms/order/movement/detail/index.ts b/src/api/wms/order/movement/detail/index.ts index 4c10f3d2d..b38be4f34 100644 --- a/src/api/wms/order/movement/detail/index.ts +++ b/src/api/wms/order/movement/detail/index.ts @@ -9,7 +9,6 @@ export interface MovementOrderDetailVO { skuId?: number skuCode?: string skuName?: string - inventoryDetailId?: number sourceWarehouseId?: number sourceWarehouseName?: string sourceAreaId?: number diff --git a/src/api/wms/order/shipment/detail/index.ts b/src/api/wms/order/shipment/detail/index.ts index 52017fef4..1ceaf25e4 100644 --- a/src/api/wms/order/shipment/detail/index.ts +++ b/src/api/wms/order/shipment/detail/index.ts @@ -9,7 +9,6 @@ export interface ShipmentOrderDetailVO { skuId?: number skuCode?: string skuName?: string - inventoryDetailId?: number warehouseId?: number warehouseName?: string areaId?: number diff --git a/src/views/wms/inventory/detail/index.vue b/src/views/wms/inventory/detail/index.vue deleted file mode 100644 index 5df1470a7..000000000 --- a/src/views/wms/inventory/detail/index.vue +++ /dev/null @@ -1,400 +0,0 @@ - - - - - - diff --git a/src/views/wms/inventory/history/index.vue b/src/views/wms/inventory/history/index.vue index 8cd5fcbbc..fdf017bab 100644 --- a/src/views/wms/inventory/history/index.vue +++ b/src/views/wms/inventory/history/index.vue @@ -151,12 +151,12 @@ - + - + @@ -173,14 +173,8 @@ - - + + - + @@ -73,7 +73,7 @@ import { formatNullableDate } from '@/utils/formatTime' import { DICT_TYPE } from '@/utils/dict' import { CheckOrderApi, CheckOrderVO } from '@/api/wms/order/check' import { CheckOrderDetailVO } from '@/api/wms/order/check/detail' -import { AREA_ENABLE, BATCH_ENABLE } from '@/views/wms/utils/config' +import { AREA_ENABLE } from '@/views/wms/utils/config' import { formatPrice, formatQuantity, formatSumPrice, formatSumQuantity } from '@/views/wms/utils/format' /** WMS 盘库单详情 */ diff --git a/src/views/wms/order/check/CheckOrderForm.vue b/src/views/wms/order/check/CheckOrderForm.vue index cddadf2a3..98630b782 100644 --- a/src/views/wms/order/check/CheckOrderForm.vue +++ b/src/views/wms/order/check/CheckOrderForm.vue @@ -66,7 +66,7 @@
规格编号:{{ row.skuCode }}
- + @@ -154,7 +154,7 @@ import { CheckOrderDetailVO } from '@/api/wms/order/check/detail' import InventorySelect, { InventorySelectRow } from '@/views/wms/inventory/components/InventorySelect.vue' import WarehouseAreaSelect from '@/views/wms/md/warehouse/components/WarehouseAreaSelect.vue' import WarehouseSelect from '@/views/wms/md/warehouse/components/WarehouseSelect.vue' -import { AREA_ENABLE, BATCH_ENABLE } from '@/views/wms/utils/config' +import { AREA_ENABLE } from '@/views/wms/utils/config' import { OrderStatusEnum, OrderUpdateStatusList } from '@/views/wms/utils/constants' import { formatQuantity, PRICE_PRECISION, QUANTITY_PRECISION, sumPrice } from '@/views/wms/utils/format' import { generateOrderNo } from '@/views/wms/utils/order' @@ -235,7 +235,6 @@ const buildDetail = (inventory: InventorySelectRow): CheckOrderDetailVO => ({ skuCode: inventory.skuCode, skuName: inventory.skuName, inventoryId: inventory.id, - inventoryDetailId: inventory.inventoryDetailId, warehouseId: inventory.warehouseId, warehouseName: inventory.warehouseName, areaId: inventory.areaId, @@ -262,7 +261,6 @@ const handleSelectInventory = (inventories: InventorySelectRow[]) => { } const isInventorySelected = (inventory: InventorySelectRow) => (formData.value.details || []).some((detail) => { - if (BATCH_ENABLE) return detail.inventoryDetailId === inventory.inventoryDetailId return detail.inventoryId === inventory.id }) const handleDeleteDetail = (index: number) => { diff --git a/src/views/wms/order/check/index.vue b/src/views/wms/order/check/index.vue index 001571b4c..ac4742892 100644 --- a/src/views/wms/order/check/index.vue +++ b/src/views/wms/order/check/index.vue @@ -32,12 +32,74 @@ value-format="YYYY-MM-DD HH:mm:ss" /> + +
+ + + +
+
+ +
+ + + +
+
+ + + + + + @@ -47,6 +109,22 @@ 重置 + + + + + {{ column.label }} + + + 新增 @@ -68,6 +146,7 @@ 规格编号:{{ detail.skuCode }}
- + @@ -101,18 +180,28 @@ - + - + - + - + @@ -170,7 +170,7 @@ import { MovementOrderDetailVO } from '@/api/wms/order/movement/detail' import InventorySelect, { InventorySelectRow } from '@/views/wms/inventory/components/InventorySelect.vue' import WarehouseAreaSelect from '@/views/wms/md/warehouse/components/WarehouseAreaSelect.vue' import WarehouseSelect from '@/views/wms/md/warehouse/components/WarehouseSelect.vue' -import { AREA_ENABLE, BATCH_ENABLE } from '@/views/wms/utils/config' +import { AREA_ENABLE } from '@/views/wms/utils/config' import { OrderStatusEnum, OrderUpdateStatusList } from '@/views/wms/utils/constants' import { formatQuantity, PRICE_PRECISION, QUANTITY_PRECISION, sumPrice, sumQuantity } from '@/views/wms/utils/format' import { generateOrderNo } from '@/views/wms/utils/order' @@ -250,7 +250,6 @@ const buildDetail = (inventory: InventorySelectRow): MovementOrderDetailVO => ({ skuId: inventory.skuId, skuCode: inventory.skuCode, skuName: inventory.skuName, - inventoryDetailId: inventory.inventoryDetailId, sourceWarehouseId: inventory.warehouseId, sourceWarehouseName: inventory.warehouseName, sourceAreaId: inventory.areaId, @@ -282,7 +281,6 @@ const handleSelectInventory = (inventories: InventorySelectRow[]) => { /** 判断库存是否已选择 */ const isInventorySelected = (inventory: InventorySelectRow) => (formData.value.details || []).some((detail) => { - if (BATCH_ENABLE) return detail.inventoryDetailId === inventory.inventoryDetailId return ( detail.skuId === inventory.skuId && detail.sourceWarehouseId === inventory.warehouseId && diff --git a/src/views/wms/order/movement/index.vue b/src/views/wms/order/movement/index.vue index 4469b2535..3c27f4c87 100644 --- a/src/views/wms/order/movement/index.vue +++ b/src/views/wms/order/movement/index.vue @@ -32,12 +32,76 @@ value-format="YYYY-MM-DD HH:mm:ss" /> + +
+ + + +
+
+ +
+ + + +
+
+ + + + + + @@ -47,6 +111,22 @@ 重置 + + + + + {{ column.label }} + + + 新增 @@ -68,6 +148,7 @@ 规格编号:{{ detail.skuCode }}
- + @@ -99,18 +180,28 @@ - + - + - + - - - - - - - - - - - - - - diff --git a/src/views/wms/order/check/CheckOrderDetail.vue b/src/views/wms/order/check/CheckOrderDetail.vue index 3c43a89ab..751a446ab 100644 --- a/src/views/wms/order/check/CheckOrderDetail.vue +++ b/src/views/wms/order/check/CheckOrderDetail.vue @@ -49,7 +49,6 @@
规格编号:{{ row.skuCode }}
- diff --git a/src/views/wms/order/check/CheckOrderForm.vue b/src/views/wms/order/check/CheckOrderForm.vue index 37eb5f2fc..3889cc2d7 100644 --- a/src/views/wms/order/check/CheckOrderForm.vue +++ b/src/views/wms/order/check/CheckOrderForm.vue @@ -61,7 +61,6 @@
规格编号:{{ row.skuCode }}
- @@ -228,9 +227,6 @@ const buildDetail = (inventory: InventorySelectRow): CheckOrderDetailVO => ({ inventoryId: inventory.id, warehouseId: inventory.warehouseId, warehouseName: inventory.warehouseName, - batchNo: inventory.batchNo, - productionDate: inventory.productionDate, - expirationDate: inventory.expirationDate, quantity: inventory.availableQuantity, checkQuantity: inventory.availableQuantity, availableQuantity: inventory.availableQuantity, diff --git a/src/views/wms/order/check/index.vue b/src/views/wms/order/check/index.vue index 3807926c6..383eb8a7c 100644 --- a/src/views/wms/order/check/index.vue +++ b/src/views/wms/order/check/index.vue @@ -164,7 +164,6 @@
规格编号:{{ detail.skuCode }}
- diff --git a/src/views/wms/order/movement/MovementOrderDetail.vue b/src/views/wms/order/movement/MovementOrderDetail.vue index e0be44deb..6adcc1e5b 100644 --- a/src/views/wms/order/movement/MovementOrderDetail.vue +++ b/src/views/wms/order/movement/MovementOrderDetail.vue @@ -56,7 +56,6 @@
规格编号:{{ row.skuCode }}
- diff --git a/src/views/wms/order/movement/MovementOrderForm.vue b/src/views/wms/order/movement/MovementOrderForm.vue index e06757ee1..09e8fc5ca 100644 --- a/src/views/wms/order/movement/MovementOrderForm.vue +++ b/src/views/wms/order/movement/MovementOrderForm.vue @@ -66,7 +66,6 @@
规格编号:{{ row.skuCode }}
- @@ -229,9 +228,6 @@ const buildDetail = (inventory: InventorySelectRow): MovementOrderDetailVO => ({ sourceWarehouseId: inventory.warehouseId, sourceWarehouseName: inventory.warehouseName, targetWarehouseId: formData.value.targetWarehouseId, - batchNo: inventory.batchNo, - productionDate: inventory.productionDate, - expirationDate: inventory.expirationDate, quantity: undefined, availableQuantity: inventory.availableQuantity, amount: undefined, diff --git a/src/views/wms/order/movement/index.vue b/src/views/wms/order/movement/index.vue index 2a6c7fa8c..7a6cae489 100644 --- a/src/views/wms/order/movement/index.vue +++ b/src/views/wms/order/movement/index.vue @@ -169,7 +169,6 @@
规格编号:{{ detail.skuCode }}
- diff --git a/src/views/wms/order/receipt/ReceiptOrderDetail.vue b/src/views/wms/order/receipt/ReceiptOrderDetail.vue index 5dda7c68b..d54b2c981 100644 --- a/src/views/wms/order/receipt/ReceiptOrderDetail.vue +++ b/src/views/wms/order/receipt/ReceiptOrderDetail.vue @@ -71,17 +71,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -329,7 +328,7 @@ const getDefaultQueryParams = () => ({ status: undefined as number | undefined, sourceWarehouseId: undefined as number | undefined, targetWarehouseId: undefined as number | undefined, - orderDate: undefined as string[] | undefined, + orderTime: undefined as string[] | undefined, totalQuantityMin: undefined as number | undefined, totalQuantityMax: undefined as number | undefined, totalAmountMin: undefined as number | undefined, diff --git a/src/views/wms/order/receipt/ReceiptOrderDetail.vue b/src/views/wms/order/receipt/ReceiptOrderDetail.vue index d54b2c981..9fa64c52e 100644 --- a/src/views/wms/order/receipt/ReceiptOrderDetail.vue +++ b/src/views/wms/order/receipt/ReceiptOrderDetail.vue @@ -5,14 +5,6 @@
单据信息
{{ detailData.no || '-' }} - - - - - {{ detailData.warehouseName || '-' }} + + {{ formatNullableDate(detailData.orderTime, 'YYYY-MM-DD') }} + + + + - + {{ detailData.merchantName || '-' }} diff --git a/src/views/wms/order/receipt/ReceiptOrderForm.vue b/src/views/wms/order/receipt/ReceiptOrderForm.vue index bd75af044..badecb0f9 100644 --- a/src/views/wms/order/receipt/ReceiptOrderForm.vue +++ b/src/views/wms/order/receipt/ReceiptOrderForm.vue @@ -26,6 +26,11 @@ + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + +
@@ -132,11 +143,6 @@ /> - - - - @@ -458,7 +457,7 @@ const getDefaultQueryParams = () => ({ status: undefined as number | undefined, warehouseId: undefined as number | undefined, merchantId: undefined as number | undefined, - orderDate: undefined as string[] | undefined, + orderTime: undefined as string[] | undefined, totalQuantityMin: undefined as number | undefined, totalQuantityMax: undefined as number | undefined, totalAmountMin: undefined as number | undefined, diff --git a/src/views/wms/order/shipment/ShipmentOrderDetail.vue b/src/views/wms/order/shipment/ShipmentOrderDetail.vue index 868dc0563..4d7e21297 100644 --- a/src/views/wms/order/shipment/ShipmentOrderDetail.vue +++ b/src/views/wms/order/shipment/ShipmentOrderDetail.vue @@ -5,14 +5,6 @@
单据信息
{{ detailData.no || '-' }} - - - - - {{ detailData.warehouseName || '-' }} + + {{ formatNullableDate(detailData.orderTime, 'YYYY-MM-DD') }} + + + + - + {{ detailData.merchantName || '-' }} diff --git a/src/views/wms/order/shipment/ShipmentOrderForm.vue b/src/views/wms/order/shipment/ShipmentOrderForm.vue index cf75f4db7..876f3276a 100644 --- a/src/views/wms/order/shipment/ShipmentOrderForm.vue +++ b/src/views/wms/order/shipment/ShipmentOrderForm.vue @@ -26,6 +26,11 @@ + + + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + +
@@ -137,11 +148,6 @@ /> - - - - @@ -458,7 +457,7 @@ const getDefaultQueryParams = () => ({ status: undefined as number | undefined, warehouseId: undefined as number | undefined, merchantId: undefined as number | undefined, - orderDate: undefined as string[] | undefined, + orderTime: undefined as string[] | undefined, totalQuantityMin: undefined as number | undefined, totalQuantityMax: undefined as number | undefined, totalAmountMin: undefined as number | undefined, From 44808eb3f438d9839e4676418d5be7682f74777b Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 14 May 2026 00:02:03 +0800 Subject: [PATCH 22/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E8=B0=83=E6=95=B4=20order=5Ftime=20=E6=94=BE=E5=88=B0=E3=80=90?= =?UTF-8?q?=E4=BB=93=E5=BA=93=E3=80=91=E5=90=8E=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wms/order/receipt/ReceiptOrderDetail.vue | 6 ++--- .../wms/order/receipt/ReceiptOrderForm.vue | 22 +++++++++---------- .../wms/order/receipt/ReceiptOrderPrint.vue | 2 +- .../order/shipment/ShipmentOrderDetail.vue | 6 ++--- .../wms/order/shipment/ShipmentOrderForm.vue | 22 +++++++++---------- .../wms/order/shipment/ShipmentOrderPrint.vue | 2 +- 6 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/views/wms/order/receipt/ReceiptOrderDetail.vue b/src/views/wms/order/receipt/ReceiptOrderDetail.vue index 9fa64c52e..a5e4e9ab1 100644 --- a/src/views/wms/order/receipt/ReceiptOrderDetail.vue +++ b/src/views/wms/order/receipt/ReceiptOrderDetail.vue @@ -16,9 +16,6 @@ {{ detailData.warehouseName || '-' }} - - {{ formatNullableDate(detailData.orderTime, 'YYYY-MM-DD') }} - - + + {{ formatNullableDate(detailData.orderTime, 'YYYY-MM-DD') }} + {{ detailData.merchantName || '-' }} diff --git a/src/views/wms/order/receipt/ReceiptOrderForm.vue b/src/views/wms/order/receipt/ReceiptOrderForm.vue index badecb0f9..7b8b4858d 100644 --- a/src/views/wms/order/receipt/ReceiptOrderForm.vue +++ b/src/views/wms/order/receipt/ReceiptOrderForm.vue @@ -31,6 +31,17 @@ + + + + + - - - - - diff --git a/src/views/wms/order/receipt/ReceiptOrderPrint.vue b/src/views/wms/order/receipt/ReceiptOrderPrint.vue index 5af41b541..74941d24b 100644 --- a/src/views/wms/order/receipt/ReceiptOrderPrint.vue +++ b/src/views/wms/order/receipt/ReceiptOrderPrint.vue @@ -10,8 +10,8 @@ 入库类型:{{ getDictLabel(DICT_TYPE.WMS_RECEIPT_ORDER_TYPE, printData.type) || '-' }}
仓库:{{ printData.warehouseName || '-' }}
-
单据日期:{{ formatNullableDate(printData.orderTime, 'YYYY-MM-DD') }}
入库状态:{{ getDictLabel(DICT_TYPE.WMS_ORDER_STATUS, printData.status) || '-' }}
+
单据日期:{{ formatNullableDate(printData.orderTime, 'YYYY-MM-DD') }}
供应商:{{ printData.merchantName || '-' }}
业务单号:{{ printData.bizOrderNo || '-' }}
总数量:{{ formatQuantity(printData.totalQuantity) || '-' }}
diff --git a/src/views/wms/order/shipment/ShipmentOrderDetail.vue b/src/views/wms/order/shipment/ShipmentOrderDetail.vue index 4d7e21297..96ff3f899 100644 --- a/src/views/wms/order/shipment/ShipmentOrderDetail.vue +++ b/src/views/wms/order/shipment/ShipmentOrderDetail.vue @@ -16,9 +16,6 @@ {{ detailData.warehouseName || '-' }} - - {{ formatNullableDate(detailData.orderTime, 'YYYY-MM-DD') }} - - + + {{ formatNullableDate(detailData.orderTime, 'YYYY-MM-DD') }} + {{ detailData.merchantName || '-' }} diff --git a/src/views/wms/order/shipment/ShipmentOrderForm.vue b/src/views/wms/order/shipment/ShipmentOrderForm.vue index 876f3276a..48cf029b5 100644 --- a/src/views/wms/order/shipment/ShipmentOrderForm.vue +++ b/src/views/wms/order/shipment/ShipmentOrderForm.vue @@ -31,6 +31,17 @@ + + + + + - - - - - diff --git a/src/views/wms/order/shipment/ShipmentOrderPrint.vue b/src/views/wms/order/shipment/ShipmentOrderPrint.vue index 9a3de8682..7e1145d90 100644 --- a/src/views/wms/order/shipment/ShipmentOrderPrint.vue +++ b/src/views/wms/order/shipment/ShipmentOrderPrint.vue @@ -10,8 +10,8 @@ 出库类型:{{ getDictLabel(DICT_TYPE.WMS_SHIPMENT_ORDER_TYPE, printData.type) || '-' }}
仓库:{{ printData.warehouseName || '-' }}
-
单据日期:{{ formatNullableDate(printData.orderTime, 'YYYY-MM-DD') }}
出库状态:{{ getDictLabel(DICT_TYPE.WMS_ORDER_STATUS, printData.status) || '-' }}
+
单据日期:{{ formatNullableDate(printData.orderTime, 'YYYY-MM-DD') }}
客户:{{ printData.merchantName || '-' }}
业务单号:{{ printData.bizOrderNo || '-' }}
总数量:{{ formatQuantity(printData.totalQuantity) || '-' }}
From 6f96d004a9b2a7f99018bc2705fcb214a61f4719 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 14 May 2026 08:39:04 +0800 Subject: [PATCH 23/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=85=A5=E5=BA=93=E7=AE=A1=E7=90=86=EF=BC=8C=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=90=88=E8=AE=A1=E9=87=91=E9=A2=9D=E3=80=81=E6=95=B0=E9=87=8F?= =?UTF-8?q?=E7=9A=84=E5=AD=97=E6=AE=B5=E4=B8=8E=E4=BA=A4=E4=BA=92=E3=80=82?= =?UTF-8?q?=EF=BC=88=E5=89=8D=E7=AB=AF=E8=B4=9F=E8=B4=A3=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=EF=BC=8C=E5=90=8E=E7=AB=AF=E8=B4=9F=E8=B4=A3=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/wms/inventory/history/index.ts | 2 +- src/api/wms/order/receipt/detail/index.ts | 3 +- src/api/wms/order/receipt/index.ts | 2 +- src/views/wms/inventory/history/index.vue | 8 +- .../wms/order/receipt/ReceiptOrderDetail.vue | 25 +-- .../wms/order/receipt/ReceiptOrderForm.vue | 151 ++++++++++++------ .../wms/order/receipt/ReceiptOrderPrint.vue | 43 ++++- src/views/wms/order/receipt/index.vue | 27 +++- 8 files changed, 178 insertions(+), 83 deletions(-) diff --git a/src/api/wms/inventory/history/index.ts b/src/api/wms/inventory/history/index.ts index 10a997d7b..76345ae99 100644 --- a/src/api/wms/inventory/history/index.ts +++ b/src/api/wms/inventory/history/index.ts @@ -15,7 +15,7 @@ export interface InventoryHistoryVO { quantity?: number beforeQuantity?: number afterQuantity?: number - amount?: number + price?: number remark?: string orderId?: number orderNo?: string diff --git a/src/api/wms/order/receipt/detail/index.ts b/src/api/wms/order/receipt/detail/index.ts index f957d52cf..582bc7977 100644 --- a/src/api/wms/order/receipt/detail/index.ts +++ b/src/api/wms/order/receipt/detail/index.ts @@ -12,6 +12,7 @@ export interface ReceiptOrderDetailVO { warehouseId?: number warehouseName?: string quantity?: number - amount?: number + price?: number + totalPrice?: number createTime?: Date } diff --git a/src/api/wms/order/receipt/index.ts b/src/api/wms/order/receipt/index.ts index 1c1b4a393..4965112ec 100644 --- a/src/api/wms/order/receipt/index.ts +++ b/src/api/wms/order/receipt/index.ts @@ -15,7 +15,7 @@ export interface ReceiptOrderVO { warehouseId?: number warehouseName?: string totalQuantity?: number - totalAmount?: number + totalPrice?: number details?: ReceiptOrderDetailVO[] createTime?: Date creator?: string diff --git a/src/views/wms/inventory/history/index.vue b/src/views/wms/inventory/history/index.vue index 2ee3a5e07..4d0aaf673 100644 --- a/src/views/wms/inventory/history/index.vue +++ b/src/views/wms/inventory/history/index.vue @@ -144,15 +144,15 @@ {{ formatQuantity(scope.row.afterQuantity) || '-' }}
- + diff --git a/src/views/wms/order/receipt/ReceiptOrderDetail.vue b/src/views/wms/order/receipt/ReceiptOrderDetail.vue index a5e4e9ab1..d625baa02 100644 --- a/src/views/wms/order/receipt/ReceiptOrderDetail.vue +++ b/src/views/wms/order/receipt/ReceiptOrderDetail.vue @@ -37,7 +37,7 @@ {{ formatQuantity(detailData.totalQuantity) || '-' }} - {{ formatPrice(detailData.totalAmount) || '-' }} + {{ formatPrice(detailData.totalPrice) || '-' }} {{ formatNullableDate(detailData.createTime) }} @@ -80,14 +80,14 @@ - + - + @@ -111,7 +111,7 @@ import { defineOptions({ name: 'WmsReceiptOrderDetail' }) interface DetailRow extends ReceiptOrderDetailVO { - unitPrice?: number + totalPrice?: number } const loading = ref(false) // 加载中 @@ -120,9 +120,9 @@ const detailData = ref({}) // 详情数据 const detailRows = computed(() => (detailData.value.details || []).map((detail) => ({ ...detail, - unitPrice: - detail.amount != null && detail.quantity - ? Number(detail.amount) / Number(detail.quantity) + totalPrice: + detail.price != null && detail.quantity + ? Number(detail.price) * Number(detail.quantity) : undefined })) ) @@ -135,8 +135,11 @@ const getSummaries = ({ columns, data }: { columns: any[]; data: DetailRow[] }) if (column.property === 'quantity') { return formatSumQuantity(data, (detail) => detail.quantity) } - if (column.property === 'amount') { - return formatSumPrice(data, (detail) => detail.amount) + if (column.property === 'price') { + return formatSumPrice(data, (detail) => detail.price) + } + if (column.property === 'totalPrice') { + return formatSumPrice(data, (detail) => detail.totalPrice) } return '' }) diff --git a/src/views/wms/order/receipt/ReceiptOrderForm.vue b/src/views/wms/order/receipt/ReceiptOrderForm.vue index 7b8b4858d..eb5e672f7 100644 --- a/src/views/wms/order/receipt/ReceiptOrderForm.vue +++ b/src/views/wms/order/receipt/ReceiptOrderForm.vue @@ -56,7 +56,7 @@ - + - - - - - - - - - -
@@ -101,7 +84,13 @@
- + - + - + + + + @@ -195,11 +198,12 @@ import MerchantSelect from '@/views/wms/md/merchant/components/MerchantSelect.vu import WarehouseSelect from '@/views/wms/md/warehouse/components/WarehouseSelect.vue' import { OrderStatusEnum, OrderUpdateStatusList } from '@/views/wms/utils/constants' import { - formatQuantity, + formatPrice, + formatSumPrice, + formatSumQuantity, PRICE_PRECISION, QUANTITY_PRECISION, - sumPrice, - sumQuantity + sumPrice } from '@/views/wms/utils/format' import { generateOrderNo } from '@/views/wms/utils/order' @@ -223,8 +227,6 @@ const formData = ref({ bizOrderNo: undefined, merchantId: undefined, warehouseId: undefined, - totalQuantity: 0, - totalAmount: 0, remark: undefined, details: [] }) @@ -232,15 +234,12 @@ const formRules = reactive({ no: [{ required: true, message: '入库单号不能为空', trigger: 'blur' }], type: [{ required: true, message: '入库类型不能为空', trigger: 'change' }], orderTime: [{ required: true, message: '单据日期不能为空', trigger: 'change' }], - warehouseId: [{ required: true, message: '仓库不能为空', trigger: 'change' }], - totalQuantity: [{ required: true, message: '入库数量不能为空', trigger: 'change' }], - totalAmount: [{ required: true, message: '总金额不能为空', trigger: 'blur' }] + warehouseId: [{ required: true, message: '仓库不能为空', trigger: 'change' }] }) const formRef = ref() // 表单 Ref const skuSelectRef = ref() // 商品 SKU 选择弹窗 Ref -const totalQuantity = computed(() => sumQuantity(formData.value.details || [], (detail) => detail.quantity)) -const detailTotalAmount = computed(() => sumPrice(formData.value.details || [], (detail) => detail.amount)) +const detailPriceSum = computed(() => sumPrice(formData.value.details || [], (detail) => detail.price)) const isPrepareOrder = computed( () => !formData.value.id || @@ -266,7 +265,7 @@ const open = async (type: string, id?: number) => { const order = await ReceiptOrderApi.getReceiptOrder(id) formData.value = { ...order, - details: order.details || [] + details: normalizeDetails(order.details || []) } } finally { formLoading.value = false @@ -287,9 +286,34 @@ const buildDetail = (sku: ItemSkuVO): ReceiptOrderDetailVO => ({ skuCode: sku.code, skuName: sku.name, quantity: undefined, - amount: undefined + price: undefined, + totalPrice: undefined }) +const normalizeDetails = (details: ReceiptOrderDetailVO[]) => + details.map((detail) => ({ + ...detail, + totalPrice: detail.totalPrice ?? multiplyPrice(detail.quantity, detail.price) + })) + +const roundPrice = (value: number) => { + return Number.isFinite(value) ? Number(value.toFixed(PRICE_PRECISION)) : undefined +} + +const multiplyPrice = (quantity?: number, price?: number) => { + if (!quantity || price === undefined || price === null) { + return undefined + } + return roundPrice(Number(quantity) * Number(price)) +} + +const dividePrice = (totalPrice?: number, quantity?: number) => { + if (totalPrice === undefined || totalPrice === null || !quantity) { + return undefined + } + return roundPrice(Number(totalPrice) / Number(quantity)) +} + /** 添加商品 */ const handleAddDetail = () => { skuSelectRef.value?.open(getSelectedSkuIds()) @@ -309,7 +333,6 @@ const handleSelectSku = (skus: ItemSkuVO[]) => { formData.value.details!.push(buildDetail(sku)) selectedSkuIds.add(sku.id) }) - refreshTotalAmount() } /** 获得已选 SKU 编号 */ @@ -322,18 +345,44 @@ const getSelectedSkuIds = () => { /** 删除明细 */ const handleDeleteDetail = (index: number) => { formData.value.details?.splice(index, 1) - refreshTotalAmount() +} + +/** 明细数量变化 */ +const handleDetailQuantityChange = (detail: ReceiptOrderDetailVO) => { + if (detail.price !== undefined && detail.price !== null) { + detail.totalPrice = multiplyPrice(detail.quantity, detail.price) + return + } + detail.price = dividePrice(detail.totalPrice, detail.quantity) +} + +/** 明细单价变化 */ +const handleDetailPriceChange = (detail: ReceiptOrderDetailVO) => { + detail.totalPrice = multiplyPrice(detail.quantity, detail.price) } /** 明细金额变化 */ -const handleDetailAmountChange = () => { - refreshTotalAmount() +const handleDetailTotalPriceChange = (detail: ReceiptOrderDetailVO) => { + detail.price = dividePrice(detail.totalPrice, detail.quantity) } -/** 汇总明细金额 */ -const refreshTotalAmount = () => { - formData.value.totalAmount = detailTotalAmount.value -} +/** 明细合计 */ +const getDetailSummaries = ({ columns, data }: { columns: any[]; data: ReceiptOrderDetailVO[] }) => + columns.map((column, index) => { + if (index === 0) { + return '合计' + } + if (column.property === 'quantity') { + return formatSumQuantity(data, (detail) => detail.quantity) + } + if (column.property === 'price') { + return formatPrice(detailPriceSum.value) + } + if (column.property === 'totalPrice') { + return formatSumPrice(data, (detail) => detail.totalPrice) + } + return '' + }) /** 校验明细 */ const validateDetails = (required: boolean) => { @@ -359,13 +408,13 @@ const validateDetails = (required: boolean) => { } /** 构建提交数据 */ -const buildSubmitData = () => - ({ - ...formData.value, - totalQuantity: totalQuantity.value, - totalAmount: formData.value.totalAmount, - details: formData.value.details || [] - }) as ReceiptOrderVO +const buildSubmitData = () => { + const { totalQuantity: _totalQuantity, totalPrice: _totalPrice, details, ...order } = formData.value + return { + ...order, + details: (details || []).map(({ totalPrice: _rowTotalPrice, ...detail }) => detail) + } as ReceiptOrderVO +} /** 提交表单 */ const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调 @@ -443,8 +492,6 @@ const resetForm = () => { bizOrderNo: undefined, merchantId: undefined, warehouseId: undefined, - totalQuantity: 0, - totalAmount: 0, remark: undefined, details: [] } diff --git a/src/views/wms/order/receipt/ReceiptOrderPrint.vue b/src/views/wms/order/receipt/ReceiptOrderPrint.vue index 74941d24b..e7af1d5d9 100644 --- a/src/views/wms/order/receipt/ReceiptOrderPrint.vue +++ b/src/views/wms/order/receipt/ReceiptOrderPrint.vue @@ -15,7 +15,7 @@
供应商:{{ printData.merchantName || '-' }}
业务单号:{{ printData.bizOrderNo || '-' }}
总数量:{{ formatQuantity(printData.totalQuantity) || '-' }}
-
总金额:{{ formatPrice(printData.totalAmount) || '-' }}
+
总金额:{{ formatPrice(printData.totalPrice) || '-' }}
创建时间:{{ formatNullableDate(printData.createTime) }}
备注:{{ printData.remark || '-' }}
@@ -25,11 +25,12 @@
商品信息 规格信息 数量单价(元) 金额(元)
{{ detail.itemName || '-' }}
编号:{{ detail.itemCode }}
@@ -42,10 +43,25 @@ {{ formatQuantity(detail.quantity) || '-' }}
- {{ formatPrice(detail.amount) || '-' }} + {{ formatPrice(detail.price) || '-' }} + + {{ formatPrice(detail.totalPrice) || '-' }}
合计 + {{ formatSumQuantity(printRows, (detail) => detail.quantity) }} + + {{ formatSumPrice(printRows, (detail) => detail.price) }} + + {{ formatSumPrice(printRows, (detail) => detail.totalPrice) }} +
({}) // 打印数据 const printButtonRef = ref() // 打印按钮 -const tableColumnCount = 4 +const tableColumnCount = 5 const printObj = ref({ id: 'wmsReceiptOrderPrint', popTitle: ' ', @@ -79,6 +96,20 @@ const printObj = ref({ zIndex: 20003 }) +interface PrintRow extends ReceiptOrderDetailVO { + totalPrice?: number +} + +const printRows = computed(() => + (printData.value.details || []).map((detail) => ({ + ...detail, + totalPrice: + detail.price != null && detail.quantity + ? Number((Number(detail.price) * Number(detail.quantity)).toFixed(2)) + : undefined + })) +) + /** 打印入库单 */ const print = async (id: number) => { printData.value = await ReceiptOrderApi.getReceiptOrder(id) diff --git a/src/views/wms/order/receipt/index.vue b/src/views/wms/order/receipt/index.vue index cd965d61c..5dd619a11 100644 --- a/src/views/wms/order/receipt/index.vue +++ b/src/views/wms/order/receipt/index.vue @@ -80,10 +80,10 @@ /> - +
+ + + @@ -305,7 +310,7 @@
金额: - {{ formatPrice(scope.row.totalAmount) }} + {{ formatPrice(scope.row.totalPrice) }}
@@ -460,8 +465,8 @@ const getDefaultQueryParams = () => ({ orderTime: undefined as string[] | undefined, totalQuantityMin: undefined as number | undefined, totalQuantityMax: undefined as number | undefined, - totalAmountMin: undefined as number | undefined, - totalAmountMax: undefined as number | undefined, + totalPriceMin: undefined as number | undefined, + totalPriceMax: undefined as number | undefined, type: undefined as number | undefined, bizOrderNo: undefined as string | undefined, creator: undefined as number | undefined, @@ -532,6 +537,14 @@ const handleWarehouseChange = () => { handleQuery() } +/** 计算明细金额 */ +const getDetailTotalPrice = (detail: ReceiptOrderDetailVO) => { + if (!detail.quantity || detail.price === undefined || detail.price === null) { + return undefined + } + return Number(detail.quantity) * Number(detail.price) +} + /** 展开明细 */ const handleExpandChange = async (row: ReceiptOrderVO) => { if (!row.id || detailMap[row.id]) { From df013ac69c9deb3ca5c47462604aae99ed0220e6 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 14 May 2026 09:07:26 +0800 Subject: [PATCH 24/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E5=87=BA=E5=BA=93=E7=AE=A1=E7=90=86=EF=BC=8C=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=90=88=E8=AE=A1=E9=87=91=E9=A2=9D=E3=80=81=E6=95=B0=E9=87=8F?= =?UTF-8?q?=E7=9A=84=E5=AD=97=E6=AE=B5=E4=B8=8E=E4=BA=A4=E4=BA=92=E3=80=82?= =?UTF-8?q?=EF=BC=88=E5=89=8D=E7=AB=AF=E8=B4=9F=E8=B4=A3=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=EF=BC=8C=E5=90=8E=E7=AB=AF=E8=B4=9F=E8=B4=A3=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/wms/order/shipment/detail/index.ts | 3 +- src/api/wms/order/shipment/index.ts | 2 +- .../wms/order/receipt/ReceiptOrderForm.vue | 20 +-- .../order/shipment/ShipmentOrderDetail.vue | 25 ++-- .../wms/order/shipment/ShipmentOrderForm.vue | 135 +++++++++++------- .../wms/order/shipment/ShipmentOrderPrint.vue | 43 +++++- src/views/wms/order/shipment/index.vue | 27 +++- src/views/wms/utils/format.ts | 21 +++ 8 files changed, 180 insertions(+), 96 deletions(-) diff --git a/src/api/wms/order/shipment/detail/index.ts b/src/api/wms/order/shipment/detail/index.ts index 30e48f4da..4f2d5c0e9 100644 --- a/src/api/wms/order/shipment/detail/index.ts +++ b/src/api/wms/order/shipment/detail/index.ts @@ -13,6 +13,7 @@ export interface ShipmentOrderDetailVO { warehouseName?: string quantity?: number availableQuantity?: number - amount?: number + price?: number + totalPrice?: number createTime?: Date } diff --git a/src/api/wms/order/shipment/index.ts b/src/api/wms/order/shipment/index.ts index ccbcfb85b..2f1b0ea49 100644 --- a/src/api/wms/order/shipment/index.ts +++ b/src/api/wms/order/shipment/index.ts @@ -15,7 +15,7 @@ export interface ShipmentOrderVO { warehouseId?: number warehouseName?: string totalQuantity?: number - totalAmount?: number + totalPrice?: number details?: ShipmentOrderDetailVO[] createTime?: Date creator?: string diff --git a/src/views/wms/order/receipt/ReceiptOrderForm.vue b/src/views/wms/order/receipt/ReceiptOrderForm.vue index eb5e672f7..cbf74e395 100644 --- a/src/views/wms/order/receipt/ReceiptOrderForm.vue +++ b/src/views/wms/order/receipt/ReceiptOrderForm.vue @@ -198,9 +198,11 @@ import MerchantSelect from '@/views/wms/md/merchant/components/MerchantSelect.vu import WarehouseSelect from '@/views/wms/md/warehouse/components/WarehouseSelect.vue' import { OrderStatusEnum, OrderUpdateStatusList } from '@/views/wms/utils/constants' import { + dividePrice, formatPrice, formatSumPrice, formatSumQuantity, + multiplyPrice, PRICE_PRECISION, QUANTITY_PRECISION, sumPrice @@ -296,24 +298,6 @@ const normalizeDetails = (details: ReceiptOrderDetailVO[]) => totalPrice: detail.totalPrice ?? multiplyPrice(detail.quantity, detail.price) })) -const roundPrice = (value: number) => { - return Number.isFinite(value) ? Number(value.toFixed(PRICE_PRECISION)) : undefined -} - -const multiplyPrice = (quantity?: number, price?: number) => { - if (!quantity || price === undefined || price === null) { - return undefined - } - return roundPrice(Number(quantity) * Number(price)) -} - -const dividePrice = (totalPrice?: number, quantity?: number) => { - if (totalPrice === undefined || totalPrice === null || !quantity) { - return undefined - } - return roundPrice(Number(totalPrice) / Number(quantity)) -} - /** 添加商品 */ const handleAddDetail = () => { skuSelectRef.value?.open(getSelectedSkuIds()) diff --git a/src/views/wms/order/shipment/ShipmentOrderDetail.vue b/src/views/wms/order/shipment/ShipmentOrderDetail.vue index 96ff3f899..42b75317f 100644 --- a/src/views/wms/order/shipment/ShipmentOrderDetail.vue +++ b/src/views/wms/order/shipment/ShipmentOrderDetail.vue @@ -37,7 +37,7 @@ {{ formatQuantity(detailData.totalQuantity) || '-' }} - {{ formatPrice(detailData.totalAmount) || '-' }} + {{ formatPrice(detailData.totalPrice) || '-' }} {{ formatNullableDate(detailData.createTime) }} @@ -80,14 +80,14 @@ - + - + @@ -111,7 +111,7 @@ import { defineOptions({ name: 'WmsShipmentOrderDetail' }) interface DetailRow extends ShipmentOrderDetailVO { - unitPrice?: number + totalPrice?: number } const loading = ref(false) // 加载中 @@ -120,9 +120,9 @@ const detailData = ref({}) // 详情数据 const detailRows = computed(() => (detailData.value.details || []).map((detail) => ({ ...detail, - unitPrice: - detail.amount != null && detail.quantity - ? Number(detail.amount) / Number(detail.quantity) + totalPrice: + detail.price != null && detail.quantity + ? Number(detail.price) * Number(detail.quantity) : undefined })) ) @@ -135,8 +135,11 @@ const getSummaries = ({ columns, data }: { columns: any[]; data: DetailRow[] }) if (column.property === 'quantity') { return formatSumQuantity(data, (detail) => detail.quantity) } - if (column.property === 'amount') { - return formatSumPrice(data, (detail) => detail.amount) + if (column.property === 'price') { + return formatSumPrice(data, (detail) => detail.price) + } + if (column.property === 'totalPrice') { + return formatSumPrice(data, (detail) => detail.totalPrice) } return '' }) diff --git a/src/views/wms/order/shipment/ShipmentOrderForm.vue b/src/views/wms/order/shipment/ShipmentOrderForm.vue index 48cf029b5..793ab2b86 100644 --- a/src/views/wms/order/shipment/ShipmentOrderForm.vue +++ b/src/views/wms/order/shipment/ShipmentOrderForm.vue @@ -56,7 +56,7 @@
- + - - - - - - - - - -
@@ -101,7 +84,13 @@
- + - + - + + + + @@ -205,11 +208,15 @@ import MerchantSelect from '@/views/wms/md/merchant/components/MerchantSelect.vu import WarehouseSelect from '@/views/wms/md/warehouse/components/WarehouseSelect.vue' import { OrderStatusEnum, OrderUpdateStatusList } from '@/views/wms/utils/constants' import { + dividePrice, + formatPrice, formatQuantity, + formatSumPrice, + formatSumQuantity, + multiplyPrice, PRICE_PRECISION, QUANTITY_PRECISION, - sumPrice, - sumQuantity + sumPrice } from '@/views/wms/utils/format' import { generateOrderNo } from '@/views/wms/utils/order' @@ -233,8 +240,6 @@ const formData = ref({ bizOrderNo: undefined, merchantId: undefined, warehouseId: undefined, - totalQuantity: 0, - totalAmount: 0, remark: undefined, details: [] }) @@ -242,15 +247,12 @@ const formRules = reactive({ no: [{ required: true, message: '出库单号不能为空', trigger: 'blur' }], type: [{ required: true, message: '出库类型不能为空', trigger: 'change' }], orderTime: [{ required: true, message: '单据日期不能为空', trigger: 'change' }], - warehouseId: [{ required: true, message: '仓库不能为空', trigger: 'change' }], - totalQuantity: [{ required: true, message: '出库数量不能为空', trigger: 'change' }], - totalAmount: [{ required: true, message: '总金额不能为空', trigger: 'blur' }] + warehouseId: [{ required: true, message: '仓库不能为空', trigger: 'change' }] }) const formRef = ref() // 表单 Ref const inventorySelectRef = ref() // 库存选择弹窗 Ref -const totalQuantity = computed(() => sumQuantity(formData.value.details || [], (detail) => detail.quantity)) -const detailTotalAmount = computed(() => sumPrice(formData.value.details || [], (detail) => detail.amount)) +const detailPriceSum = computed(() => sumPrice(formData.value.details || [], (detail) => detail.price)) const isPrepareOrder = computed( () => !formData.value.id || @@ -276,7 +278,7 @@ const open = async (type: string, id?: number) => { const order = await ShipmentOrderApi.getShipmentOrder(id) formData.value = { ...order, - details: order.details || [] + details: normalizeDetails(order.details || []) } } finally { formLoading.value = false @@ -300,9 +302,16 @@ const buildDetail = (inventory: InventorySelectRow): ShipmentOrderDetailVO => ({ warehouseName: inventory.warehouseName, quantity: undefined, availableQuantity: inventory.availableQuantity, - amount: undefined + price: undefined, + totalPrice: undefined }) +const normalizeDetails = (details: ShipmentOrderDetailVO[]) => + details.map((detail) => ({ + ...detail, + totalPrice: detail.totalPrice ?? multiplyPrice(detail.quantity, detail.price) + })) + /** 添加商品 */ const handleAddDetail = () => { inventorySelectRef.value?.open() @@ -320,7 +329,6 @@ const handleSelectInventory = (inventories: InventorySelectRow[]) => { } formData.value.details!.push(buildDetail(inventory)) }) - refreshTotalAmount() } /** 判断库存是否已选择 */ @@ -336,24 +344,49 @@ const isInventorySelected = (inventory: InventorySelectRow) => { /** 删除明细 */ const handleDeleteDetail = (index: number) => { formData.value.details?.splice(index, 1) - refreshTotalAmount() } /** 仓库变化 */ const handleWarehouseChange = () => { formData.value.details = [] - refreshTotalAmount() +} + +/** 明细数量变化 */ +const handleDetailQuantityChange = (detail: ShipmentOrderDetailVO) => { + if (detail.price !== undefined && detail.price !== null) { + detail.totalPrice = multiplyPrice(detail.quantity, detail.price) + return + } + detail.price = dividePrice(detail.totalPrice, detail.quantity) +} + +/** 明细单价变化 */ +const handleDetailPriceChange = (detail: ShipmentOrderDetailVO) => { + detail.totalPrice = multiplyPrice(detail.quantity, detail.price) } /** 明细金额变化 */ -const handleDetailAmountChange = () => { - refreshTotalAmount() +const handleDetailTotalPriceChange = (detail: ShipmentOrderDetailVO) => { + detail.price = dividePrice(detail.totalPrice, detail.quantity) } -/** 汇总明细金额 */ -const refreshTotalAmount = () => { - formData.value.totalAmount = detailTotalAmount.value -} +/** 明细合计 */ +const getDetailSummaries = ({ columns, data }: { columns: any[]; data: ShipmentOrderDetailVO[] }) => + columns.map((column, index) => { + if (index === 0) { + return '合计' + } + if (column.property === 'quantity') { + return formatSumQuantity(data, (detail) => detail.quantity) + } + if (column.property === 'price') { + return formatPrice(detailPriceSum.value) + } + if (column.property === 'totalPrice') { + return formatSumPrice(data, (detail) => detail.totalPrice) + } + return '' + }) /** 校验明细 */ const validateDetails = (required: boolean) => { @@ -383,13 +416,13 @@ const validateDetails = (required: boolean) => { } /** 构建提交数据 */ -const buildSubmitData = () => - ({ - ...formData.value, - totalQuantity: totalQuantity.value, - totalAmount: formData.value.totalAmount, - details: formData.value.details || [] - }) as ShipmentOrderVO +const buildSubmitData = () => { + const { totalQuantity: _totalQuantity, totalPrice: _totalPrice, details, ...order } = formData.value + return { + ...order, + details: (details || []).map(({ totalPrice: _rowTotalPrice, ...detail }) => detail) + } as ShipmentOrderVO +} /** 提交表单 */ const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调 @@ -467,8 +500,6 @@ const resetForm = () => { bizOrderNo: undefined, merchantId: undefined, warehouseId: undefined, - totalQuantity: 0, - totalAmount: 0, remark: undefined, details: [] } diff --git a/src/views/wms/order/shipment/ShipmentOrderPrint.vue b/src/views/wms/order/shipment/ShipmentOrderPrint.vue index 7e1145d90..b60f12dd5 100644 --- a/src/views/wms/order/shipment/ShipmentOrderPrint.vue +++ b/src/views/wms/order/shipment/ShipmentOrderPrint.vue @@ -15,7 +15,7 @@
客户:{{ printData.merchantName || '-' }}
业务单号:{{ printData.bizOrderNo || '-' }}
总数量:{{ formatQuantity(printData.totalQuantity) || '-' }}
-
总金额:{{ formatPrice(printData.totalAmount) || '-' }}
+
总金额:{{ formatPrice(printData.totalPrice) || '-' }}
创建时间:{{ formatNullableDate(printData.createTime) }}
备注:{{ printData.remark || '-' }}
@@ -25,11 +25,12 @@
商品信息 规格信息 数量单价(元) 金额(元)
{{ detail.itemName || '-' }}
编号:{{ detail.itemCode }}
@@ -42,10 +43,25 @@ {{ formatQuantity(detail.quantity) || '-' }}
- {{ formatPrice(detail.amount) || '-' }} + {{ formatPrice(detail.price) || '-' }} + + {{ formatPrice(detail.totalPrice) || '-' }}
合计 + {{ formatSumQuantity(printRows, (detail) => detail.quantity) }} + + {{ formatSumPrice(printRows, (detail) => detail.price) }} + + {{ formatSumPrice(printRows, (detail) => detail.totalPrice) }} +
({}) // 打印数据 const printButtonRef = ref() // 打印按钮 -const tableColumnCount = 4 +const tableColumnCount = 5 const printObj = ref({ id: 'wmsShipmentOrderPrint', popTitle: ' ', @@ -79,6 +96,20 @@ const printObj = ref({ zIndex: 20003 }) +interface PrintRow extends ShipmentOrderDetailVO { + totalPrice?: number +} + +const printRows = computed(() => + (printData.value.details || []).map((detail) => ({ + ...detail, + totalPrice: + detail.price != null && detail.quantity + ? Number((Number(detail.price) * Number(detail.quantity)).toFixed(2)) + : undefined + })) +) + /** 打印出库单 */ const print = async (id: number) => { printData.value = await ShipmentOrderApi.getShipmentOrder(id) diff --git a/src/views/wms/order/shipment/index.vue b/src/views/wms/order/shipment/index.vue index 74a88ed0c..1b4af26f4 100644 --- a/src/views/wms/order/shipment/index.vue +++ b/src/views/wms/order/shipment/index.vue @@ -80,10 +80,10 @@ /> - +
+ + + @@ -305,7 +310,7 @@
金额: - {{ formatPrice(scope.row.totalAmount) }} + {{ formatPrice(scope.row.totalPrice) }}
@@ -460,8 +465,8 @@ const getDefaultQueryParams = () => ({ orderTime: undefined as string[] | undefined, totalQuantityMin: undefined as number | undefined, totalQuantityMax: undefined as number | undefined, - totalAmountMin: undefined as number | undefined, - totalAmountMax: undefined as number | undefined, + totalPriceMin: undefined as number | undefined, + totalPriceMax: undefined as number | undefined, type: undefined as number | undefined, bizOrderNo: undefined as string | undefined, creator: undefined as number | undefined, @@ -532,6 +537,14 @@ const handleWarehouseChange = () => { handleQuery() } +/** 计算明细金额 */ +const getDetailTotalPrice = (detail: ShipmentOrderDetailVO) => { + if (!detail.quantity || detail.price === undefined || detail.price === null) { + return undefined + } + return Number(detail.quantity) * Number(detail.price) +} + /** 展开明细 */ const handleExpandChange = async (row: ShipmentOrderVO) => { if (!row.id || detailMap[row.id]) { diff --git a/src/views/wms/utils/format.ts b/src/views/wms/utils/format.ts index 4f2a3b338..b5dd5d780 100644 --- a/src/views/wms/utils/format.ts +++ b/src/views/wms/utils/format.ts @@ -48,6 +48,27 @@ export const formatPrice = (value?: number | string | null) => { return decimalValue === undefined ? '' : decimalValue.toFixed(PRICE_PRECISION) } +/** 金额四舍五入 */ +export const roundPrice = (value: number) => { + return Number.isFinite(value) ? Number(value.toFixed(PRICE_PRECISION)) : undefined +} + +/** 数量 * 单价,计算金额 */ +export const multiplyPrice = (quantity?: number, price?: number) => { + if (!quantity || price === undefined || price === null) { + return undefined + } + return roundPrice(Number(quantity) * Number(price)) +} + +/** 金额 / 数量,反算单价 */ +export const dividePrice = (totalPrice?: number, quantity?: number) => { + if (totalPrice === undefined || totalPrice === null || !quantity) { + return undefined + } + return roundPrice(Number(totalPrice) / Number(quantity)) +} + /** 汇总数量 */ export const sumQuantity = (list: T[], getter: (item: T) => DecimalValue) => { return sumDecimal(list, getter) From eaedb1e0ca078de8ab39a3b1a263b6a77de567e5 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 14 May 2026 09:46:19 +0800 Subject: [PATCH 25/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E7=A7=BB=E5=BA=93=E7=AE=A1=E7=90=86=EF=BC=8C=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=90=88=E8=AE=A1=E9=87=91=E9=A2=9D=E3=80=81=E6=95=B0=E9=87=8F?= =?UTF-8?q?=E7=9A=84=E5=AD=97=E6=AE=B5=E4=B8=8E=E4=BA=A4=E4=BA=92=E3=80=82?= =?UTF-8?q?=EF=BC=88=E5=89=8D=E7=AB=AF=E8=B4=9F=E8=B4=A3=E5=B1=95=E7=A4=BA?= =?UTF-8?q?=EF=BC=8C=E5=90=8E=E7=AB=AF=E8=B4=9F=E8=B4=A3=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/wms/order/movement/detail/index.ts | 3 +- src/api/wms/order/movement/index.ts | 2 +- .../order/movement/MovementOrderDetail.vue | 30 +++- .../wms/order/movement/MovementOrderForm.vue | 134 ++++++++++++------ src/views/wms/order/movement/index.vue | 23 ++- 5 files changed, 130 insertions(+), 62 deletions(-) diff --git a/src/api/wms/order/movement/detail/index.ts b/src/api/wms/order/movement/detail/index.ts index df7a1d228..accd5fe93 100644 --- a/src/api/wms/order/movement/detail/index.ts +++ b/src/api/wms/order/movement/detail/index.ts @@ -15,6 +15,7 @@ export interface MovementOrderDetailVO { targetWarehouseName?: string quantity?: number availableQuantity?: number - amount?: number + price?: number + totalPrice?: number createTime?: Date } diff --git a/src/api/wms/order/movement/index.ts b/src/api/wms/order/movement/index.ts index 8542dd2e0..20204fbc4 100644 --- a/src/api/wms/order/movement/index.ts +++ b/src/api/wms/order/movement/index.ts @@ -13,7 +13,7 @@ export interface MovementOrderVO { targetWarehouseId?: number targetWarehouseName?: string totalQuantity?: number - totalAmount?: number + totalPrice?: number details?: MovementOrderDetailVO[] createTime?: Date creator?: string diff --git a/src/views/wms/order/movement/MovementOrderDetail.vue b/src/views/wms/order/movement/MovementOrderDetail.vue index f71552113..4c83b2e95 100644 --- a/src/views/wms/order/movement/MovementOrderDetail.vue +++ b/src/views/wms/order/movement/MovementOrderDetail.vue @@ -26,7 +26,7 @@ {{ formatQuantity(detailData.totalQuantity) || '-' }} - {{ formatPrice(detailData.totalAmount) || '-' }} + {{ formatPrice(detailData.totalPrice) || '-' }} {{ formatNullableDate(detailData.createTime) }} @@ -46,7 +46,7 @@
商品明细
- + @@ -331,8 +334,8 @@ const getDefaultQueryParams = () => ({ orderTime: undefined as string[] | undefined, totalQuantityMin: undefined as number | undefined, totalQuantityMax: undefined as number | undefined, - totalAmountMin: undefined as number | undefined, - totalAmountMax: undefined as number | undefined, + totalPriceMin: undefined as number | undefined, + totalPriceMax: undefined as number | undefined, creator: undefined as number | undefined, updater: undefined as number | undefined, createTime: undefined as string[] | undefined, @@ -373,6 +376,12 @@ const resetQuery = () => { Object.assign(queryParams, getDefaultQueryParams()) handleQuery() } +const getDetailTotalPrice = (detail: MovementOrderDetailVO) => { + if (!detail.quantity || detail.price === undefined || detail.price === null) { + return undefined + } + return Number(detail.quantity) * Number(detail.price) +} const handleExpandChange = async (row: MovementOrderVO) => { if (!row.id || detailMap[row.id]) return detailMap[row.id] = await MovementOrderApi.getMovementOrderDetailListByOrderId(row.id) From 804ad667e0b55ba426d2e6b5228fc34675442268 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 14 May 2026 17:03:49 +0800 Subject: [PATCH 26/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=9B=98=E5=BA=93=E5=8D=95=E7=9A=84=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/wms/order/check/detail/index.ts | 3 +- src/api/wms/order/check/index.ts | 3 +- src/utils/dict.ts | 2 +- .../inventory/components/InventorySelect.vue | 2 +- src/views/wms/inventory/history/index.vue | 16 +- .../wms/order/check/CheckOrderDetail.vue | 72 ++++++- src/views/wms/order/check/CheckOrderForm.vue | 175 ++++++++++++----- src/views/wms/order/check/CheckOrderPrint.vue | 184 ++++++++++++++++++ src/views/wms/order/check/index.vue | 108 ++++++++-- src/views/wms/utils/format.ts | 8 +- 10 files changed, 484 insertions(+), 89 deletions(-) create mode 100644 src/views/wms/order/check/CheckOrderPrint.vue diff --git a/src/api/wms/order/check/detail/index.ts b/src/api/wms/order/check/detail/index.ts index 4009d7f5e..9424a3064 100644 --- a/src/api/wms/order/check/detail/index.ts +++ b/src/api/wms/order/check/detail/index.ts @@ -15,8 +15,7 @@ export interface CheckOrderDetailVO { receiptTime?: Date quantity?: number checkQuantity?: number - differenceQuantity?: number availableQuantity?: number - amount?: number + price?: number createTime?: Date } diff --git a/src/api/wms/order/check/index.ts b/src/api/wms/order/check/index.ts index 3773c64ea..a28b298ef 100644 --- a/src/api/wms/order/check/index.ts +++ b/src/api/wms/order/check/index.ts @@ -11,7 +11,8 @@ export interface CheckOrderVO { warehouseId?: number warehouseName?: string totalQuantity?: number - totalAmount?: number + totalPrice?: number + actualPrice?: number details?: CheckOrderDetailVO[] createTime?: Date creator?: string diff --git a/src/utils/dict.ts b/src/utils/dict.ts index df5dbc00a..35774ab65 100644 --- a/src/utils/dict.ts +++ b/src/utils/dict.ts @@ -218,7 +218,7 @@ export enum DICT_TYPE { // ========== WMS - 仓库管理模块 ========== WMS_MERCHANT_TYPE = 'merchant_type', // WMS 往来企业类型 - WMS_INVENTORY_HISTORY_TYPE = 'wms_inventory_history_type', // WMS 库存记录类型 + WMS_ORDER_TYPE = 'wms_order_type', // WMS 单据类型 WMS_ORDER_STATUS = 'wms_order_status', // WMS 单据状态 WMS_RECEIPT_ORDER_TYPE = 'wms_receipt_order_type', // WMS 入库单类型 WMS_SHIPMENT_ORDER_TYPE = 'wms_shipment_order_type', // WMS 出库单类型 diff --git a/src/views/wms/inventory/components/InventorySelect.vue b/src/views/wms/inventory/components/InventorySelect.vue index 1ecfba9e9..457d55490 100644 --- a/src/views/wms/inventory/components/InventorySelect.vue +++ b/src/views/wms/inventory/components/InventorySelect.vue @@ -129,7 +129,7 @@ import { InventoryApi, InventoryVO } from '@/api/wms/inventory' import { formatQuantity } from '@/views/wms/utils/format' export interface InventorySelectRow extends InventoryVO { - amount?: number + price?: number availableQuantity?: number } diff --git a/src/views/wms/inventory/history/index.vue b/src/views/wms/inventory/history/index.vue index 4d0aaf673..42a7d46e1 100644 --- a/src/views/wms/inventory/history/index.vue +++ b/src/views/wms/inventory/history/index.vue @@ -9,28 +9,28 @@ class="-mb-15px" label-width="68px" > - + - + @@ -107,10 +107,10 @@ :show-overflow-tooltip="true" border > - - + + diff --git a/src/views/wms/order/check/CheckOrderDetail.vue b/src/views/wms/order/check/CheckOrderDetail.vue index f0d6e52af..5bd29292e 100644 --- a/src/views/wms/order/check/CheckOrderDetail.vue +++ b/src/views/wms/order/check/CheckOrderDetail.vue @@ -18,10 +18,20 @@ -
- {{ formatQuantity(detailData.totalQuantity) || '-' }} + + {{ formatQuantity(detailData.totalQuantity) || '-' }} + - {{ formatPrice(detailData.totalAmount) || '-' }} + {{ formatPrice(detailData.totalPrice) || '-' }} + + + {{ formatPrice(detailData.actualPrice) || '-' }} + + + + {{ formatPrice(getOrderDifferencePrice(detailData)) || '-' }} + {{ formatNullableDate(detailData.createTime) }} @@ -55,14 +65,26 @@ + + + - - + + - - + + + + + @@ -70,11 +92,21 @@ diff --git a/src/views/wms/order/check/index.vue b/src/views/wms/order/check/index.vue index 7513d06c1..f22b6474e 100644 --- a/src/views/wms/order/check/index.vue +++ b/src/views/wms/order/check/index.vue @@ -48,10 +48,10 @@ />
- +
+
+
+ +
+ + + + + + + + + - + + + + @@ -202,15 +240,23 @@ {{ row.warehouseName || '-' }} - + @@ -249,6 +295,14 @@ + + 打印 + @@ -257,6 +311,7 @@ + + + From ae54f938cf344c98a9067ead5c924d3ab705fd91 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 14 May 2026 22:35:53 +0800 Subject: [PATCH 28/46] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E9=A6=96=E9=A1=B5=E7=9A=84=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/wms/home/index.ts | 18 +- .../components/WmsHomeInventoryCharts.vue | 209 ++++++ .../components/WmsHomeOrderSummaryCards.vue | 219 ++++++ .../components/WmsHomeOrderTrendChart.vue | 174 +++++ src/views/wms/home/index.vue | 686 +----------------- src/views/wms/inventory/history/index.vue | 8 +- src/views/wms/inventory/index/index.vue | 14 +- .../md/item/sku/components/ItemSkuSelect.vue | 12 +- .../wms/order/check/CheckOrderDetail.vue | 62 +- src/views/wms/order/check/CheckOrderForm.vue | 103 ++- src/views/wms/order/check/CheckOrderPrint.vue | 26 +- src/views/wms/order/check/index.vue | 161 ++-- .../order/movement/MovementOrderDetail.vue | 15 +- .../wms/order/movement/MovementOrderForm.vue | 75 +- src/views/wms/order/movement/index.vue | 140 ++-- .../wms/order/receipt/ReceiptOrderForm.vue | 37 +- .../wms/order/receipt/ReceiptOrderPrint.vue | 7 +- src/views/wms/order/receipt/index.vue | 74 +- .../wms/order/shipment/ShipmentOrderForm.vue | 42 +- .../wms/order/shipment/ShipmentOrderPrint.vue | 7 +- src/views/wms/order/shipment/index.vue | 74 +- 21 files changed, 1184 insertions(+), 979 deletions(-) create mode 100644 src/views/wms/home/components/WmsHomeInventoryCharts.vue create mode 100644 src/views/wms/home/components/WmsHomeOrderSummaryCards.vue create mode 100644 src/views/wms/home/components/WmsHomeOrderTrendChart.vue diff --git a/src/api/wms/home/index.ts b/src/api/wms/home/index.ts index 68cf18c5f..3c747bd87 100644 --- a/src/api/wms/home/index.ts +++ b/src/api/wms/home/index.ts @@ -3,26 +3,26 @@ import request from '@/config/axios' // WMS 首页统计查询参数 export interface WmsHomeStatisticsReqVO { warehouseId?: number + goodsLimit?: number + warehouseLimit?: number } // WMS 首页单据状态统计 VO export interface WmsHomeOrderStatusVO { status: number - statusName: string count: number } // WMS 首页单据汇总统计 VO export interface WmsHomeOrderSummaryVO { - orderType: number - orderTypeName: string + type: number total: number - statusList: WmsHomeOrderStatusVO[] + statuses: WmsHomeOrderStatusVO[] } // WMS 首页单据趋势 VO export interface WmsHomeOrderTrendVO { - date: string + time: string | number receiptCount: number shipmentCount: number movementCount: number @@ -31,15 +31,15 @@ export interface WmsHomeOrderTrendVO { // WMS 首页商品库存排行 VO export interface WmsHomeInventoryItemRankVO { - itemId: number - itemName: string + id: number + name: string quantity: number } // WMS 首页仓库库存排行 VO export interface WmsHomeInventoryWarehouseRankVO { - warehouseId: number - warehouseName: string + id: number + name: string quantity: number } diff --git a/src/views/wms/home/components/WmsHomeInventoryCharts.vue b/src/views/wms/home/components/WmsHomeInventoryCharts.vue new file mode 100644 index 000000000..1eaeef6a3 --- /dev/null +++ b/src/views/wms/home/components/WmsHomeInventoryCharts.vue @@ -0,0 +1,209 @@ + + + diff --git a/src/views/wms/home/components/WmsHomeOrderSummaryCards.vue b/src/views/wms/home/components/WmsHomeOrderSummaryCards.vue new file mode 100644 index 000000000..a87a70bc0 --- /dev/null +++ b/src/views/wms/home/components/WmsHomeOrderSummaryCards.vue @@ -0,0 +1,219 @@ + + + diff --git a/src/views/wms/home/components/WmsHomeOrderTrendChart.vue b/src/views/wms/home/components/WmsHomeOrderTrendChart.vue new file mode 100644 index 000000000..06c152850 --- /dev/null +++ b/src/views/wms/home/components/WmsHomeOrderTrendChart.vue @@ -0,0 +1,174 @@ + + + diff --git a/src/views/wms/home/index.vue b/src/views/wms/home/index.vue index 20f1fc0b1..08b38e592 100644 --- a/src/views/wms/home/index.vue +++ b/src/views/wms/home/index.vue @@ -1,29 +1,25 @@ - - - diff --git a/src/views/wms/inventory/history/index.vue b/src/views/wms/inventory/history/index.vue index 42a7d46e1..e67855c39 100644 --- a/src/views/wms/inventory/history/index.vue +++ b/src/views/wms/inventory/history/index.vue @@ -102,7 +102,7 @@
库存流水
{ await getList() }) - - diff --git a/src/views/wms/inventory/index/index.vue b/src/views/wms/inventory/index/index.vue index abf0e22c0..cb8dca3b3 100644 --- a/src/views/wms/inventory/index/index.vue +++ b/src/views/wms/inventory/index/index.vue @@ -11,11 +11,7 @@ > - + {{ item.label }} @@ -82,7 +78,7 @@
{ await getList() }) - - diff --git a/src/views/wms/md/item/sku/components/ItemSkuSelect.vue b/src/views/wms/md/item/sku/components/ItemSkuSelect.vue index 313366b1f..06e03e3c5 100644 --- a/src/views/wms/md/item/sku/components/ItemSkuSelect.vue +++ b/src/views/wms/md/item/sku/components/ItemSkuSelect.vue @@ -91,7 +91,9 @@
商品编号:{{ row.itemCode }}
-
品牌:{{ row.brandName }}
+
+ 品牌:{{ row.brandName }} +
@@ -104,13 +106,17 @@ diff --git a/src/views/wms/order/check/CheckOrderDetail.vue b/src/views/wms/order/check/CheckOrderDetail.vue index 5bd29292e..dbfdc3113 100644 --- a/src/views/wms/order/check/CheckOrderDetail.vue +++ b/src/views/wms/order/check/CheckOrderDetail.vue @@ -5,7 +5,9 @@
单据信息
{{ detailData.no || '-' }} - {{ detailData.warehouseName || '-' }} + + {{ detailData.warehouseName || '-' }} + {{ formatNullableDate(detailData.orderTime, 'YYYY-MM-DD') }} @@ -45,7 +47,9 @@ {{ detailData.updaterName || detailData.updater || '-' }} - {{ detailData.remark || '-' }} + + {{ detailData.remark || '-' }} +
商品明细
@@ -53,13 +57,17 @@ @@ -83,7 +91,9 @@
@@ -116,9 +126,15 @@ const dialogVisible = ref(false) const detailData = ref({}) const getOrderDifferencePrice = (order: CheckOrderVO) => roundPrice(Number(order.actualPrice || 0) - Number(order.totalPrice || 0)) -const getDifferenceQuantity = (detail: CheckOrderDetailVO) => Number(detail.checkQuantity || 0) - Number(detail.quantity || 0) +const getDifferenceQuantity = (detail: CheckOrderDetailVO) => + Number(detail.checkQuantity || 0) - Number(detail.quantity || 0) const getActualPrice = (detail: CheckOrderDetailVO) => { - if (detail.checkQuantity === undefined || detail.checkQuantity === null || detail.price === undefined || detail.price === null) { + if ( + detail.checkQuantity === undefined || + detail.checkQuantity === null || + detail.price === undefined || + detail.price === null + ) { return undefined } return roundPrice(Number(detail.checkQuantity) * Number(detail.price)) @@ -129,20 +145,36 @@ const getDifferencePrice = (detail: CheckOrderDetailVO) => { } return roundPrice(getDifferenceQuantity(detail) * Number(detail.price)) } -const renderLossText = (value: number | string | null | undefined, formatter: (value?: number | string | null) => string) => - h('span', { class: getLossClass(value) }, formatter(value)) +const renderLossText = ( + value: number | string | null | undefined, + formatter: (value?: number | string | null) => string +) => h('span', { class: getLossClass(value) }, formatter(value)) const getSummaries = ({ columns, data }: { columns: any[]; data: CheckOrderDetailVO[] }) => columns.map((column, index) => { - if (index === 0) return '合计' - if (column.property === 'quantity') return formatSumQuantity(data, (detail) => detail.quantity) - if (column.property === 'checkQuantity') return formatSumQuantity(data, (detail) => detail.checkQuantity) - if (column.property === 'actualPrice') return formatSumPrice(data, (detail) => getActualPrice(detail)) + if (index === 0) { + return '合计' + } + if (column.property === 'quantity') { + return formatSumQuantity(data, (detail) => detail.quantity) + } + if (column.property === 'checkQuantity') { + return formatSumQuantity(data, (detail) => detail.checkQuantity) + } + if (column.property === 'actualPrice') { + return formatSumPrice(data, (detail) => getActualPrice(detail)) + } if (column.property === 'differenceQuantity') { - return renderLossText(sumQuantity(data, (detail) => getDifferenceQuantity(detail)), formatQuantity) + return renderLossText( + sumQuantity(data, (detail) => getDifferenceQuantity(detail)), + formatQuantity + ) } if (column.property === 'differencePrice') { - return renderLossText(sumPrice(data, (detail) => getDifferencePrice(detail)), formatPrice) + return renderLossText( + sumPrice(data, (detail) => getDifferencePrice(detail)), + formatPrice + ) } return '' }) diff --git a/src/views/wms/order/check/CheckOrderForm.vue b/src/views/wms/order/check/CheckOrderForm.vue index 6297ab494..99db891cf 100644 --- a/src/views/wms/order/check/CheckOrderForm.vue +++ b/src/views/wms/order/check/CheckOrderForm.vue @@ -1,7 +1,13 @@