2009-08-31 4 views
10

Attualmente sto creando un sito di e-commerce con PHP/MySQL. Recentemente, ho lavorato all'integrazione del Carrello acquisti. Il cliente voleva assicurarsi che lo stock fosse disponibile per i potenziali acquirenti, così ho creato un sistema di gestione delle scorte. Il carrello acquisti funziona come segue:Gestione carrello e magazzino

  • Il client aggiunge una quantità di un articolo a il suo carrello.
  • La quantità dell'articolo è riservata a disponibile nel database.
  • Nessun altro può acquistare riservato azioni.
  • Le scorte rimangono riservate fino all'ordine del processo del cliente - in cui lo stock è quindi rimosso dal database.
  • Se il cliente abbandona il carrello, le scorte rimangono riservate.
  • Se un altro cliente desidera acquistare un articolo, ma solo lo stock disponibile è riservato da un altro cliente, il cliente può rubare lo stock prenotato se è rimasto inattivo per 20 minuti.

La mia domanda è, quali sono le migliori pratiche per questo tipo di scenario? Sto facendo questo correttamente? La cosa principale è che il cliente non vuole vendere azioni che non ha.

Sto cercando di avere una discussione su come migliorare la funzionalità o su ciò che altri stanno facendo per raggiungere questo obiettivo.

risposta

14

Un approccio alternativo può essere quello di non prenotare un magazzino dopo averlo inserito nel carrello. Esegui un controllo ogni volta che una pagina viene ricaricata, se l'elemento non è più disponibile, visualizza un messaggio del tipo "L'articolo che desideri acquistare è appena stato esaurito. Sarà disponibile a breve". E rimuovi il prodotto dal carrello.

Ora, è assolutamente necessario prenotare il contenuto del carrello prima di iniziare l'operazione di pagamento, quindi rimuoverlo dal magazzino o rimuovere la riserva a seconda del successo/fallimento del pagamento. Lo fai meglio in un giro di codice, in modo che la riserva duri il più brevemente possibile.

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

Più è breve la tua prenotazione, maggiore è la possibilità che il tuo articolo venga effettivamente venduto. Riduci al minimo la possibilità di un conflitto: CustomerA inizia con il carrello della spesa, l'oggetto viene prenotato, il clienteB arriva, vede l'articolo non è in magazzino e va via, CustomerA decide che non gli piace il prezzo e annulla l'operazione. Hai avuto due potenziali clienti ma non hai potuto vendere a nessuno dei due.

+0

Grazie per il consiglio. Ho intenzione di rielaborare la funzionalità. Sapevo che non era il modo migliore per farlo. Il congelamento delle scorte probabilmente non è una buona idea, a meno che non vendiate prodotti unici, come i biglietti per i concerti. – jgallant

+0

Sì, come con il controllo del codice sorgente e le transazioni del database, impostazione predefinita per il blocco ottimistico a meno che non si abbia una buona ragione per fare diversamente. – Jerph

3

faccio un controllo per lo stock su ogni ricarica delle pagine durante il processo di checkout e li reindirizzo alla pagina del carrello con un messaggio di errore se durante il processo gli articoli sono stati esauriti. Il magazzino è ridotto solo su ordine confermato Anche io ripristino lo stock se l'ordine è annullato.