#algorithm #data-structures #data-modeling #shopping-cart
#алгоритм #структуры данных #моделирование данных #корзина покупок
Вопрос:
В настоящее время я ищу наилучшую практику «применения скидок» к корзине / заказу. Итак, я планирую реализовать такие скидки, как…
-
фиксированная пользовательская скидка (например, я хотел бы предоставить скидку 10% моему любимому клиенту)
-
скидка на количество товаров (например, вы покупаете 10 ручек разного цвета и получаете скидку 1,5%)
-
скидка по купону (например, во время промо-акции мы подготовили 100 купонов со скидкой 10% на каждый. Купоны действуют только для одного заказа и истекают в гггг-мм-дд)
-
подарок при покупке товара или группы товаров (например, вы покупаете ручку, список бумаги, а магазин дарит вам точилку)
-
скидка на общую стоимость заказа (например, вы покупаете 10 ручек и не получаете скидки, затем вы добавляете еще 5 ручек и получаете скидку 5%)
К конкретному товару может быть применена только одна скидка. Мы всегда применяем самую большую скидку. Самая выгодная скидка для пользователя.
Кроме того, администратор должен иметь возможность изменять цену товаров в определенном порядке и отменять скидки в этом порядке.
Честно говоря, это мое первое приложение для электронной коммерции, и мне кажется довольно сложной задачей реализовать все эти виды скидок.
Хорошо, теперь позвольте мне рассказать вам, как я собираюсь реализовать…
-
фиксированная скидка пользователя Это просто поле в таблице пользователей, которое содержит информацию о скидке. Он настраивается вручную через панель управления или автоматически cron для случаев, когда общая сумма заказов превышает этот N.
-
скидка на количество товаров Я собираюсь создать дополнительную таблицу, в которой будут храниться группы товаров с такими скидками. Также мне понадобится еще одна таблица, чтобы связать эти группы с товарами в магазине.
-
скидка по купону Просто таблица с купонами, содержащая поле с указанием дня истечения срока действия, статуса купона, скидки по купону и, возможно, user_id (владельца купона). Вероятно, я также буду внедрять купоны для категорий товаров.
-
присутствует при покупке товара или группы товаров, это настоящая заноза в заднице, и я совершенно не знаю, как это реализовать. Пожалуйста, помогите!
-
скидка на общую стоимость заказа довольно проста, имхо.
Хорошо, теперь я ищу лучшие практики хранения скидок такого рода в базе данных. Также я ищу методы ООП для применения этих скидок к корзине. Любая помощь приветствуется!
PS: Извините за такой длинный пост, но я думаю, что это будет интересно не только мне.
Спасибо.
Ответ №1:
Базовым решением на данный момент для требования покупки товара или группы товаров является наличие чего-то вроде пакета и таблицы bundleItem.
bundle table.
id int primary key
giftproductId int foreign key - product table
bundleitem table.
id int primary key
bundleid int foreign key - bundle table
requiredproductid int foreign key - product table
Ваша таблица пакетов содержит идентификатор подарочного товара, а таблица bundleitem содержит все товары, связанные с пакетом, которые пользователь должен заказать, чтобы получить право на подарок.
Ваш класс ‘Bundle’ будет содержать массив этих необходимых товарных позиций, подарочный товар и метод, который принимает объект корзины покупок и проверяет, содержит ли корзина все необходимые товары для этого конкретного предложения пакета — что-то вроде простого foreach в цикле foreach…
Это простое решение, но в зависимости от правил для этих подарочных товаров все может усложниться, например, если я заказываю 2 ручки и 2 листа бумаги, получаю ли я 2 точилки? — Удачи с этим!
Комментарии:
1. Предположим, у вас есть 20 видов пера. Сколько пакетов вам нужно, чтобы указать все различные комбинации типов ручек, которые могут быть у кого-то? Предположим, что могут применяться несколько пакетов, но они не могут применяться все сразу. Как вы выбираете наиболее выгодный набор пакетов? Угловые случаи могут усложняться.
2. @btilly согласен. Описанное выше решение — это просто механизм, позволяющий определить, когда в корзине есть товары, отвечающие требованиям am offer — вы, очевидно, можете расширить его, чтобы содержать большое количество флагов и параметров, чтобы охватить ваши совершенно обоснованные «что, если» выше, или вы можете сделать то, что сделал я — жестко запрограммировать правила в соответствии со спецификацией клиента с параметром для включения или выключения правил. у вас может быть абстрактный класс правил с конкретными реализациями, специфичными для клиента, внедренными во время выполнения, чтобы четко разделять кодовую базу и клиентские правила. Класс rules в основном имеет метод applyRules для реализации.