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);