From 58d99e52c55329cf678e0ff3ad697461b2468e7d Mon Sep 17 00:00:00 2001 From: Timi Date: Mon, 5 Oct 2026 16:11:24 +0800 Subject: [PATCH] add ProductStockPackageSummary.vue --- src/pages/product/ProductStockDetail.vue | 2 + .../component/ProductStockPackageSummary.vue | 78 +++++++++++++++++++ src/utils/package.ts | 23 ++++++ 3 files changed, 103 insertions(+) create mode 100644 src/pages/product/component/ProductStockPackageSummary.vue diff --git a/src/pages/product/ProductStockDetail.vue b/src/pages/product/ProductStockDetail.vue index c0c5a32..ad36a8a 100644 --- a/src/pages/product/ProductStockDetail.vue +++ b/src/pages/product/ProductStockDetail.vue @@ -55,6 +55,7 @@ + @@ -100,6 +101,7 @@ import { shallowRef } from "vue"; import { useUserStore } from "timi-web-api"; import ProductAPI from "@/api/ProductAPI"; import ProductProfile from "@/pages/product/component/ProductProfile.vue"; +import ProductStockPackageSummary from "@/pages/product/component/ProductStockPackageSummary.vue"; import ProductStockOperationPopup from "@/pages/product/ProductStockOperationPopup.vue"; import { useNavBarStore } from "@/store/navBarStore"; import type { Product, ProductSku, ProductStock, ProductSkuUnit, StockOperationType } from "@/types/Product"; diff --git a/src/pages/product/component/ProductStockPackageSummary.vue b/src/pages/product/component/ProductStockPackageSummary.vue new file mode 100644 index 0000000..e7a9337 --- /dev/null +++ b/src/pages/product/component/ProductStockPackageSummary.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/src/utils/package.ts b/src/utils/package.ts index 5dc73e9..1ed47b1 100644 --- a/src/utils/package.ts +++ b/src/utils/package.ts @@ -100,6 +100,29 @@ export function convertBaseQuantityToPackageQuantity(baseQuantity: number | stri return formatDecimal(rounded, 3, 3); } +/** 将非负基础数量精确拆分为整包装和基础单位余数,不对余数取整。 */ +export function splitBaseQuantityIntoPackages(baseQuantity: number | string, baseQuantityPerUnit: number | string): { whole: string; remainder: string } | undefined { + const quantityParts = toDecimalParts(baseQuantity, 3); + const unitParts = toDecimalParts(baseQuantityPerUnit, 6); + if (!quantityParts || !unitParts) { + return undefined; + } + const scale = Math.max(quantityParts.scale, unitParts.scale); + const factor = 10n ** BigInt(scale); + const quantity = quantityParts.value * 10n ** BigInt(scale - quantityParts.scale); + const unit = unitParts.value * 10n ** BigInt(scale - unitParts.scale); + if (unit <= factor) { + return undefined; + } + const remainder = quantity % unit; + const integer = (remainder / factor).toString(); + const fraction = (remainder % factor).toString().padStart(scale, "0").replace(/0+$/, ""); + return { + whole: (quantity / unit).toString(), + remainder: fraction ? `${integer}.${fraction}` : integer + }; +} + /** 精确相加两个最多三位小数的数量。 */ export function addPackageQuantity(left: number | string, right: number | string): string | undefined { const leftParts = toQuantityParts(left);