fix product/sku name

This commit is contained in:
Timi
2026-09-08 14:49:44 +08:00
parent 9fa6527f96
commit cbc8197057
12 changed files with 40 additions and 17 deletions
+5 -2
View File
@@ -14,10 +14,12 @@
<script setup lang="ts"> <script setup lang="ts">
import type { ProductSkuSpecSnapshot } from "@/types/Product"; import type { ProductSkuSpecSnapshot } from "@/types/Product";
import { getProductSkuSnapshotText } from "@/utils/product";
defineOptions({ name: "ProductSkuSnapshotTags" }); defineOptions({ name: "ProductSkuSnapshotTags" });
interface Props { interface Props {
productName?: string | null;
snapshot?: ProductSkuSpecSnapshot[]; snapshot?: ProductSkuSpecSnapshot[];
fallback?: string; fallback?: string;
unit?: string | null; unit?: string | null;
@@ -30,10 +32,11 @@ const tagList = computed(() => {
const content = item.specValueName?.trim() || item.specName?.trim(); const content = item.specValueName?.trim() || item.specName?.trim();
return content ? [{ key: `${item.specId || "spec"}-${item.specValueId || index}`, content }] : []; return content ? [{ key: `${item.specId || "spec"}-${item.specValueId || index}`, content }] : [];
}); });
if (result.length || !props.fallback?.trim()) { const fallback = getProductSkuSnapshotText(props.productName, props.fallback);
if (result.length || !fallback) {
return result; return result;
} }
return [{ key: "fallback", content: props.fallback.trim() }]; return [{ key: "fallback", content: fallback }];
}); });
const unitText = computed(() => props.unit?.trim() || ""); const unitText = computed(() => props.unit?.trim() || "");
</script> </script>
@@ -40,8 +40,9 @@
:content="item.skuCodeSnapshot" :content="item.skuCodeSnapshot"
/> />
<product-sku-snapshot-tags <product-sku-snapshot-tags
:product-name="item.productNameSnapshot"
:snapshot="item.skuSpecSnapshot" :snapshot="item.skuSpecSnapshot"
:fallback="item.skuNameSnapshot || item.specSummarySnapshot" :fallback="item.specSummarySnapshot || item.skuNameSnapshot"
:unit="item.unitSnapshot" :unit="item.unitSnapshot"
/> />
</div> </div>
@@ -36,8 +36,9 @@
<template #description> <template #description>
<div class="item-description"> <div class="item-description">
<product-sku-snapshot-tags <product-sku-snapshot-tags
:product-name="item.productNameSnapshot"
:snapshot="item.skuSpecSnapshot" :snapshot="item.skuSpecSnapshot"
:fallback="item.skuNameSnapshot || item.specSummarySnapshot || '默认 SKU'" :fallback="item.specSummarySnapshot || item.skuNameSnapshot || '默认 SKU'"
:unit="item.unitSnapshot" :unit="item.unitSnapshot"
/> />
<span v-text="`履约数量 ${item.quantity || 0}`" /> <span v-text="`履约数量 ${item.quantity || 0}`" />
@@ -39,8 +39,9 @@
<span v-text="`× ${getPackageQuantityText(item.quantity)}`" /> <span v-text="`× ${getPackageQuantityText(item.quantity)}`" />
</div> </div>
<product-sku-snapshot-tags <product-sku-snapshot-tags
:product-name="item.productNameSnapshot"
:snapshot="item.skuSpecSnapshot" :snapshot="item.skuSpecSnapshot"
:fallback="item.skuNameSnapshot || item.specSummarySnapshot || '默认 SKU'" :fallback="item.specSummarySnapshot || item.skuNameSnapshot || '默认 SKU'"
:unit="item.unitSnapshot" :unit="item.unitSnapshot"
/> />
</div> </div>
+2 -2
View File
@@ -89,7 +89,7 @@ import { getErrorMessage } from "@/utils/error";
import { formatPackageAmount, getPackageConfigStatusText } from "@/utils/package"; import { formatPackageAmount, getPackageConfigStatusText } from "@/utils/package";
import { Message } from "@/utils/message"; import { Message } from "@/utils/message";
import { gaoRoleCodes, permissionCodes } from "@/utils/permission"; import { gaoRoleCodes, permissionCodes } from "@/utils/permission";
import { getProductPhotoURL as getProductPhotoUrl } from "@/utils/product"; import { getProductPhotoURL as getProductPhotoUrl, getProductSkuSnapshotText } from "@/utils/product";
defineOptions({ name: "PackageConfigDetail" }); defineOptions({ name: "PackageConfigDetail" });
@@ -117,7 +117,7 @@ function getItemPhotoURL(item: PackageConfigItem): string {
} }
function getItemTitle(item: PackageConfigItem): string { function getItemTitle(item: PackageConfigItem): string {
const skuText = item.skuNameSnapshot || item.specSummarySnapshot; const skuText = getProductSkuSnapshotText(item.productNameSnapshot, item.skuNameSnapshot, item.specSummarySnapshot);
return `${item.productNameSnapshot || "未命名产品"}${skuText ? ` · ${skuText}` : ""}`; return `${item.productNameSnapshot || "未命名产品"}${skuText ? ` · ${skuText}` : ""}`;
} }
+2 -1
View File
@@ -93,6 +93,7 @@ import { getErrorMessage } from "@/utils/error";
import { formatPackageAmount, getPackageConfigStatusText, getPackageQuantityText } from "@/utils/package"; import { formatPackageAmount, getPackageConfigStatusText, getPackageQuantityText } from "@/utils/package";
import { Message } from "@/utils/message"; import { Message } from "@/utils/message";
import { permissionCodes } from "@/utils/permission"; import { permissionCodes } from "@/utils/permission";
import { getProductSkuSnapshotText } from "@/utils/product";
defineOptions({ name: "PackageConfigList" }); defineOptions({ name: "PackageConfigList" });
@@ -193,7 +194,7 @@ function getStatusTheme(statusValue?: PackageConfigStatus): "success" | "warning
function getProductRightText(item: PackageConfigItem): string { function getProductRightText(item: PackageConfigItem): string {
const quantity = getPackageQuantityText(item.defaultQuantity); const quantity = getPackageQuantityText(item.defaultQuantity);
const skuText = item.skuNameSnapshot || item.specSummarySnapshot; const skuText = getProductSkuSnapshotText(item.productNameSnapshot, item.skuNameSnapshot, item.specSummarySnapshot);
return `${item.productNameSnapshot || "未命名产品"}${skuText ? ` · ${skuText}` : ""} × ${quantity}${item.unitSnapshot ? ` ${item.unitSnapshot}` : ""}`; return `${item.productNameSnapshot || "未命名产品"}${skuText ? ` · ${skuText}` : ""} × ${quantity}${item.unitSnapshot ? ` ${item.unitSnapshot}` : ""}`;
} }
+7 -2
View File
@@ -237,7 +237,7 @@ import { formatPackageAmount } from "@/utils/package";
import { Message } from "@/utils/message"; import { Message } from "@/utils/message";
import { permissionCodes } from "@/utils/permission"; import { permissionCodes } from "@/utils/permission";
import { uploadPhotoList } from "@/utils/photo"; import { uploadPhotoList } from "@/utils/photo";
import { getProductPhotoURL } from "@/utils/product"; import { getProductPhotoURL, getProductSkuSnapshotText } from "@/utils/product";
defineOptions({ defineOptions({
name: "PackagePurchase" name: "PackagePurchase"
@@ -407,7 +407,12 @@ const {
function getItemLabel(item: PackagePurchaseItem): string { function getItemLabel(item: PackagePurchaseItem): string {
const configItem = config.value?.itemList?.find(configItem => configItem.skuId === item.skuId && configItem.skuUnitId === item.skuUnitId); const configItem = config.value?.itemList?.find(configItem => configItem.skuId === item.skuId && configItem.skuUnitId === item.skuUnitId);
return configItem ? `${configItem.productNameSnapshot || "未命名产品"} · ${configItem.skuNameSnapshot || configItem.specSummarySnapshot || "默认 SKU"}` : "产品权益"; if (!configItem) {
return "产品权益";
}
const productName = configItem.productNameSnapshot || "未命名产品";
const skuText = getProductSkuSnapshotText(productName, configItem.skuNameSnapshot, configItem.specSummarySnapshot);
return skuText ? `${productName} · ${skuText}` : productName;
} }
function getItemName(item: PackagePurchaseItem): string { function getItemName(item: PackagePurchaseItem): string {
@@ -7,8 +7,9 @@
<h2 v-text="record.productNameSnapshot || '未命名产品'" /> <h2 v-text="record.productNameSnapshot || '未命名产品'" />
<product-sku-snapshot-tags <product-sku-snapshot-tags
class="sku" class="sku"
:product-name="record.productNameSnapshot"
:snapshot="record.skuSpecSnapshot" :snapshot="record.skuSpecSnapshot"
:fallback="record.skuNameSnapshot || record.specSummarySnapshot || '默认 SKU'" :fallback="record.specSummarySnapshot || record.skuNameSnapshot || '默认 SKU'"
:unit="record.unitSnapshot" :unit="record.unitSnapshot"
/> />
<div class="meta"> <div class="meta">
+2 -1
View File
@@ -56,8 +56,9 @@
<div class="description"> <div class="description">
<strong v-text="record.productNameSnapshot || '未命名产品'" /> <strong v-text="record.productNameSnapshot || '未命名产品'" />
<product-sku-snapshot-tags <product-sku-snapshot-tags
:product-name="record.productNameSnapshot"
:snapshot="record.skuSpecSnapshot" :snapshot="record.skuSpecSnapshot"
:fallback="record.skuNameSnapshot || record.specSummarySnapshot || '默认 SKU'" :fallback="record.specSummarySnapshot || record.skuNameSnapshot || '默认 SKU'"
:unit="record.unitSnapshot" :unit="record.unitSnapshot"
/> />
<pass-time-label :timestamp="record.occurredAt" underline /> <pass-time-label :timestamp="record.occurredAt" underline />
+2 -1
View File
@@ -118,8 +118,9 @@
:content="item.skuCodeSnapshot" :content="item.skuCodeSnapshot"
/> />
<product-sku-snapshot-tags <product-sku-snapshot-tags
:product-name="item.productNameSnapshot"
:snapshot="item.skuSpecSnapshot" :snapshot="item.skuSpecSnapshot"
:fallback="item.skuNameSnapshot || item.specSummarySnapshot" :fallback="item.specSummarySnapshot || item.skuNameSnapshot"
:unit="item.unitSnapshot" :unit="item.unitSnapshot"
/> />
</div> </div>
@@ -92,6 +92,7 @@ import type { GaoSalesPaymentStatus, SalesOrder } from "@/types/SalesOrder";
import { getCustomerPhotoURL } from "@/utils/customer"; import { getCustomerPhotoURL } from "@/utils/customer";
import { formatPackageAmount, getPackageQuantityText } from "@/utils/package"; import { formatPackageAmount, getPackageQuantityText } from "@/utils/package";
import { getSalesOrderStatusText, getSalesOrderTypeText, getSalesPaymentStatusText, getStatusTheme } from "@/utils/salesOrder"; import { getSalesOrderStatusText, getSalesOrderTypeText, getSalesPaymentStatusText, getStatusTheme } from "@/utils/salesOrder";
import { getProductSkuSnapshotText } from "@/utils/product";
defineOptions({ name: "SalesOrderListCell" }); defineOptions({ name: "SalesOrderListCell" });
@@ -143,7 +144,7 @@ function sumProductQuantity(field: "quantity" | "fulfilledQuantity"): string {
} }
function getProductText(item: NonNullable<SalesOrder["itemList"]>[number]): string { function getProductText(item: NonNullable<SalesOrder["itemList"]>[number]): string {
const skuText = item.skuNameSnapshot || item.specSummarySnapshot; const skuText = getProductSkuSnapshotText(item.productNameSnapshot, item.skuNameSnapshot, item.specSummarySnapshot);
return `${item.productNameSnapshot || "未命名产品"}${skuText ? ` · ${skuText}` : ""}${item.unitSnapshot ? ` / ${item.unitSnapshot}` : ""}`; return `${item.productNameSnapshot || "未命名产品"}${skuText ? ` · ${skuText}` : ""}${item.unitSnapshot ? ` / ${item.unitSnapshot}` : ""}`;
} }
</script> </script>
+9 -2
View File
@@ -103,8 +103,15 @@ export function getProductBaseUnitName(sku?: ProductSku): string {
/** 组合产品名、SKU 名称和规格摘要,供选品后的业务页面统一展示。 */ /** 组合产品名、SKU 名称和规格摘要,供选品后的业务页面统一展示。 */
export function getProductSkuText(productName: string | undefined, sku?: Pick<ProductSku, "name" | "specSummary">): string { export function getProductSkuText(productName: string | undefined, sku?: Pick<ProductSku, "name" | "specSummary">): string {
const skuText = sku?.specSummary || sku?.name; const skuText = getProductSkuSnapshotText(productName, sku?.name, sku?.specSummary);
return skuText && skuText !== productName ? `${productName || "未命名产品"} · ${skuText}` : productName || "未命名产品"; return skuText ? `${productName || "未命名产品"} · ${skuText}` : productName || "未命名产品";
}
/** 获取 SKU 快照的独立展示文本;默认 SKU 与产品同名时不重复展示。 */
export function getProductSkuSnapshotText(productName?: string | null, skuName?: string | null, specSummary?: string | null): string {
const productText = productName?.trim() || "";
const skuText = specSummary?.trim() || skuName?.trim() || "";
return skuText && skuText !== productText ? skuText : "";
} }
export type ProductSkuSpecEntry = { export type ProductSkuSpecEntry = {