From 6f96d004a9b2a7f99018bc2705fcb214a61f4719 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Thu, 14 May 2026 08:39:04 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=88wms=EF=BC=89=EF=BC=9A=E5=85=A5?= =?UTF-8?q?=E5=BA=93=E7=AE=A1=E7=90=86=EF=BC=8C=E8=B0=83=E6=95=B4=E5=90=88?= =?UTF-8?q?=E8=AE=A1=E9=87=91=E9=A2=9D=E3=80=81=E6=95=B0=E9=87=8F=E7=9A=84?= =?UTF-8?q?=E5=AD=97=E6=AE=B5=E4=B8=8E=E4=BA=A4=E4=BA=92=E3=80=82=EF=BC=88?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E8=B4=9F=E8=B4=A3=E5=B1=95=E7=A4=BA=EF=BC=8C?= =?UTF-8?q?=E5=90=8E=E7=AB=AF=E8=B4=9F=E8=B4=A3=E8=AE=A1=E7=AE=97=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]) {