137 lines
6.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

export const STORAGE_KEYS = {
brands: 'pdd_pricing_brand_configs_v1',
};
// 比例类字段默认值(小数存储,页面以百分比展示)
export const PLATFORM_COMMISSION_RATES = Object.freeze({
standard: 0.015,
blackLabel: 0.06,
});
export const getPlatformCommissionRate = (isBlackLabelShop) => (
isBlackLabelShop ? PLATFORM_COMMISSION_RATES.blackLabel : PLATFORM_COMMISSION_RATES.standard
);
export const inferBlackLabelShop = (rows = []) => {
const commission = rows
.map((row) => row?.commission ?? row?.savedPricing?.commission)
.map((value) => toFiniteNumber(value))
.find((value) => value !== null);
return commission !== undefined
&& Math.abs(commission - PLATFORM_COMMISSION_RATES.blackLabel) < 1e-9;
};
export const DEFAULT_RATES = {
commission: PLATFORM_COMMISSION_RATES.standard, // 平台佣金:黑标店铺 6% / 非黑标 1.5%
adFee: 0.025, // 营销广告费
seeding: 0.005, // 种菜占比
afterSale: 0.05, // 售后费用
insurance: 0.05, // 保险费
brandFee: 0, // 品牌使用费:默认 0,按条码前缀自动判断(见 deriveBrandFromBarcode)
targetMargin: 0.15, // 营业利润率(目标值)
};
// 条码前缀规则:GBGJ- 顾家(品牌使用费 7%)、GBSFY- 索菲亚(6%)、其余简尚(0)
export const BARCODE_BRAND_RULES = [
{ prefix: 'GBGJ-', brand: '顾家', brandFee: 0.07 },
{ prefix: 'GBSFY-', brand: '索菲亚', brandFee: 0.06 },
];
export const deriveBrandFromBarcode = (barcode) => {
const code = String(barcode || '').trim().toUpperCase();
const matched = BARCODE_BRAND_RULES.find((rule) => code.startsWith(rule.prefix));
return matched
? { brand: matched.brand, brandFee: matched.brandFee }
: { brand: '简尚', brandFee: 0 };
};
// 系统兜底默认值(运营未保存个性化默认值配置时使用,见 DefaultsConfigModal)
export const SYSTEM_DEFAULTS = {
coupon: 20, // 优惠券金额
activityDiscount: 0.6, // 活动折扣(即 6 折)
installFee: 0, // 安装费
targetMargin: 0.15, // 营业利润率
};
export const SOURCE_LABELS = {
getJstSkusBySpu: '聚水潭实时接口',
};
export const formatSourceLabel = (source) => {
if (!source) return '-';
return SOURCE_LABELS[source] || `本地快照(${source})`;
};
export const createRowId = () => `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
const toFiniteNumber = (value) => {
if (value === null || value === undefined || value === '') return null;
const num = Number(value);
return Number.isFinite(num) ? num : null;
};
/**
* 由 SPU 条码行生成测算行:
* 条码/图片/尺寸/颜色/成本/公司限价自动填入;运费优先取运费画像的全国运费;
* 售后占比优先取画像值;到手价默认取公司限价(无限价时取成本价的 2 倍,均可改);
* 品牌与品牌使用费按条码前缀自动判断(GBGJ- 顾家 7% / GBSFY- 索菲亚 6% / 其余简尚 0)。
*/
export const createRowFromSku = (sku, { freightProfile, defaults, commission } = {}) => {
const minimumPrices = freightProfile?.minimumPricesBySku || {};
const freightMinimum = minimumPrices[sku.skuCode]
?? minimumPrices[String(sku.skuCode || '').toUpperCase()]
?? minimumPrices[String(sku.skuCode || '').toLowerCase()];
const { brand, brandFee } = deriveBrandFromBarcode(sku.skuCode);
const priceLimit = toFiniteNumber(freightMinimum ?? sku.minimumPrice);
const cost = toFiniteNumber(sku.cost);
return {
id: createRowId(),
barcode: sku.skuCode || '',
skuStatus: sku.status || '',
stock: toFiniteNumber(sku.stock),
stockWarehouses: Array.isArray(sku.stockWarehouses) ? sku.stockWarehouses : [],
originalSkuName: sku.savedPricing?.originalSkuName || sku.name || '',
selectedSkuName: sku.savedPricing?.selectedSkuName || sku.name || '',
name: sku.savedPricing?.selectedSkuName || sku.name || '',
internalProductCode: sku.savedPricing?.internalProductCode || '',
productCodeProductName: sku.savedPricing?.productCodeProductName || '',
productCodeColorSpec: sku.savedPricing?.productCodeColorSpec || '',
imageUrl: sku.image || '',
size: sku.size || '',
color: sku.color || '',
supplier: sku.supplier || '',
category: sku.category || '',
lengthCm: toFiniteNumber(sku.lengthCm),
widthCm: toFiniteNumber(sku.widthCm),
heightCm: toFiniteNumber(sku.heightCm),
weight: toFiniteNumber(sku.weight),
brand,
companyPriceLimit: priceLimit,
salePrice: toFiniteNumber(sku.salePrice),
price: toFiniteNumber(sku.savedPricing?.price)
?? toFiniteNumber(sku.savedPricing?.groupPrice) // 早期自动上架只存了拼单价,兜底还原为到手价
?? priceLimit
?? (cost === null ? null : cost * 2), // L 到手价(默认取公司限价,无限价时取成本价的 2 倍,可改)
// 默认值优先级:选品已存价 > 用户个性化配置 > 系统默认(券 20 / 折扣 0.6 / 安装费 0 / 利润率 15%)
installFee: toFiniteNumber(sku.savedPricing?.installFee) ?? toFiniteNumber(defaults?.installFee) ?? 0,
coupon: toFiniteNumber(sku.savedPricing?.coupon) ?? toFiniteNumber(defaults?.coupon) ?? 20,
activityDiscount: toFiniteNumber(sku.savedPricing?.activityDiscount) ?? toFiniteNumber(defaults?.activityDiscount) ?? 0.6,
cost, // N 成本
// O 运费:优先取接口按条码返回的全国平均运费(qgyf),其次运费画像的全国运费
shipping: toFiniteNumber(sku.savedPricing?.shipping)
?? toFiniteNumber(sku.freight)
?? toFiniteNumber(freightProfile?.nationalFreight),
...DEFAULT_RATES,
commission: toFiniteNumber(commission)
?? toFiniteNumber(sku.savedPricing?.commission)
?? DEFAULT_RATES.commission,
adFee: toFiniteNumber(sku.savedPricing?.adFee) ?? DEFAULT_RATES.adFee,
seeding: toFiniteNumber(sku.savedPricing?.seeding) ?? DEFAULT_RATES.seeding,
afterSale: toFiniteNumber(sku.savedPricing?.afterSale) ?? DEFAULT_RATES.afterSale,
insurance: toFiniteNumber(sku.savedPricing?.insurance) ?? DEFAULT_RATES.insurance,
targetMargin: toFiniteNumber(sku.savedPricing?.targetMargin) ?? toFiniteNumber(defaults?.targetMargin) ?? DEFAULT_RATES.targetMargin,
brandFee: toFiniteNumber(sku.savedPricing?.brandFee) ?? brandFee,
};
};