fix product/sku name
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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}` : ""}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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}` : ""}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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 />
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 = {
|
||||||
|
|||||||
Reference in New Issue
Block a user