Как гибко хранить множество цен на товар?

Я хочу построить магазин, в котором у товаров есть маленький мастер, с помощью которого потом определяется цена. В данном случае я говорю о полиграфической продукции.

Итак, для (небольшого) примера, когда вы приходите в магазин и хотите напечатать визитную карточку, вы решаете, хотите ли вы печатать черно-белую или цветную бумагу, хотите ли вы выбрать плотную бумагу или тонкую, если вы хотите для печати 100, 200, 500 или 1000 штук и так далее.

Ведь будет цена скажем: черно-белая, плотная бумага, 200 шт => 40,-$

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

Итак, мой вопрос: как я могу обращаться с ценами?

Моя первая идея: шаблон декоратора.

Но когда я подумал об этом, это не очень хорошая идея. Как я уже сказал, реальной формулы нет, также мне нужно сгенерировать мастер (который может быть другим, если вы хотите печатать поздравительные открытки). Также я хочу иметь возможность изменить цену через интерфейс администратора или добавить продукт или добавить новое «решение», например «хотите глянцевую бумагу?» к продукту или удалите его (и при этом сохраните цены).

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

Другая идея состоит в том, чтобы построить некоторые виды ключевых объектов с помощью решений и посмотреть цену в таблице цен. Немного похоже на словарь, в который я добавляю решения и, в конце концов, генерирую из него ключ для поиска цены в таблице цен.

Итак, перед прототипированием мне было интересно, я просто слепой и не вижу очевидного решения, или, может быть, есть другой способ, более элегантный, о котором я не знаю?


person Stefan Ladwig    schedule 05.02.2009    source источник


Ответы (1)


Ну, идея у меня довольно сложная, но и твое желание тоже сложное.

Проблема с волшебником, которого вы описываете, заключается в том, что после того, как они сделали все свои выборы, они могут захотеть вернуться к пункту 2 и изменить что-то одно, чтобы посмотреть, как это изменит цену, но то, как вы строите своего волшебника, может повлиять на то, можно ли вообще сделать более поздний выбор, и привести к довольно сложному набору кода, который вы должны настроить для каждого продукта — вместо того, чтобы хранить все в базе данных так, чтобы код мог делать все необходимое, и любые изменения продукта сохранялись. в базу данных, а не изменения кода.

Во-первых, вы должны понимать, что у вас есть логика ценообразования, и в идеале она должна быть отделена от презентации. Другими словами, вы должны иметь возможность представить пошаговый мастер одному клиенту и одну страницу с опциями флажков и полями другому, и заставить их построить то же самое с теми же ограничениями.

Старайтесь избегать проектирования базы данных, чтобы вы не могли сделать ни то, ни другое. Другими словами, вы ограничиваете будущие варианты (и гибкость клиента), если вы используете мастер стиля «выбери свое собственное приключение». Причина в том, что если я пройду 10 шагов, а затем изменю шаг 2, мне придется пройти еще 8 шагов — это может быть нормально, если вы гарантируете, что я не повторяю уже сделанный выбор, но если я только изменение цвета бумаги, я не хочу снова делать те же 8 вариантов. Если вы пойдете по этому пути, убедитесь, что вы сохраняете много состояний, чтобы выбор, который они сделали ранее, отображался как выбор по умолчанию в следующий раз.

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

Например, у меня есть три типа бумаги, 3 цвета и 3 процесса:

  • Бумага

    • Light
    • Обычный
    • Карта
  • Цвет

    • Red
    • Синий
    • Зеленый
  • Процесс

    • Print
    • Складывать
    • Связывать

Тогда у меня будет цена для каждого матча:

        Light   Regular Card    Red     Blue    Green   Print   Fold    Bind
Light                           0.05    0.05            0.001           0.50
Regular                         0.06    0.05    0.07    0.001   0.02    0.80
Card                                    0.06            0.002           0.90
Print                                                   0.002   
Fold                                                            
Bind                            

Пустые места обозначают элементы, которые нельзя смешивать.
Примечательные записи:

  • Печать и печать в сочетании — двусторонняя печать изнашивает/заминает машину чаще.
  • Вы не можете помещать предметы в фальцевальную машину более одного раза (операция фальцевания пуста), но вы можете перечислить различные типы фальцевания и бумагу, к которой они относятся.
  • Вы не можете связать сложенные предметы
  • Я не дублировал элементы в матрице (т.е. печать на легкой бумаге такая же, как печать на легкой бумаге - в зависимости от того, как вы создаете свои запросы, вы хотите обозначить это или сформировать таблицу таким образом, чтобы это не имело значения) )

Это всего лишь пример простого воплощения - каждая цена на самом деле будет ссылкой на другую таблицу, которая дает цену за каждую, если количество находится в определенном диапазоне (т.е. 100 может быть дешевле, чем 10). Это также будет учитываться, взимается ли плата за лист бумаги, за операцию или за заказ, и это может складываться (таким образом, у вас может быть обязательная плата в размере 0,001 за лист бумаги для учета износа резаков и 0,50). за переплетенную книгу по цене за штуку, затем 5 долларов США за установку за всю операцию переплета)

Это быстро станет довольно сложным, учитывая огромное количество вещей, которые у вас есть, и которые вы можете использовать для других вещей.

Но как только данные будут введены, вы получите неограниченную гибкость в определении затрат и представлении их пользователю. Например, вы можете обнаружить, что стоит поместить каждую модель печатной машины в отдельный столбец (вместо того, чтобы просто называть их все принтерами) и найти самую низкую цену печати для клиента в зависимости от типа бумаги, цвета и операций печати. .

Вы также можете заполнить матрицу трудозатратами (временем), чтобы вы могли давать оценки времени там же, где и оценки цен.

Независимо от того, делаете ли вы мастер или показываете все на странице сразу, этот бэкенд будет поддерживать его. Посмотрите, что делает Dell для конфигураций ноутбуков — вы не можете получить одни вещи с другими вещами. Таким образом, если вы отображаете все параметры на странице, то, когда они меняются с обычной бумаги на картон, вы можете предупредить их: «Вы также выбрали фальцовку, которая несовместима с карточками. Вы уверены, что хотите сделать это? сдача?"

Но прежде всего — сначала напишите варианты использования и спроектируйте систему в целом. Если вы прыгнете сейчас и начнете кодировать что-то настолько сложное, вы будете принимать решения сейчас, которые будет очень трудно отменить позже, но позже вы обнаружите, что вам нужно либо внести серьезные изменения, либо пойти на компромисс в отношении функции.

Конечно, выбрать свой собственный стиль приключения намного проще с точки зрения дизайна и разработки, единственная проблема заключается в том, что если вы добавите новый процесс или бумагу, вам, возможно, придется обновить 200 деревьев и добавить 50 новых деревьев. Каждое изменение в магазине требует развертывания новой базы данных (и, возможно, программного обеспечения), что задерживает окупаемость капитальных затрат. Если вы сделаете это очень гибким заранее, это будет сложнее сейчас, а потом проще/быстрее.

Кроме того, вы не ограничиваете своих клиентов древовидными вариантами — если они действительно хотят печатать с помощью 4-цветной машины с одной стороны и дешевого копировального аппарата с другой, они могут изучить этот вариант, если процессы и материалы совместимы. После 20 продуктов/процессов вы не сможете полностью заполнить дерево.

Наконец, это дает вам очень, очень точный контроль над затратами. Если ваш бизнес-процесс отслеживает использование машины и стоимость (техническое обслуживание и т. д.) на детальном уровне, вы можете занизить ставку своего конкурента, потому что знаете, что ваша машина стоит ровно 0,00234 за страницу, в то время как они застряли с общее предположение. Если вы начнете отслеживать с помощью этой системы и заставите сотрудников отслеживать проблемы, техническое обслуживание и т. д., вы можете обнаружить очень странные корреляции, например, красные карточки обходятся вам дороже на фальцевальной машине, потому что они застревают чаще, чем синие (по какой-то причине). Вы можете либо скорректировать свои цены (до n-й степени в этой системе), поговорить с производителем бумаги, прекратить предлагать этот вариант, либо использовать ряд других тактик, чтобы ужать систему. Если некоторым из ваших машин требуются квалифицированные операторы, вы можете добавить сотрудников в матрицу с их ставками заработной платы и начать планировать рабочие места, чтобы они работали более эффективно и результативно.

Обновлять

Допустим, я выбираю светлую бумагу, красный цвет, печать. Как мне получить правильную цену? В двумерной таблице у меня есть три возможные пары Красный/Печать, Красный/Свет, Печать/Свет. К сожалению, я не могу рассчитать цену в развивающейся формуле, у меня есть только одна конечная цена после того, как все выборы были сделаны.

Ну, я упростил вышеизложенное, но давайте сначала рассмотрим простой случай.

Я не упомянул в приведенной выше таблице, что представляла каждая цена. Стоимость указана за страницу, кроме переплета. Стоимость переплета указана за связанный предмет.

Итак, в вашем примере вы выбираете светлую бумагу, красную, печать. Каждый лист красной бумаги стоит 0,05 доллара (дорогая бумага!), а каждый отпечаток — 0,001 доллара (дешевая печать), поэтому стоимость одного листа печатной бумаги составляет 0,051 доллара. Если вы делаете 300 копий, то общая стоимость составляет 15,30 долларов США.

Поскольку привязка указана для каждого связанного элемента, вы можете добавить привязку к вышеуказанному порядку, и вы можете связать вместе 50 страниц, всего 6 связанных элементов, 300 страниц. Мы уже знаем стоимость всего предыдущего, поэтому дополнительные затраты на 6 связанных элементов (по 0,50 доллара США за элемент) составляют 3,00 доллара США, что в сумме составляет 18,30 доллара США.

Есть несколько вещей, которые вам придется сделать помимо упрощения, которое я указал выше:

В матрице я оставил много ячеек пустыми. В некоторых случаях это происходит из-за того, что процессы/объекты несовместимы (например, невозможно связать сложенные элементы), но в других случаях конфликта нет, но это ничего не стоит. Итак, ваш пример красного/обычного против обычного/красного — поскольку мы складываем цены вместе, альтернативная комбинация ничего не стоит.

Посмотрим, смогу ли я сделать это более ясным...

Выбор светлой бумаги, красной, напечатанной, переплетенной (300 страниц, 6 переплетенных предметов) проходит по таблице и находит все цены, которые попадают в этот набор:

Матрица ценообразования показывает ячейки, в которых параметры сталкиваются, чтобы предоставить информацию о ценах

Вы ищете в таблице все элементы (как красный/светлый, так и светлый/красный), а затем берете цены и умножаете на количество по отдельности, а затем суммируете их. Пересечение всех этих выборок показано зеленым цветом. (Неправильно с окраской светлой бумаги/светлой бумаги - тоже должно быть зеленым)

Я удалил комбинацию печать/печать, потому что она не будет работать с этим методом (я надеялся упростить вещи, но на самом деле это все усложняет). Если вы хотите указать двустороннюю печать, вам понадобится другой элемент в таблице (Печать Обратное, например), и вы бы выбрали как печать, так и печать в обратном направлении. Поочередно есть два пункта: «печать с одной стороны» и «печать с двух сторон».

Имейте в виду, что, хотя я перечислил каждую цену в каждой ячейке, реальность такова, что каждая ячейка на самом деле описывает несколько обстоятельств:

  1. Ссылка на таблицу цен
  2. Бесплатно
  3. Ограничение (комбинация невозможна)

Ссылка в №1 относится к другой таблице, которая содержит цены и третье измерение. Например, ячейка с комбинацией «светлый/связанный» будет ссылаться на таблицу со следующими тремя атрибутами:

  • Цена за страницу
  • За связанную цену товара
  • Цена за работу (настройку)

Они будут суммироваться в соответствии с количеством страниц и связанных элементов, а затем к ним добавляется стоимость работы.

Больше сложности! Ву!

Это может работать для ваших нужд, но что, если у вас есть процессы, которые несовместимы только в некоторых более сложных ситуациях?

Прямо сейчас мы можем рассмотреть общий случай конфликта одного процесса или объекта с другим. Однако мы не можем справиться с чем-то более сложным.

Предположим, что светлую бумагу можно печатать и складывать, но нельзя одновременно печатать и складывать. Мы не можем установить ограничение на печать/фальцовку, потому что другие виды бумаги можно и печатать, и фальцевать.

Вот несколько вещей, которые вы можете сделать:

  • Добавьте третье измерение, но тогда у вас может быть последовательность, которую невозможно выполнить, если смешать 4 вещи, что означает другое измерение и т. д.
  • Использовать векторы (карта/уменьшение)
  • Добавьте слой абстракции

Векторы хороши, но могут быть излишними для этого приложения. По сути, это первый элемент, но без определения того, сколько измерений вы можете иметь — у вас есть столько измерений, сколько у вас есть объектов, поэтому может быть представлена ​​любая возможная комбинация.

Дополнительный уровень абстракции — это компромисс между ними. В идеале у вас не будет очень много конфликтов, которые сложнее, чем два элемента, но когда они возникают, вы определяете новый объект, представляющий комбинацию. Таким образом, в этом случае у вас может быть новый объект/процесс, представляющий собой комбинацию печати и складывания, и он имеет ограничение в столбце с тонкой бумагой.

Вы можете сделать это только для ограничений, и в этом случае ваш алгоритм ценообразования не изменится (т. е. ценообразование по-прежнему происходит от добавления отдельных процессов и объектов).

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

Наконец, вы можете искать в базе данных как отдельные, так и комбинированные товары, а в случае конфликта (двойная цена комбинации и отдельных товаров) вы можете выбрать:

  • Самая большая стоимость
  • Самая большая комбинация
  • Приоритетные затраты (т. е. каждая стоимость имеет назначенный приоритет, и вы сравнивали их во время конфликтов и выбираете ту, которая имеет приоритет)

-Адам

person Adam Davis    schedule 05.02.2009
comment
Вау, очень впечатляющий ответ! Большое тебе спасибо. Вещи, которые вы упомянули заранее, гибкие, любые изменения продукта вносятся в базу данных, а не изменения кода и многое другое - это именно то, что я ищу (и почему я задал вопрос). Идея с матрицей мне нравится, вот только одного не пойму: - person Stefan Ladwig; 06.02.2009
comment
Допустим, я выбираю светлую бумагу, красный цвет, печать. Как мне получить правильную цену? В двумерной таблице у меня есть три возможные пары Красный/Печать, Красный/Свет, Печать/Свет. К сожалению, я не могу рассчитать цену в развивающейся формуле, у меня есть только одна конечная цена после того, как все выборы были сделаны. - person Stefan Ladwig; 06.02.2009