-
+
-
+
-
+
-
-
+
@@ -56,7 +55,7 @@
/>
-
+
@@ -119,11 +118,12 @@ import PhotoScroller from "@/components/PhotoScroller.vue";
import { useNavBarStore } from "@/store/navBarStore";
import type { NavBarAction } from "@/types/NavBarAction";
import type { PhotoItem } from "@/types/Photo";
-import type { Product, ProductUnit } from "@/types/Product";
+import type { Product } from "@/types/Product";
import { getAttachmentReadURL } from "@/utils/attachment";
import { getErrorMessage } from "@/utils/error";
import {
formatProductAmount,
+ getProductBaseUnitName,
getProductPhotoURL,
getProductStatusText,
getProductStatusTheme,
@@ -164,17 +164,6 @@ const actionList = computed
(() => {
return list;
});
-function getUnitUsageText(unit: ProductUnit): string {
- const usage: string[] = [];
- if (unit.allowSale) {
- usage.push("可销售");
- }
- if (unit.allowPurchase) {
- usage.push("可采购");
- }
- return usage.length ? usage.join("、") : "暂无业务用途";
-}
-
async function load(): Promise {
const id = String(route.params.id || "");
if (!id) {
diff --git a/src/pages/product/ProductEdit.vue b/src/pages/product/ProductEdit.vue
index 6229aac..3199581 100644
--- a/src/pages/product/ProductEdit.vue
+++ b/src/pages/product/ProductEdit.vue
@@ -1,32 +1,46 @@
-
-
-
+
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
- 管理库存
-
-
- 业务数量允许小数
-
-
-
+
+
@@ -34,55 +48,88 @@
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 基础单位
-
-
- 入库可用
-
-
- 销售和套餐可用
-
-
-
-
添加业务单位
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
@@ -92,6 +139,7 @@
+
@@ -131,14 +179,12 @@ const form = reactive({
code: "",
name: "",
productType: "GOODS",
- baseUnit: "",
stockEnabled: true,
allowDecimalQuantity: false,
status: "ACTIVE",
unitList: []
});
-const referenceCostText = ref("");
-const minStockQuantityText = ref("");
+const minStockQuantityText = ref("0");
const categoryList = ref([]);
const typePickerVisible = ref(false);
const categoryPickerVisible = ref(false);
@@ -331,19 +377,14 @@ function parseOptionalAmount(value: string): number | null | undefined {
}
function validate(): boolean {
- if (!form.code.trim() || !form.name.trim() || !form.baseUnit.trim()) {
- Message.warning("产品编码、名称和基础单位不能为空");
+ if (!form.code.trim() || !form.name.trim()) {
+ Message.warning("产品编码和名称不能为空");
return false;
}
if (form.productType === "SERVICE" && form.stockEnabled) {
Message.warning("服务产品不能管理库存");
return false;
}
- const referenceCost = parseOptionalAmount(referenceCostText.value);
- if (referenceCost === undefined) {
- Message.warning("价格必须是合法的非负元金额,最多两位小数");
- return false;
- }
if (form.stockEnabled && !normalizeProductQuantity(minStockQuantityText.value || "0")) {
Message.warning("最低库存必须是非负数量,最多三位小数");
return false;
@@ -377,10 +418,6 @@ function validate(): boolean {
Message.warning("基础单位数量必须为 1");
return false;
}
- if (name !== form.baseUnit.trim()) {
- Message.warning("基础单位名称必须与产品基础单位一致");
- return false;
- }
}
}
if (baseCount !== 1) {
@@ -404,11 +441,9 @@ async function save(): Promise {
code: form.code.trim(),
name: form.name.trim(),
productType: form.productType,
- baseUnit: form.baseUnit.trim(),
stockEnabled: form.stockEnabled,
allowDecimalQuantity: form.allowDecimalQuantity,
status: form.status,
- referenceCost: parseOptionalAmount(referenceCostText.value)!,
minStockQuantity: form.stockEnabled ? minStockQuantity : null,
remark: form.remark?.trim() || null,
attachmentList: buildAttachmentList(),
@@ -456,7 +491,6 @@ async function load(): Promise {
code: result.code || "",
name: result.name || "",
productType: result.productType || "GOODS",
- baseUnit: result.baseUnit || "",
stockEnabled: !!result.stockEnabled,
allowDecimalQuantity: !!result.allowDecimalQuantity,
status: result.status || "ACTIVE",
@@ -471,7 +505,6 @@ async function load(): Promise {
previewUrl: getAttachmentReadURL(item.id || ""),
url: getAttachmentReadURL(item.id || "", 90)
}));
- referenceCostText.value = result.referenceCost === null || result.referenceCost === undefined ? "" : `${Math.floor(result.referenceCost / 100)}.${String(result.referenceCost % 100).padStart(2, "0")}`;
minStockQuantityText.value = result.minStockQuantity === null || result.minStockQuantity === undefined ? "" : String(result.minStockQuantity);
if (!form.unitList.length) {
addUnit();
@@ -508,6 +541,24 @@ onUnmounted(() => navBarStore.clearRight());
overflow: hidden;
}
+ .units {
+ padding: 1rem 0;
+
+ .unit {
+ gap: .5rem;
+ border: 1px dashed var(--td-component-border);
+ padding: .5rem 0;
+ margin-bottom: .75rem;
+ border-radius: 1rem;
+
+ .header {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ }
+ }
+ }
+
.unit-list {
padding: 1rem;
diff --git a/src/pages/product/ProductList.vue b/src/pages/product/ProductList.vue
index e50e1b2..bc87616 100644
--- a/src/pages/product/ProductList.vue
+++ b/src/pages/product/ProductList.vue
@@ -81,7 +81,6 @@ import NavBarActionMenu from "@/components/NavBarActionMenu.vue";
import { useNavBarStore } from "@/store/navBarStore";
import type { NavBarAction } from "@/types/NavBarAction";
import type { Product, ProductCategory, ProductStatus, ProductType } from "@/types/Product";
-import { getAttachmentReadURL } from "@/utils/attachment";
import { getErrorMessage } from "@/utils/error";
import { getProductPhotoURL, getProductStatusText, getProductStatusTheme, getProductTypeText } from "@/utils/product";
import { Message } from "@/utils/message";
diff --git a/src/pages/product/ProductStockDetail.vue b/src/pages/product/ProductStockDetail.vue
index 6c0fde0..7b9e1df 100644
--- a/src/pages/product/ProductStockDetail.vue
+++ b/src/pages/product/ProductStockDetail.vue
@@ -10,13 +10,13 @@
-
+
-
+
@@ -43,7 +43,7 @@
-
+
@@ -72,7 +72,7 @@ import ProductStockOperationDialog from "@/pages/product/ProductStockOperationDi
import { useNavBarStore } from "@/store/navBarStore";
import type { Product, ProductStock, StockOperationType, StockRecord } from "@/types/Product";
import { getErrorMessage } from "@/utils/error";
-import { getProductQuantityText, getStockOperationText } from "@/utils/product";
+import { getProductBaseUnitName, getProductQuantityText, getStockOperationText } from "@/utils/product";
import { Message } from "@/utils/message";
import { permissionCodes } from "@/utils/permission";
diff --git a/src/pages/product/ProductStockList.vue b/src/pages/product/ProductStockList.vue
index 0c983b5..27a4312 100644
--- a/src/pages/product/ProductStockList.vue
+++ b/src/pages/product/ProductStockList.vue
@@ -13,7 +13,7 @@