@pisell/pisellos
Version:
一个可扩展的前端模块化SDK框架,支持插件系统
126 lines (118 loc) • 7.1 kB
JavaScript
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
/**
* 检测商品库存是否足够
*
* 只有同时满足以下条件时才会进行库存检测:
* - is_track 开启(值为 1 或 true)
* - over_sold 为 0(不允许超卖)
*
* 对于多规格商品:
* - 如果有 product_variant_id,则从 productData.variant 数组中查找对应规格
* - 使用规格的 is_track, over_sold, stock_quantity 而不是主商品的
*
* @param productData 商品数据(需包含 is_track, over_sold, stock_quantity 字段,多规格商品需包含 variant 数组)
* @param product_variant_id 商品变体ID,如果存在则为多规格商品
* @param quantity 需要添加的数量
* @param bundle 套餐配置(子商品需包含 is_track, over_sold, stock_quantity 字段)
* @param currentCartItems 当前购物车商品列表
* @returns 库存检测结果
*/
export function checkProductStock(_ref) {
var productData = _ref.productData,
product_variant_id = _ref.product_variant_id,
quantity = _ref.quantity,
bundle = _ref.bundle,
currentCartItems = _ref.currentCartItems;
// 1. 检测主商品库存
// 处理多规格商品:如果有product_variant_id,则从variant数组中查找对应的规格配置
var mainProductConfig = productData;
if (product_variant_id && productData.variant && Array.isArray(productData.variant)) {
var variant = productData.variant.find(function (v) {
return v.id === product_variant_id;
});
if (variant) {
mainProductConfig = variant; // 使用规格的配置替换主商品配置
}
}
// 只有开启库存控制且不允许超卖时才需要检测主商品库存
var isMainProductTrackingEnabled = mainProductConfig.is_track === 1 || mainProductConfig.is_track === true;
var isMainProductOverSoldDisabled = mainProductConfig.over_sold === 0;
if (isMainProductTrackingEnabled && isMainProductOverSoldDisabled) {
var existingQuantity = currentCartItems.reduce(function (total, cartItem) {
var _cartItem$_productOri, _cartItem$_productOri2, _cartItem$_productOri3;
// 检查是否为相同商品(比较商品ID和变体ID)
var isSameProduct = ((_cartItem$_productOri = cartItem._productOrigin) === null || _cartItem$_productOri === void 0 ? void 0 : _cartItem$_productOri.id) === productData.id;
var isSameVariant = !product_variant_id && !((_cartItem$_productOri2 = cartItem._productOrigin) !== null && _cartItem$_productOri2 !== void 0 && _cartItem$_productOri2.product_variant_id) || ((_cartItem$_productOri3 = cartItem._productOrigin) === null || _cartItem$_productOri3 === void 0 ? void 0 : _cartItem$_productOri3.product_variant_id) === product_variant_id;
if (isSameProduct && isSameVariant) {
return total + (cartItem.num || 0);
}
return total;
}, 0);
var totalQuantity = existingQuantity + quantity;
var stockQuantity = mainProductConfig.stock_quantity;
// 检查主商品库存是否足够
if (stockQuantity !== undefined && stockQuantity !== null && totalQuantity > stockQuantity) {
return {
success: false,
errorCode: 'not_enough_stock'
};
}
}
// 2. 检测套餐商品库存
if (bundle && Array.isArray(bundle)) {
// 直接遍历套餐商品数组
var _iterator = _createForOfIteratorHelper(bundle),
_step;
try {
var _loop = function _loop() {
var bundleItem = _step.value;
var bundleProductId = bundleItem.bundle_product_id;
var bundleStockQuantity = bundleItem.stock_quantity;
var bundleRequiredQuantity = (bundleItem.num || 1) * quantity; // 子商品需求数量 = 子商品配置数量 * 主商品购买数量
// 检查套餐子商品是否需要进行库存控制
var isBundleTrackingEnabled = bundleItem.is_track === 1 || bundleItem.is_track === true;
var isBundleOverSoldDisabled = bundleItem.over_sold === 0;
// 跳过没有开启库存控制或允许超卖的子商品
if (!isBundleTrackingEnabled || !isBundleOverSoldDisabled) return 0; // continue
// 跳过没有库存配置的子商品
if (bundleStockQuantity === undefined || bundleStockQuantity === null) return 0; // continue
// 计算购物车中已有的相同子商品数量
var existingBundleQuantity = currentCartItems.reduce(function (total, cartItem) {
// 检查购物车中商品的套餐配置
if (!cartItem._bundleOrigin || !Array.isArray(cartItem._bundleOrigin)) return total;
cartItem._bundleOrigin.forEach(function (cartBundleItem) {
if (cartBundleItem.bundle_product_id === bundleProductId) {
total += (cartBundleItem.num || 1) * (cartItem.num || 1);
}
});
return total;
}, 0);
var totalBundleQuantity = existingBundleQuantity + bundleRequiredQuantity;
// 检查子商品库存是否足够
if (totalBundleQuantity > bundleStockQuantity) {
return {
v: {
success: false,
errorCode: 'not_enough_stock'
}
};
}
},
_ret;
for (_iterator.s(); !(_step = _iterator.n()).done;) {
_ret = _loop();
if (_ret === 0) continue;
if (_ret) return _ret.v;
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
}
return {
success: true
};
}