137 lines
6.2 KiB
JavaScript
137 lines
6.2 KiB
JavaScript
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,
|
||
};
|
||
};
|