This project is a modular, extensible Warehouse Operations Management System designed to manage and optimise core warehouse activities, including stock tracking, inventory location hierarchy, automated task allocation, replenishment, and transfer operations.
The system provides a rich domain model with real-world warehouse abstractions such as Warehouse, Area, Rack, Shelf, and Bin, organised in a hierarchical location model. It includes a robust task engine for picking, putaway, and replenishment, supported by strategy-driven logic and dynamic bin selection.
- Inherits from a central
Locationentity. - Manages physical layout: Warehouse β Area β Rack β Shelf β Bin
- Enables hierarchical navigation, location-based queries, and activity zoning.
- Tracks stock at both Bin-level (
StockLevel) and Warehouse-level (ItemStockLevel). - Includes unit of measure conversion for stock consistency.
- Supports multiple stock types and strategies.
- Uses
ItemReplenishmentConfigandReplenishmentStrategyto auto-generate replenishment tasks. - Supports minimum, maximum, reorder thresholds.
- Ensures availability through bin-aware restocking.
- Models intra- and inter-area movement via
StockTransferHeaderandStockTransferLine. - Transfer types (e.g., Replenishment, Picking) are defined in
TransferType. - Controlled via
ActivityAreaTransitionrules.
- Dynamically generates
PutawayTaskandPickTaskbased on current warehouse conditions and routing logic. - Tasks validate bin activity types (
Pick,Putaway,Bulk). - Supports grouping, prioritisation, and routing logic.
- Entity Inheritance: Core physical entities derive from
Locationto support polymorphism and clean hierarchy. - Service-Oriented Methods: Business logic is separated into service layers (e.g.,
PickingService,ReplenishmentService) to ensure clean controller-service separation. - Extensible Strategy Patterns: Strategy tables define Replenishment and task logic, making business rules configurable.
- Dynamic Location Codes: Auto-generated
FullLocationCodesupports barcode generation and intelligent routing. - Validation-Backed Design: Enforced task rules ensure logical consistency between bin and task types.
- π Minimise warehouse inefficiencies via optimal bin routing and replenishment strategies.
- π Increase pick accuracy and speed for forklift operators using picklists sorted by location route.
- π Streamline replenishment cycles based on real-time inventory thresholds.
- π Provide actionable insights into stock movement, task load, and bin utilisation.
- Database: Microsoft SQL Server
- ORM/Frameworks: Designed for use with .NET Core, Entity Framework Core, Code On Time (optional)
- Visualisation & Reporting: SQL Views, Materialised Location Trees, and possible integration with Power BI
- Interfaces: Can expose REST APIs or Razor Pages for external system interaction (e.g., WMS apps, handheld devices)
classDiagram
%% ================= Warehouse Structure =================
class Warehouse {
+int WarehouseID
+string Name
+string LocationCode
+string GeoCoordinates
+GetZones(): List<WarehouseZone>
+GetAvailableCapacity(): decimal
+SuggestPutawayZone(int itemID): WarehouseZone
}
class WarehouseZone {
+int WarehouseZoneID
+int WarehouseID
+string Name
+string Code
+string Description
+string ZoneType
+GetAreas(): List<WarehouseArea>
+IsTemperatureControlled(): bool
+IsSuitableForItem(int itemID): bool
+GetFreeSpace(): decimal
}
class WarehouseArea {
+int AreaID
+int WarehouseZoneID
+string Name
+string ActivityType
+bool IsActive
+GetRacks(): List<Rack>
+SupportsActivity(string activity): bool
+HasFreeBins(): bool
}
class Rack {
+int RackID
+int AreaID
+string Name
+GetShelves(): List<Shelf>
+GetHeight(): decimal
}
class Shelf {
+int ShelfID
+int RackID
+string Name
+GetBins(): List<Bin>
+GetWeightLimit(): decimal
}
class Bin {
+int BinID
+int ShelfID
+string Name
+int RouteOrder
+string FullLocationCode
+decimal MaxCapacity
+decimal CurrentLoad
+bool IsAvailableForPutaway()
+bool IsSuitableForItem(int itemID)
+decimal GetFreeCapacity()
+bool AssignItem(int itemID, decimal quantity)
}
%% ================= Items and Units =================
class Item {
+int ItemID
+string SKU
+string Name
+int UOM_ID
+bool RequiresColdStorage
+decimal VolumePerUnit
+GetAvailableStock(): decimal
+GetSuggestedPutawayBin(): Bin
+bool IsHazardous()
}
class UnitOfMeasure {
+int UOM_ID
+string Name
+decimal ConversionFactorToBase
+string Symbol
}
class ProductUnitOfConversion {
+int ConversionID
+int FromUOM_ID
+int ToUOM_ID
+decimal Ratio
+ConvertToBase(decimal qty): decimal
}
%% ================= Stock Levels =================
class StockLevel {
+int StockLevelID
+int ItemID
+int BinID
+decimal QuantityOnHand
+AdjustQuantity(decimal change)
+bool IsBinOverloaded()
}
class ItemStockLevel {
+int ItemStockLevelID
+int ItemID
+int WarehouseID
+decimal AvailableQuantity
+decimal ReservedQuantity
+Reserve(decimal qty)
+Release(decimal qty)
+RecalculateAvailability()
}
%% ================= Task Processing =================
class PutawayTask {
+int TaskID
+int ItemID
+decimal Quantity
+int SuggestedBinID
+ValidateBinActivity()
+ConfirmPutaway()
}
class PickTask {
+int TaskID
+int TaskGroupID
+int ItemID
+decimal Quantity
+int FromBinID
+ValidateBinActivity()
+MarkAsPicked()
}
%% ================= Replenishment =================
class ReplenishmentStrategy {
+int StrategyID
+string Name
+string Description
+ApplyStrategy(int itemID)
}
class ReplenishmentStrategyType {
+int StrategyTypeID
+string Name
}
class ItemReplenishmentConfig {
+int ConfigID
+int ItemID
+int StrategyID
+decimal MinQty
+decimal MaxQty
+decimal ReorderPoint
+NeedsReplenishment(decimal currentQty): bool
+GetReplenishmentQty(): decimal
}
%% ================= Stock Transfer =================
class StockTransferHeader {
+int TransferID
+int TransferTypeID
+int SourceAreaID
+int DestinationAreaID
+string CreatedBy
+string Status
+InitiateTransfer()
+MarkAsCompleted()
+ValidateTransfer()
}
class StockTransferLine {
+int LineID
+int TransferID
+int ItemID
+decimal Quantity
+int SourceBinID
+int DestinationBinID
+bool ValidateQuantity()
}
class TransferType {
+int TransferTypeID
+string Name
}
%% ================= Activity & Routing =================
class ActivityAreaTransition {
+int TransitionID
+string FromActivity
+string ToActivity
+bool IsAllowed
+ValidateTransition(string from, string to): bool
+ListAllowedNextSteps(string from): List<string>
}
%% ================= Relationships =================
Warehouse "1" --> "many" WarehouseZone
WarehouseZone "1" --> "many" WarehouseArea
WarehouseArea "1" --> "many" Rack
Rack "1" --> "many" Shelf
Shelf "1" --> "many" Bin
Item "1" --> "many" StockLevel
Warehouse "1" --> "many" ItemStockLevel
Item "1" --> "many" ItemReplenishmentConfig
StockTransferHeader "1" --> "many" StockTransferLine
TransferType "1" --> "many" StockTransferHeader