Я работаю над системой транзакционной инвентаризации для нашей компании, занимающейся электронной коммерцией, и ищу какое-то руководство или учебное пособие о том, как этого добиться с помощью базы данных MySQL. Есть руководства по программированию и руководства по использованию таких систем, но я не смог найти ресурс с предлагаемыми структурами таблиц или лучшими практиками для реализации ваших собственных.
В этой системе все предметы покупаются, хранятся, перепродаются, а затем отправляются (без производства). Система должна поддерживать несколько «Местоположений» (т. Е. Висконсин, Северная Каролина). Каждое Место может иметь один или несколько «Складов» (здания рядом друг с другом). Каждый склад может иметь один или несколько «островков», при этом каждый остров имеет одну или несколько «полок», а каждая полка имеет одну или несколько «корзин». Товар хранится в корзинах, и у каждого варианта размера / цвета есть своя корзина. Некоторые предметы могут храниться в нескольких корзинах (т. Е. Если мы получим скидку, заказав 2000 за один раз, мы можем положить 10 в низкую корзину, а остальные положить на большую полку в «затоваривании».
Хранить предметы в соответствующих местах довольно просто. Я бы, вероятно, имел бы таблицу Бинов, например:
BinID BinName LocationID WarehouseID IsleID ShelfID
---------------------------------------------------------------------------------
1 Widget Bin A 1 1 1 1
2 Widget Bin B 1 2 2 5
3 Large Widget Rack 1 1 5 17
4 Widget Overstock 2 3 6 23
А затем перемещайте предметы между корзинами с помощью таблицы транзакций, например:
TransID SourceBinID DestBinID QTY Date Memo
---------------------------------------------------------------------------------
1 4 1 10 7-22-2011 Moved 10 Widgets...
Но вот где я запутался:
Допустим, сейчас полночь, и клиент заказывает 2 виджета с сайта. В корзине 5 виджетов. Клиент заплатил за свои 2 виджета, поэтому никто другой не может их купить, но сейчас полночь, и никто не работает, поэтому его виджеты все еще сидят в мусорном ведре. Мне нужна какая-то транзакция, которая уменьшает «продаваемое» количество виджетов без уменьшения их количества на полке.
На следующий день сотрудник выбирает эти виджеты и перемещает их в область упаковки. Теперь необходимо выполнить физическую транзакцию, чтобы заметить, что элементы теперь находятся на упаковочной линии и больше не находятся в их корзине. Но упаковка должна быть в особом месте, так как это не то же самое, что обычная корзина, верно? Так что каким-то образом нам нужно переместить вещи из корзины в специальное местоположение, не являющееся корзиной, и нам нужна запись транзакции для этого.
Есть и другие «особые» места, такие как карантин возврата и место для откладывания предметов, когда другие товары для этого заказа находятся в заупорядоченном порядке.
Если вы знаете книгу или онлайн-ресурс, который может объяснить, как это сделать с точки зрения программирования / базы данных, это было бы замечательно. Или, если кто-то уже знает, как это сделать и хотел бы поделиться, это тоже было бы здорово!
Спасибо!
UPDATE:
Я размышлял над этим, и вполне возможно, что «продаваемый» инвентарь (я думаю, он называется «на руках») мог бы быть рассчитан динамически. «Итого по всем лоткам» - «незаполненные заказы» = «на руках». Вопрос в том, будет ли это слишком медленно, чтобы быть практичным? Потребуется выполнить несколько запросов, а затем просмотреть результаты, чтобы получить общую сумму.
Альтернативой может быть отдельная таблица транзакций для «под рукой», но тогда у вас есть два инвентарных журнала - «под рукой» и «физический». Даже при том, что они должны всегда оставаться в синхронизации (если это не ошибка!), Это все еще не правильно?
Я все еще не уверен, что делать с физическими местами. Когда вы отправляете его, он уходит из инвентаря, но для учета в стиле двойной записи он должен куда-то идти. Так что мне понадобится какая-то «ушедшая» корзина. Но неправильно делать «мусор» и «упаковочный стол» «мусорными ведрами», потому что они на самом деле не являются мусорными ведрами.
ОБНОВЛЕНИЕ 3
Изменения:
MoveID TransID SourceBinID DestBinID Memo
---------------------------------------------------------------------------------
1 1 4 1 Moved 10 Widgets to bin 1
2 2 1 4 Received 10 Widgets from bin 4
Проблема:
IssueID TransID SourceBinID Memo
---------------------------------------------------------------------------------
1 3 4 Shipped Widget to Customer
2 4 1 Shipped Widget to Customer
Сделки:
TransID ItemID Date QTY Type
---------------------------------------------------------------------------------
1 1 7-22-2011 10 Move
2 1 7-22-2011 -10 Move
3 1 7-23-2011 1 Issue
4 1 7-24-2011 2 Issue
ОБНОВЛЕНИЕ 4
Хорошо, сейчас я собираюсь сделать еще один удар, без выделений.
Таблица Локаций - «Локация» - это место, где вещи могут «физически» существовать.
LocationID LocationTypeID LocationName
-------------------------------------------------------------
1 1 A Widget Bin
2 1 A Widget Bin
3 1 A Widget Bin
4 1 A Widget Bin
5 5 Vendor (nowhere)
6 3 Packing Table 1
7 4 Gone (shipped to customer)
Местоположение имеет «тип». Местоположение может быть корзиной, местоположением затоваривания, упаковочной таблицей или представлять клиента (для исходящих сообщений) или поставщика (для входящих).
Типы месторасположения
LocationTypeID LocationTypeName
-------------------------------------------------------------
1 Picking Bin
2 Overstock Bin
3 Packing/Shipping Table
4 Shipped Items
5 Vendor (for reviving)
Физические транзакции - когда все вокруг.
TransID LocationID Debit Credit Memo
-------------------------------------------------------------
1 5 10 Initial purchase of 10 Red Widgets
2 1 10 Initial purchase of 10 Red Widgets
3 1 2 Pick 2 Widgets AND....
4 3 2 Move them to the packing table
5 3 2 Ship Widgets to Customers
6 4 2 Customer Gets Widgets