@pisell/pisellos
Version:
一个可扩展的前端模块化SDK框架,支持插件系统
365 lines (363 loc) • 11.2 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/solution/Checkout/utils/index.ts
var utils_exports = {};
__export(utils_exports, {
calculateTotalAmount: () => calculateTotalAmount,
createCheckoutError: () => createCheckoutError,
debounce: () => debounce,
deepClone: () => deepClone,
extractAmountFromCartSummary: () => extractAmountFromCartSummary,
formatAmount: () => formatAmount,
formatDateTime: () => formatDateTime,
generateLocalOrderId: () => generateLocalOrderId,
generateOrderId: () => generateOrderId,
getErrorMessage: () => getErrorMessage,
isCashPayment: () => isCashPayment,
isEmpty: () => isEmpty,
isProduction: () => isProduction,
isValidPaymentMethodCode: () => isValidPaymentMethodCode,
isVirtualOrderId: () => isVirtualOrderId,
logger: () => logger,
retry: () => retry,
safeJsonParse: () => safeJsonParse,
shouldSyncOrderForPayment: () => shouldSyncOrderForPayment,
throttle: () => throttle,
validateAmount: () => validateAmount,
validateCheckoutData: () => validateCheckoutData,
validateLocalOrderData: () => validateLocalOrderData
});
module.exports = __toCommonJS(utils_exports);
var import_types = require("../../../modules/Payment/types");
function validateCheckoutData(params) {
const errors = [];
if (!params.cartItems || params.cartItems.length === 0) {
errors.push("购物车不能为空");
}
if (params.cartItems) {
params.cartItems.forEach((item, index) => {
if (!item.id) {
errors.push(`购物车商品 ${index + 1} 缺少商品ID`);
}
if (!item.price || parseFloat(String(item.price)) < 0) {
errors.push(`购物车商品 ${index + 1} 价格无效`);
}
if (!item.num || item.num <= 0) {
errors.push(`购物车商品 ${index + 1} 数量无效`);
}
});
}
if (params.orderType && !["virtual", "appointment_booking"].includes(params.orderType)) {
errors.push("订单类型无效,必须是 virtual 或 appointment_booking");
}
if (params.platform && !["pc", "h5"].includes(params.platform)) {
errors.push("平台类型无效,必须是 pc 或 h5");
}
return {
valid: errors.length === 0,
errors
};
}
function createCheckoutError(type, message, details) {
return {
type,
message,
details,
timestamp: Date.now()
};
}
function formatAmount(amount) {
const numAmount = typeof amount === "string" ? parseFloat(amount) : amount;
if (isNaN(numAmount))
return "0.00";
return numAmount.toFixed(2);
}
function validateAmount(amount) {
const numAmount = typeof amount === "string" ? parseFloat(amount) : amount;
return !isNaN(numAmount) && numAmount >= 0;
}
function generateOrderId(prefix = "order") {
const timestamp = Date.now();
const random = Math.floor(Math.random() * 1e4).toString().padStart(4, "0");
return `${prefix}_${timestamp}_${random}`;
}
function isValidPaymentMethodCode(code) {
return typeof code === "string" && code.length > 0 && /^[a-zA-Z0-9_-]+$/.test(code);
}
function safeJsonParse(jsonString, defaultValue) {
try {
return JSON.parse(jsonString);
} catch {
return defaultValue;
}
}
function deepClone(obj) {
if (obj === null || typeof obj !== "object") {
return obj;
}
if (obj instanceof Date) {
return new Date(obj.getTime());
}
if (obj instanceof Array) {
return obj.map((item) => deepClone(item));
}
if (typeof obj === "object") {
const clonedObj = {};
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
clonedObj[key] = deepClone(obj[key]);
}
}
return clonedObj;
}
return obj;
}
function debounce(func, wait) {
let timeout = null;
return (...args) => {
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(() => {
func.apply(null, args);
}, wait);
};
}
function throttle(func, wait) {
let lastTime = 0;
return (...args) => {
const now = Date.now();
if (now - lastTime >= wait) {
lastTime = now;
func.apply(null, args);
}
};
}
async function retry(fn, maxAttempts = 3, delay = 1e3) {
let lastError;
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
try {
return await fn();
} catch (error) {
lastError = error;
if (attempt === maxAttempts) {
throw lastError;
}
await new Promise((resolve) => setTimeout(resolve, delay * attempt));
}
}
throw lastError;
}
function isEmpty(obj) {
if (obj == null)
return true;
if (Array.isArray(obj) || typeof obj === "string")
return obj.length === 0;
if (typeof obj === "object")
return Object.keys(obj).length === 0;
return false;
}
function getErrorMessage(error) {
if (error instanceof Error) {
return error.message;
}
if (typeof error === "string") {
return error;
}
if (error && typeof error === "object" && "message" in error) {
return String(error.message);
}
return "未知错误";
}
function isProduction() {
return process.env.NODE_ENV === "production";
}
var logger = {
info: (message, ...args) => {
console.log(`[Checkout] ${message}`, ...args);
},
warn: (message, ...args) => {
console.warn(`[Checkout] ${message}`, ...args);
},
error: (message, ...args) => {
console.error(`[Checkout] ${message}`, ...args);
},
debug: (message, ...args) => {
if (!isProduction()) {
console.debug(`[Checkout] ${message}`, ...args);
}
}
};
function validateLocalOrderData(orderData) {
var _a;
const errors = [];
if (!orderData.type) {
errors.push("订单类型不能为空");
}
if (!orderData.platform) {
errors.push("平台信息不能为空");
}
if ((!orderData.bookings || orderData.bookings.length === 0) && !((_a = orderData == null ? void 0 : orderData.relation_products) == null ? void 0 : _a.length)) {
errors.push("预订信息不能为空");
}
if (orderData.bookings) {
orderData.bookings.forEach((booking, index) => {
if (!booking.product || !booking.product.product_id) {
errors.push(`预订项 ${index + 1} 缺少商品信息`);
}
if (!booking.start_date) {
errors.push(`预订项 ${index + 1} 缺少开始日期`);
}
if (!booking.start_time) {
errors.push(`预订项 ${index + 1} 缺少开始时间`);
}
});
}
return {
valid: errors.length === 0,
errors
};
}
function generateLocalOrderId() {
const timestamp = Date.now();
const random = Math.floor(Math.random() * 1e4).toString().padStart(4, "0");
return `local_order_${timestamp}_${random}`;
}
function formatDateTime(date) {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, "0");
const day = String(date.getDate()).padStart(2, "0");
const hours = String(date.getHours()).padStart(2, "0");
const minutes = String(date.getMinutes()).padStart(2, "0");
const seconds = String(date.getSeconds()).padStart(2, "0");
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
function extractAmountFromCartSummary(cartSummary) {
const result = {
totalAmount: "0.00",
subTotal: "0.00",
taxAmount: "0.00",
discountAmount: "0.00",
shopDiscountAmount: "0.00",
roundingAmount: "0.00"
};
cartSummary.forEach((item) => {
const value = Number(item.value).toFixed(2);
switch (item.key) {
case "expect_amount":
result.totalAmount = value;
break;
case "sub_total":
result.subTotal = value;
break;
case "tax":
result.taxAmount = value;
if (item.tax) {
result.taxDetails = item.tax;
}
break;
case "discount":
result.discountAmount = value;
break;
case "shop_discount":
result.shopDiscountAmount = value;
break;
case "custom_roundingAmount":
result.roundingAmount = value;
break;
default:
if (item.key.includes("deposit")) {
result.depositAmount = value;
}
break;
}
});
console.log("[Checkout] 从购物车小计提取金额信息:", {
totalAmount: result.totalAmount,
subTotal: result.subTotal,
taxAmount: result.taxAmount,
discountAmount: result.discountAmount,
shopDiscountAmount: result.shopDiscountAmount,
roundingAmount: result.roundingAmount
});
return result;
}
function calculateTotalAmount(cartItems) {
const total = cartItems.reduce((sum, item) => {
const price = parseFloat(String(item.price) || "0");
const quantity = item.quantity || 1;
return sum + price * quantity;
}, 0);
return total.toFixed(2);
}
function isVirtualOrderId(orderId) {
return orderId.startsWith("local_order_");
}
function shouldSyncOrderForPayment(paymentCode, paymentType) {
const codeUpper = (paymentCode == null ? void 0 : paymentCode.toUpperCase()) || "";
const typeUpper = (paymentType == null ? void 0 : paymentType.toUpperCase()) || "";
const cashIdentifiers = ["CASHMANUAL", "CASH", "MANUAL"];
if (cashIdentifiers.some(
(id) => codeUpper.includes(id) || typeUpper.includes(id)
)) {
return false;
}
if (paymentCode === import_types.PaymentMethodType.Cash || paymentType === import_types.PaymentMethodType.Cash) {
return false;
}
if (codeUpper.includes("CUSTOM") || typeUpper.includes("CUSTOM")) {
return false;
}
return true;
}
function isCashPayment(paymentItem) {
var _a, _b, _c;
const codeUpper = ((_a = paymentItem.code) == null ? void 0 : _a.toUpperCase()) || "";
const typeUpper = ((_b = paymentItem.type) == null ? void 0 : _b.toUpperCase()) || "";
const isNameCash = (_c = paymentItem.name) == null ? void 0 : _c.toLowerCase().includes("cash");
const cashIdentifiers = ["CASH", "CASHMANUAL", "MANUAL"];
return cashIdentifiers.some(
(identifier) => codeUpper.includes(identifier) || typeUpper.includes(identifier)
) || isNameCash;
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
calculateTotalAmount,
createCheckoutError,
debounce,
deepClone,
extractAmountFromCartSummary,
formatAmount,
formatDateTime,
generateLocalOrderId,
generateOrderId,
getErrorMessage,
isCashPayment,
isEmpty,
isProduction,
isValidPaymentMethodCode,
isVirtualOrderId,
logger,
retry,
safeJsonParse,
shouldSyncOrderForPayment,
throttle,
validateAmount,
validateCheckoutData,
validateLocalOrderData
});