Корзина и управление запасами - PullRequest
10 голосов
/ 31 августа 2009

В настоящее время я создаю сайт электронной коммерции с помощью PHP / MySQL. Недавно я работал над интеграцией корзины покупок. Клиент хотел, чтобы запас был доступен для потенциальных покупателей, поэтому я создал систему управления запасами. Корзина работает следующим образом:

  • Клиент добавляет количество товара к его телега.
  • Количество предметов зарезервировано от наличие на складе в базе.
  • Никто другой не может купить зарезервированный акций.
  • Запас остается зарезервированным до клиента обрабатывает заказ - где находится запас удалено из базы данных.
  • Если клиент покидает свою корзину, запас остается зарезервированным.
  • Если другой клиент желает купить товар, но другой клиент зарезервировал только имеющийся запас, он может украсть зарезервированный запас, если он неактивен в течение 20 минут.

Мой вопрос: каковы наилучшие практики для такого сценария? Я делаю это правильно? Главное, что клиент не хочет продавать акции, которых у него нет.

Я хочу обсудить, как улучшить функциональность или что другие делают для этого.

Ответы [ 2 ]

15 голосов
/ 31 августа 2009

Альтернативный подход может заключаться в том, чтобы не зарезервировать запас при помещении его в корзину. Выполняйте проверку каждый раз, когда страница перезагружается, если элемент больше не доступен, отобразите сообщение типа «Элемент, который вы хотите купить, только что распродан. Он будет доступен в ближайшее время». И вы удаляете товар из корзины.

Теперь вам абсолютно необходимо зарезервировать содержимое корзины покупок непосредственно перед началом операции оплаты, а затем либо удалить ее со склада, либо удалить резерв в зависимости от успешности / неудачи платежа. Вы делаете это лучше за один прогон кода, так что резерв длится как можно короче.

ProcessOrder ()
{
    bool reserved = ReserveShoppingCartContents ();
    if (reserved)
    {
        bool paymentStatus = ProcessPayment ();
        if (paymentStatus)
            RemoveShoppingCartContentsFromStock ();
        else
            ReleaseShoppingCartReserve ();
    }
    else
    {
        RefreshShoppingCartContents (); // Remove positions or adjust quantities
        MessageBox ("Could not reserve your shopping cart contents. Please check out your selection");
    }
}

Чем короче ваш резерв, тем выше вероятность того, что ваш предмет будет действительно продан. Вы минимизируете возможность конфликта: CustomerA начинает с корзины покупок, товар зарезервирован, CustomerB приходит, видит, что товара нет на складе и уходит, CustomerA решает, что ему не нравится цена, и отменяет операцию У вас было два потенциальных клиента, но вы не могли продать ни одному.

3 голосов
/ 31 августа 2009

Я проверяю запас при каждой перезагрузке страниц во время оформления заказа и перенаправляю их на страницу корзины с сообщением об ошибке, если в ходе процесса товары были распроданы. Запас уменьшается только на подтвержденный заказ Также я восстанавливаю запас, если заказ отменен.

...