Qual è un buon approccio per gestire le promozioni?

1

Sto creando da zero il sito web della mia agenzia, un ordine alimentare online e un servizio di consegna.

Sto cercando di migliorare al meglio il sistema di promozione: ogni ristorante ha le sue promozioni e alcune di esse hanno una certa priorità rispetto ad altre.

Ad esempio, se il cliente ordina tre pizze e per ogni pizza ordinata c'è una lattina gratuita il sito suggerirà una bottiglia grande invece di tre lattine piccole. Potrebbero esserci più tipi di promozioni:

  1. se il tuo ordine è superiore a una soglia, otterrai qualcosa gratuitamente (ad esempio se l'ordine è superiore a 20 $, ricevi una birra gratis);
  2. un determinato prodotto ha associato qualcosa gratuitamente, anche se ne ordini uno solo (ad esempio una birra gratis per ogni salsiccia e pizza ai peperoni);
  3. se ordini un prodotto generico appartenente a una categoria precisa, ottieni qualcosa gratuitamente (ad esempio, ogni pizza ordinata ti dà una birra gratis, indipendentemente dal tipo di pizza che ordini);
  4. se ordini più di un prodotto, ricevi qualcosa gratuitamente (ad esempio se ordini più di una pizza o più di un kebab, ricevi qualcosa gratuitamente).

Alcuni ristoranti offrono solo una delle quattro promozioni di cui sopra, o una combinazione di questi: alcuni di essi potrebbero confondersi tra loro.

Il vecchio sito web era un casino, una piramide di sventura di% nidificato% co_de e loro vogliono che sia reso più facile e facile da gestire (l'inserimento e la rimozione delle promozioni devono essere facili).

Sto cercando di ricordare quale università mi ha lasciato e ho pensato a Deterministic finite automata (DFA) : il la grammatica sarebbe la regola della precedenza nel considerare le promozioni, i segni dell'alfabeto sarebbero i piatti e i prodotti gratuiti, la lingua sarebbe l'insieme delle possibili promozioni. Ma:

  • ogni ristorante dovrebbe avere il suo set di promozioni, ad esempio la sua grammatica, il suo DFA (potrebbe essere eccessivo per sviluppare un DFA per un insieme così limitato di prodotti gratuiti);
  • il design della grammatica potrebbe essere difficile (alcune promozioni potrebbero confondersi con altre se un ristorante offre più tipi di promozioni, inoltre la precedenza di alcune promozioni rispetto ad altre potrebbe essere difficile da progettare con regole grammaticali e più facile da descrivere con un po 'di peso "concetto).

Quale sarebbe l'algoritmo / struttura dati più appropriato da utilizzare in questi casi?

    
posta elmazzun 24.08.2017 - 10:58
fonte

2 risposte

5

Ciò di cui hai probabilmente bisogno è chiamato Business Rule Engine . Potrebbe sembrare più sofisticato così com'è, probabilmente non avrai bisogno di un motore di regole generiche sovradimensionato con un sistema di gestione delle regole di 100K $. Un semplice sistema con le regole memorizzate in un modulo tabulare, incluso

  • il tipo di regola
  • parametri per descrivere la precondizione per lo specifico promo
  • gli articoli promozionali stessi che sono garantiti da questa regola

e un interprete specifico per queste regole dovrebbe almeno risolvere l'80% del tuo problema. Ad esempio, le condizioni preliminari possono definire quale prodotto o categoria o limite di prezzo invoca la promozione. Ci possono essere precondizioni di als in cui sono già stati concessi articoli promozionali da un precedente blocco di regole che concede un altro oggetto.

L'idea dovrebbe essere quella di avere uno di questi tavoli per ciascuno dei ristoranti e di applicare le regole una dopo l'altra a qualsiasi ordine, con una serie di articoli promozionali come output. L'ordine delle regole nella tabella potrebbe essere sufficiente per controllare la loro precedenza.

Probabilmente dovrai aggiungere alcune regole di postelaborazione per raggruppare gli oggetti promozionali insieme (come il tuo esempio iniziale di tre canne), non concedere lo stesso articolo più di una volta, o per risolvere altri conflitti. Le regole di postprocessing potrebbero essere aggiunte anche alla tabella sopra, ma se sono troppo complicate per essere risolte in modo generico, basta creare una regola di postelaborazione SpecialProcessingRestaurant_Foo e implementare il codice specifico per il ristorante "Foo".

Questo dovrebbe ridurre la quantità individuale di codice necessaria per ogni ristorante non a zero, ma al minimo. Poiché non hai l'obbligo di consentire ai non programmatori di gestire le regole, suppongo che potrebbe essere sufficiente per il tuo caso.

    
risposta data 24.08.2017 - 13:25
fonte
0

Funziona se sei disposto ad implementare un modello di gui / database per gestire le promozioni.

Ho impiantato una classe java Promotion che contiene

  • articoli del carrello invisibili speciali "PromotionAdvantage"
  • un elenco di uno o più PromotionExpressions -s che restituiscono true o false.

Il motore di promozione cerca di trovare le promozioni in cui tutte le espressioni corrispondono e applica il vantaggio al carrello.

Una promozione potrebbe apparire come questa

  • Nome promozionale "bottiglia di vino gratis"

    • PromotionExpression: RestaurantPromotionEpression ("Kreta-Nyc", "Samos-La")
    • PromotionExpression: MinValuePromotionEpression ("20 USD")
    • PromotionExpression: CartContainsProduct ("Giros Pita", "Souvlaki")

    • PromozioneAdvantage: FreeGiftPromotionAdvantave ("bottiglia di vino gratis")

    • PromozioneAdvantage: RefundPromotionAdvantave ("0,99 USD")

    • consenti più promozioni: falso

quindi il cliente ottiene uno sconto di 0,99 USD e una bottiglia di vino in omaggio se l'ordine proviene dai ristoranti convenzionati "Kreta-Nyc" o "Samos-La" ha un totale di almeno 20 USD e l'ordine contiene a almeno "Giros Pita" o "Souvlaki"

    
risposta data 24.08.2017 - 19:31
fonte

Leggi altre domande sui tag