На современных платформах электронной коммерции,Сложная льготная политика и различные типы скидок (такие как Полная скидка, скидки, сложить и т. д.) предоставляют пользователям широкий выбор.,Но это также увеличивает сложность выбора пользователя.。В этой статье мы рассмотрим, как реализовать интерфейсные алгоритмы в торговых системах.Расчет скидки,Помогите пользователям автоматически выбирать при оформлении заказаЛучшее сочетание скидок,Для улучшения пользовательского опыта и удовлетворенности покупками.
В торговых системах стратегии скидок обычно делятся на следующие категории:
в целом,Все виды Стратегия скидок При совместном использовании могут использоваться разные методы расчета.,Это приводит к большой разнице в окончательной сумме скидки. поэтому,Нам нужен умный алгоритм, чтобыОтфильтруйте лучшие планы скидок,Убедитесь, что пользователи получают лучшие предложения.
Наша цель — использовать внешние алгоритмы для расчета нескольких комбинаций скидок и рекомендации оптимального решения. Основные этапы рекомендательного алгоритма следующие:
При объединении нескольких скидок вы можете контролировать порядок использования скидок, устанавливая приоритеты, например:
Различные торговые центры могут регулировать приоритет комбинаций скидок в соответствии с потребностями своего бизнеса.
На основании вышеизложенных идей разработаем алгоритм расчета скидки:
Ниже приведен пример расчета скидки на основе JavaScript.
// Пример данных корзины покупок
const cartItems = [
{ id: 1, name: «Продукт А», price: 50, quantity: 2 },
{ id: 2, name: «Продукт Б», price: 150, quantity: 1 }
];
// Стратегия скидок
const discounts = {
percentageDiscount: 0.9, // скидка 10%
fullReduction: { threshold: 100, reduction: 20 }, // Скидка 20 при заказе от 100
pointsDeduction: 10, // Снятие баллов10Юань};
// Рассчитать общую стоимость корзины
function calculateTotal(cart) {
return cart.reduce((total, item) => total + item.price * item.quantity, 0);
}
// Применить функцию стратегии скидок
function applyDiscounts(total, discountOptions) {
const results = [];
// 1. Используйте только скидку
if (discountOptions.percentageDiscount) {
const discountPrice = total * discountOptions.percentageDiscount;
results.push({ type: 'Скидки', price: discountPrice });
}
// 2. Используйте только Полную скидка
if (total >= discountOptions.fullReduction.threshold) {
const reductionPrice = total - discountOptions.fullReduction.reduction;
results.push({ type: 'Полные скидки', price: reductionPrice });
}
// 3. сложить(Скидканазад Полная скидка)
if (discountOptions.percentageDiscount && total >= discountOptions.fullReduction.threshold) {
const afterPercentage = total * discountOptions.percentageDiscount;
const combinedDiscountPrice = afterPercentage - discountOptions.fullReduction.reduction;
results.push({ type: 'сложить', price: combinedDiscountPrice });
}
// 4. сложить Снятие баллов
if (discountOptions.percentageDiscount && discountOptions.pointsDeduction) {
const afterPercentage = total * discountOptions.percentageDiscount;
const pointsDeductionPrice = afterPercentage - discountOptions.pointsDeduction;
results.push({ type: 'Скидка+Снятие баллов', price: pointsDeductionPrice });
}
// 5. Полная скидка+Снятие баллов
if (total >= discountOptions.fullReduction.threshold && discountOptions.pointsDeduction) {
const afterReduction = total - discountOptions.fullReduction.reduction;
const pointsDeductionPrice = afterReduction - discountOptions.pointsDeduction;
results.push({ type: 'Полная скидка+Снятие баллов', price: pointsDeductionPrice });
}
// 6. сложить+Снятие баллов
if (discountOptions.percentageDiscount && total >= discountOptions.fullReduction.threshold && discountOptions.pointsDeduction) {
const afterPercentage = total * discountOptions.percentageDiscount;
const combinedDiscountPrice = afterPercentage - discountOptions.fullReduction.reduction - discountOptions.pointsDeduction;
results.push({ type: 'сложить+Снятие баллов', price: combinedDiscountPrice });
}
// Найдите оптимальное решение
const optimal = results.reduce((min, curr) => (curr.price < min.price ? curr : min));
return optimal;
}
// основная функция
function getOptimalDiscount(cart, discounts) {
const total = calculateTotal(cart);
const optimalDiscount = applyDiscounts(total, discounts);
console.log('Оптимальное решение:', optimalDiscount.type);
console.log('Окончательная цена:', optimalDiscount.price);
return optimalDiscount;
}
// Пример выполнения
getOptimalDiscount(cartItems, discounts);
calculateTotal
Функция суммирует цены на все товары в корзине.。applyDiscounts
Различные вычисления в функциях Стратегия скидоккомбинацияназадобщая цена,включать Полная скидка、Скидка、сложитьждатькомбинация。Когда мы выполняем приведенный выше код,Система автоматически рассчитает все Стратегии скидокизкомбинация,и выберитесамая низкая окончательная цена。Консоль выведет что-то похожее на следующее:
Оптимальное решение: сложить+Снятие баллов
Окончательная цена: 76
В практических приложениях, когда количество товаров в корзине увеличивается, а стратегия скидок становится более сложной, объем расчета комбинаций скидок также значительно увеличивается, что влияет на производительность внешнего интерфейса. Чтобы избежать зависаний страницы, мы можем выполнить следующие оптимизации:
Для одной и той же корзины покупок общая цена и комбинация предложений,Можетиспользоватькэш(нравитьсяlocalStorage
или словарь в памяти)存储已经вычислить过изскидкарезультат,для последующих прямых вызовов,Не нужно дважды считать. Например:
const discountCache = {};
function getCachedDiscount(total, discounts) {
const key = `${total}-${JSON.stringify(discounts)}`;
if (discountCache[key]) {
return discountCache[key];
}
const optimalDiscount = applyDiscounts(total, discounts);
discountCache[key] = optimalDiscount;
return optimalDiscount;
}
в больших системах,Также можно комбинироватьБиблиотека кэширования внешних данных(нравитьсяRedux、React Query) для управления и оптимизации кэша предпочтительных стратегий и сокращения повторных вычислений.
Текущий алгоритм исчерпывающим образом рассчитывает различные комбинации скидок. Для дальнейшей оптимизации можно рассмотреть следующие варианты:
в сложных сценариях,нравиться Стратегия скидокочень большое количество,может бытьскидкавычислить逻辑放入Web Workerсередина,Заставьте его выполняться в фоновом потоке,Это предотвращает остановку основного потока。Ниже приводится воля Скидка Расчет внесен Web Worker Пример:
// worker.js
self.onmessage = function (e) {
const { total, discounts } = e.data;
const optimalDiscount = applyDiscounts(total, discounts);
postMessage(optimalDiscount);
};
// Вызывается в основном скрипте Web Worker
const discountWorker = new Worker('worker.js');
discountWorker.onmessage = function (e) {
const optimalDiscount = e.data;
console.log('Worker Оптимальное решение:', optimalDiscount);
};
function calculateDiscountAsync(total, discounts) {
discountWorker.postMessage({ total, discounts });
}
// Пример звонка
calculateDiscountAsync(calculateTotal(cartItems), discounts);
Приложения Web Worker могут эффективно разделять операции пользовательского интерфейса и вычислительную логику основного потока, повышая производительность сложных алгоритмов.
в реальном бизнесе,Преференциальные правила платформ электронной коммерции часто часто меняются из-за таких факторов, как времена года и события. Чтобы быть более гибкими и адаптироваться к различным правилам,мы можем спроектироватьДинамическая система генерации преференциальных правил,позволятьназад Гибкое определение конца Стратегия скидок И передается во внешний интерфейс для рендеринга и расчета.。Метод реализациинравиться Вниз:
Например, правила предложений можно передавать в формате JSON и анализировать на правила, которые можно использовать во внешнем коде:
// Правила предложения, полученные из серверной части (пример)
const dynamicDiscounts = {
"percentageDiscount": { "value": 0.9, "description": "10% Скидка" },
"fullReduction": { "threshold": 100, "reduction": 20, "description": "Скидка 20 при заказе от 100" },
"pointsDeduction": { "value": 10, "description": "Снятие баллов10Юань" }
};
// Описание правил отрисовки оффера
function renderDiscountDescriptions(discounts) {
return Object.values(discounts).map(discount => discount.description).join(', ');
}
console.log("Текущие правила скидок:", renderDiscountDescriptions(dynamicDiscounts));
Этот метод динамического создания правил не только повышает гибкость системы, но также облегчает внешнее и внутреннее обслуживание и обновления, гарантируя постоянное обновление преференциальных стратегий.
В крупномасштабных системах электронной коммерции интерфейсная и серверная части обычно должны работать вместе для выполнения сложных процессов расчета скидок. Особенно когда задействованы большие объемы данных о продуктах и сложные стратегии скидок, полагаться исключительно на внешний интерфейс для выполнения расчетов может быть недостаточно эффективно и даже может вызвать узкие места в производительности.
Внешний интерфейс может выполнять предварительную проверку скидок при загрузке страницы пользовательской корзины покупок, определять возможные комбинации скидок и отображать их пользователю. Когда пользователь готов заплатить, внешний интерфейс передает информацию о корзине покупок и выбранную комбинацию скидок на серверную часть, которая выполняет окончательный расчет и подтверждение скидки для обеспечения точности цены.
В некоторых сценариях серверная часть может напрямую предоставить оптимальный план скидок и передать план на внешний интерфейс. Интерфейсной части необходимо только отобразить и подтвердить без сложных вычислений. Это может не только снизить вычислительную нагрузку на клиентскую часть, но и обеспечить точность скидок.
Ниже приведен пример процесса внешнего вызова:
// Вызовите внутренний интерфейс для получения оптимального решения
async function fetchOptimalDiscount(cartItems) {
const response = await fetch('/api/getOptimalDiscount', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ cartItems })
});
const data = await response.json();
console.log("Оптимальное решение, возвращаемое серверной частью:", data);
return data;
}
// Пример звонка
fetchOptimalDiscount(cartItems).then(optimalDiscount => {
console.log("Показать лучшую скидку:", optimalDiscount);
});
Алгоритм рекомендации скидок может не только обеспечить оптимальные скидки, но и улучшить взаимодействие с пользователем благодаря тщательному визуальному дизайну и взаимодействию. Обычно используемые методы взаимодействия включают в себя:
Ниже приведен простой пример внешнего кода для реализации отображения скидок:
<div id="discount-info">
<p>оптимальное решение:<span id="optimal-type"></span></p>
<p>окончательная цена:<span id="optimal-price"></span></p>
</div>
<script>
function displayOptimalDiscount(optimalDiscount) {
document.getElementById('optimal-type').textContent = optimalDiscount.type;
document.getElementById('optimal-price').textContent = optimalDiscount.price + " Юань»;
}
// гипотеза fetchOptimalDiscount Была ли функция реализована ранее
fetchOptimalDiscount(cartItems).then(optimalDiscount => {
displayOptimalDiscount(optimalDiscount);
});
</script>
Благодаря динамическому обновлению информации о скидках пользователи могут интуитивно ощущать льготные услуги, предоставляемые системой, тем самым улучшая качество обслуживания и удовлетворенность пользователей.
После запуска системы, чтобы убедиться в эффективности алгоритма рекомендаций, можно использовать A/B-тестирование для проверки эффектов различной логики рекомендаций по скидкам. A/B-тестирование в основном используется для оценки эффективности различных стратегий рекомендаций по показателям конверсии пользователей и частоте использования комбинаций скидок. Общие методы A/B-тестирования включают в себя:
Результаты A/B-тестирования могут обеспечить поддержку данных для алгоритмов оптимизации и помочь команде постоянно корректировать и улучшать стратегии рекомендаций по скидкам на основе данных о поведении пользователей.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>торговая система Расчет скидки</title>
<style>
body {
font-family: Arial, sans-serif;
padding: 20px;
background-color: #f4f4f4;
}
h2 {
color: #333;
}
.container {
background-color: #fff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
.result {
margin-top: 20px;
font-size: 1.2em;
color: #007bff;
}
</style>
</head>
<body>
<div class="container">
<h2>торговая система Расчет скидки</h2>
<button onclick="calculateOptimalDiscount()">Рассчитать оптимальный Скидка</button>
<div class="result" id="result">
<!-- Область отображения результатов расчета -->
</div>
</div>
<script>
// Пример данных корзины покупок
const cartItems = [
{ id: 1, name: «Продукт А», price: 50, quantity: 2 },
{ id: 2, name: «Продукт Б», price: 150, quantity: 1 }
];
// Стратегия скидок
const discounts = {
percentageDiscount: 0.9, // скидка 10%
fullReduction: { threshold: 100, reduction: 20 }, // Скидка 20 при заказе от 100
pointsDeduction: 10, // Снятие баллов10Юань };
// Рассчитать общую стоимость корзины
function calculateTotal(cart) {
return cart.reduce((total, item) => total + item.price * item.quantity, 0);
}
// Применить функцию стратегии скидок
function applyDiscounts(total, discountOptions) {
const results = [];
// 1. Используйте только скидку
if (discountOptions.percentageDiscount) {
const discountPrice = total * discountOptions.percentageDiscount;
results.push({ type: 'Скидки', price: discountPrice });
}
// 2. Используйте только Полную скидка
if (total >= discountOptions.fullReduction.threshold) {
const reductionPrice = total - discountOptions.fullReduction.reduction;
results.push({ type: 'Полные скидки', price: reductionPrice });
}
// 3. сложить(Скидканазад Полная скидка)
if (discountOptions.percentageDiscount && total >= discountOptions.fullReduction.threshold) {
const afterPercentage = total * discountOptions.percentageDiscount;
const combinedDiscountPrice = afterPercentage - discountOptions.fullReduction.reduction;
results.push({ type: 'сложить', price: combinedDiscountPrice });
}
// 4. сложить Снятие баллов
if (discountOptions.percentageDiscount && discountOptions.pointsDeduction) {
const afterPercentage = total * discountOptions.percentageDiscount;
const pointsDeductionPrice = afterPercentage - discountOptions.pointsDeduction;
results.push({ type: 'Скидка+Снятие баллов', price: pointsDeductionPrice });
}
// 5. Полная скидка+Снятие баллов
if (total >= discountOptions.fullReduction.threshold && discountOptions.pointsDeduction) {
const afterReduction = total - discountOptions.fullReduction.reduction;
const pointsDeductionPrice = afterReduction - discountOptions.pointsDeduction;
results.push({ type: 'Полная скидка+Снятие баллов', price: pointsDeductionPrice });
}
// 6. сложить+Снятие баллов
if (discountOptions.percentageDiscount && total >= discountOptions.fullReduction.threshold && discountOptions.pointsDeduction) {
const afterPercentage = total * discountOptions.percentageDiscount;
const combinedDiscountPrice = afterPercentage - discountOptions.fullReduction.reduction - discountOptions.pointsDeduction;
results.push({ type: 'сложить+Снятие баллов', price: combinedDiscountPrice });
}
// Найдите оптимальное решение
const optimal = results.reduce((min, curr) => (curr.price < min.price ? curr : min));
return optimal;
}
// основная функция
function calculateOptimalDiscount() {
const total = calculateTotal(cartItems);
const optimalDiscount = applyDiscounts(total, discounts);
document.getElementById("result").innerHTML = `
<strong>Оптимальное решение:</strong> ${optimalDiscount.type}<br>
<strong>Окончательная цена:</strong> ¥${optimalDiscount.price.toFixed(2)}
`;
}
</script>
</body>
</html>
Эффект от операции следующий.
В этой статье рассказывается, как реализовать расчет скидки и алгоритм рекомендации оптимальной скидки в системе покупок с помощью внешнего кода. Благодаря этому алгоритму пользователи могут автоматически получать лучшие цены и улучшать свои впечатления от покупок. При этом структура алгоритма проста и может быть расширена и оптимизирована под нужды различных торговых центров. Надеюсь, эта статья поможет вам реализовать алгоритм скидок на платформе электронной коммерции!