@pisell/pisellos
Version:
一个可扩展的前端模块化SDK框架,支持插件系统
292 lines (290 loc) • 9.97 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/server/utils/product.ts
var product_exports = {};
__export(product_exports, {
applyDetailValueToProducts: () => applyDetailValueToProducts,
applyI18nToProducts: () => applyI18nToProducts,
applyPriceDataToProducts: () => applyPriceDataToProducts,
getIsSessionProduct: () => getIsSessionProduct,
perfMark: () => perfMark
});
module.exports = __toCommonJS(product_exports);
var import_utils = require("../modules/schedule/utils");
var import_utils2 = require("../../modules/Cart/utils");
function perfMark(label, durationMs, meta) {
try {
const w = typeof window !== "undefined" ? window : typeof globalThis !== "undefined" ? globalThis : null;
if (!w)
return;
if (!w.__PERF__)
w.__PERF__ = { records: [] };
w.__PERF__.records.push({ label, duration: Math.round(durationMs * 100) / 100, ts: Date.now(), ...meta });
} catch {
}
}
function buildPriceIndexMap(priceData) {
const priceMap = new Map(
priceData.map((p) => [p.id, p])
);
const variantMap = /* @__PURE__ */ new Map();
priceData.forEach((p) => {
if (p.variant && p.variant.length > 0) {
const variantById = new Map(p.variant.map((v) => [v.id, v]));
variantMap.set(p.id, variantById);
}
});
const bundleMap = /* @__PURE__ */ new Map();
priceData.forEach((p) => {
if (p.bundle_group && p.bundle_group.length > 0) {
const groupMap = /* @__PURE__ */ new Map();
p.bundle_group.forEach((bg) => {
const itemMap = new Map((bg.bundle_item || []).map((bi) => [bi.id, bi]));
groupMap.set(bg.id, itemMap);
});
bundleMap.set(p.id, groupMap);
}
});
return { priceMap, variantMap, bundleMap };
}
function applyPriceDataToProducts(products, priceData) {
const t0 = performance.now();
if (!priceData || priceData.length === 0) {
console.log("[applyPriceDataToProducts] 没有价格数据,返回原商品");
return products;
}
const t1 = performance.now();
const { priceMap, variantMap, bundleMap } = buildPriceIndexMap(priceData);
perfMark("buildPriceIndexMap", performance.now() - t1, { priceCount: priceData.length });
const t2 = performance.now();
const updatedProducts = products.map((product) => {
const priceInfo = priceMap.get(product.id);
if (!priceInfo) {
return product;
}
const updatedProduct = { ...product };
updatedProduct.price = priceInfo.price;
updatedProduct.base_price = priceInfo.base_price;
if (updatedProduct.variant && updatedProduct.variant.length > 0) {
const productVariantMap = variantMap.get(product.id);
if (productVariantMap) {
updatedProduct.variant = updatedProduct.variant.map((v) => {
const priceVariant = productVariantMap.get(v.id);
if (priceVariant) {
return {
...v,
price: String(priceVariant.price),
base_price: String(priceVariant.base_price)
};
}
return v;
});
}
}
if (updatedProduct.bundle_group && updatedProduct.bundle_group.length > 0) {
const productBundleMap = bundleMap.get(product.id);
if (productBundleMap) {
updatedProduct.bundle_group = updatedProduct.bundle_group.map(
(bg) => {
const groupItemMap = productBundleMap.get(bg.id);
if (!groupItemMap)
return bg;
return {
...bg,
bundle_item: bg.bundle_item.map((bi) => {
const priceBi = groupItemMap.get(bi.id);
if (priceBi) {
let price = priceBi.price;
return {
...bi,
price: String(price),
base_price: String(priceBi.base_price)
};
}
return bi;
})
};
}
);
}
}
return updatedProduct;
});
perfMark("applyPriceDataToProducts.mapProducts", performance.now() - t2, { count: products.length });
perfMark("applyPriceDataToProducts", performance.now() - t0, {
productCount: products.length,
priceCount: priceData.length
});
return updatedProducts;
}
var getIsSessionProduct = (product) => {
return ["session_product", "session_ticket"].includes(product.extension_type);
};
var getIsOpenDetailModal = (product, context) => {
const isBundleProduct = product.bundle_group_count > 0;
const isOptionProduct = product.option_group_count > 0;
const isVariantProduct = product.is_variant > 0;
const isSessionProduct = getIsSessionProduct(product);
let scheduleTimeSlots = [];
if (isSessionProduct && product["schedule.ids"] && context.scheduleModule) {
const scheduleIds = product["schedule.ids"];
const productSchedules = context.scheduleModule.getScheduleByIds(scheduleIds);
scheduleTimeSlots = (0, import_utils.getScheduleStartEndTimePoints)(
context.schedule_date,
productSchedules
);
}
const isOpenDetailModal = isBundleProduct || isOptionProduct || isVariantProduct || scheduleTimeSlots.length > 1;
return {
isOpenDetailModal,
scheduleTimeSlots
};
};
var I18N_FIELD_MAP = {
title_i18n: "title",
subtitle_i18n: "subtitle",
description_i18n: "description",
cover_i18n: "cover"
};
function applyI18nToProducts(products, locale) {
if (!locale)
return products;
return products.map((product) => {
let patched = null;
for (const [i18nKey, originalKey] of Object.entries(I18N_FIELD_MAP)) {
const i18nDict = product[i18nKey];
if (!i18nDict)
continue;
const localizedValue = i18nDict[locale];
if (localizedValue) {
if (!patched)
patched = { ...product };
patched[originalKey] = localizedValue;
}
}
return patched ?? product;
});
}
var formatDataKey = (data) => {
var _a, _b, _c, _d;
const _data = {
...data
};
let key = `${_data.product_id}`;
let rowKey = key;
if (_data.product_variant_id) {
let str = `_${_data.product_variant_id}`;
key += str;
rowKey += str;
}
if ((_a = _data == null ? void 0 : _data.option) == null ? void 0 : _a.length) {
for (const item of _data.option) {
let str = `_${item.option_group_id}_${item.product_option_item_id}`;
key += str;
rowKey += `${str}_${item.quantity || item.num}`;
}
}
if ((_b = _data == null ? void 0 : _data.bundle) == null ? void 0 : _b.length) {
for (const item of _data.bundle) {
let str = `_${item.group_id}_${item.bundle_product_id}`;
key += str;
rowKey += `${str}_${item.quantity || item.num}`;
if (item == null ? void 0 : item.option) {
for (const opt of item.option) {
let str2 = `_${opt.option_group_id}_${opt.product_option_item_id}`;
key += str2;
rowKey += `${str2}_${opt.quantity || opt.num}`;
}
}
}
}
if (_data == null ? void 0 : _data.session) {
let str = `_${(_c = _data == null ? void 0 : _data.session) == null ? void 0 : _c.key}`;
key += str;
rowKey += str;
}
if (_data == null ? void 0 : _data.schedule) {
let str = `_${(_d = _data == null ? void 0 : _data.schedule) == null ? void 0 : _d.key}`;
key += str;
rowKey += str;
}
_data.key = key;
_data.rowKey = rowKey;
return _data;
};
var genCartDetailValue = (product, scheduleTimeSlots) => {
const params = {
product_id: product == null ? void 0 : product.id,
option: [],
bundle: [],
product_variant_id: 0,
quantity: 1,
unique: (0, import_utils2.getUniqueId)(),
session: null
};
if (scheduleTimeSlots.length) {
params.session = scheduleTimeSlots.map((item) => ({
...item,
unique: (0, import_utils2.getUniqueId)()
}))[0];
}
if (product == null ? void 0 : product.service_times) {
params.service_times = product == null ? void 0 : product.service_times;
}
if (product == null ? void 0 : product.machine_code) {
params.machine_code = product.machine_code;
}
if (product == null ? void 0 : product["schedule.ids"]) {
params.schedule_id = product["schedule.ids"];
}
if (product == null ? void 0 : product.policy) {
params.policy_id = product == null ? void 0 : product.policy;
}
if (product == null ? void 0 : product.duration) {
params.duration = product.duration;
}
return formatDataKey(params);
};
function applyDetailValueToProducts(products, context) {
const t0 = performance.now();
const newProducts = products.map((product) => {
const { isOpenDetailModal, scheduleTimeSlots } = getIsOpenDetailModal(
product,
context
);
let cartDetailValue = null;
if (!isOpenDetailModal) {
cartDetailValue = genCartDetailValue(product, scheduleTimeSlots);
}
return {
...product,
isOpenDetailModal,
cartDetailValue
};
});
perfMark("applyDetailValueToProducts", performance.now() - t0, { count: products.length });
return newProducts;
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
applyDetailValueToProducts,
applyI18nToProducts,
applyPriceDataToProducts,
getIsSessionProduct,
perfMark
});