2009-08-31 8 views
10

Aktualnie buduję witrynę e-commerce z PHP/MySQL. Ostatnio pracowałem nad integracją koszyka. Klient chciał zapewnić dostępność zapasów dla potencjalnych nabywców, dlatego stworzyłem system zarządzania zapasami. Koszyk działa w następujący sposób:Koszyk na zakupy i zarządzanie zapasami

  • Klient dodaje pewną ilość przedmiotu do swojego koszyka.
  • Ilość sztuk jest zarezerwowana od dostępne zapasy w bazie danych.
  • Nikt inny nie może kupić zapasów zarezerwowanych .
  • Magazyn pozostaje zarezerwowany do momentu, aż klient zamówi zlecenie - gdzie zapas jest następnie usunięty z bazy danych .
  • Jeśli klient porzuci swój koszyk, zapasy pozostają zarezerwowane.
  • Jeśli inny klient chce kupić przedmiot, ale tylko dostępny zapas jest zarezerwowany przez innego klienta, klient może wykraść zapas zarezerwowany, jeśli był nieaktywny przez 20 minut.

Moje pytanie brzmi, jakie są najlepsze praktyki dla tego rodzaju scenariusza? Czy robię to poprawnie? Najważniejsze jest to, że klient nie chce sprzedawać towaru, którego nie ma.

Szukam dyskusji na temat ulepszenia funkcjonalności lub tego, co robią inni, aby to osiągnąć.

Odpowiedz

14

Alternatywnym podejściem może być nie rezerwowanie towaru po umieszczeniu go w koszyku. Wykonaj kontrolę za każdym razem, gdy strona zostanie ponownie załadowana, jeśli przedmiot nie będzie już dostępny, wyświetli komunikat "Produkt, który chcesz kupić, został właśnie wyprzedany." Będzie wkrótce dostępny ". I usuwasz produkt z koszyka.

Musisz teraz zarezerwować zawartość koszyka na zakupy tuż przed rozpoczęciem operacji płatniczej, a następnie usunąć je z magazynu lub usunąć rezerwę w zależności od sukcesu/niepowodzenia płatności. Robisz to lepiej w jednym przebiegu kodu, dzięki czemu rezerwa trwa tak krótko, jak to tylko możliwe.

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"); 
    } 
} 

Im dłużej trwa rezerwa, tym większa szansa, że ​​przedmiot zostanie faktycznie sprzedany. Minimalizujesz możliwość konfliktu: CustomerA zaczyna od koszyka, przedmiot zostaje zarezerwowany, CustomerB przychodzi, widzi, że produkt nie jest w magazynie i znika, CustomerA postanawia, że ​​nie podoba mu się cena i anuluje operację. Miałeś dwóch potencjalnych klientów, ale też nie mógł sprzedać.

+0

Dzięki za poradę. Zamierzam przerobić funkcjonalność. Wiedziałem, że to nie jest najlepszy sposób, aby to zrobić. Zamrażanie akcji prawdopodobnie nie jest dobrym pomysłem, chyba że sprzedajesz wyjątkowe produkty, takie jak bilety na koncerty. – jgallant

+0

Tak, podobnie jak w przypadku kontroli kodu źródłowego i transakcji bazy danych, domyślne jest ustawienie optymistyczne, chyba że masz uzasadnione powody, aby postąpić inaczej. – Jerph

3

Sprawdzam stan zapasów przy każdym ponownym załadowaniu stron podczas procesu realizacji zamówienia i przekierowuję je na stronę koszyka z komunikatem o błędzie, jeśli podczas procesu przedmioty zostały wyprzedane. Zdjęcie zostaje zmniejszone tylko po potwierdzeniu zamówienia Również mogę przywrócić stan, jeśli zamówienie zostanie anulowane.

Powiązane problemy