Skip to content

Purplewells/WMS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

3 Commits
Β 
Β 

Repository files navigation

Warehouse Operations Management System

🧭 Project Overview

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.

🧱 Key Functional Domains

1. πŸ“ Location Management

  • Inherits from a central Location entity.
  • Manages physical layout: Warehouse β†’ Area β†’ Rack β†’ Shelf β†’ Bin
  • Enables hierarchical navigation, location-based queries, and activity zoning.

2. πŸ“¦ Inventory Management

  • 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.

3. πŸ” Replenishment Engine

  • Uses ItemReplenishmentConfig and ReplenishmentStrategy to auto-generate replenishment tasks.
  • Supports minimum, maximum, reorder thresholds.
  • Ensures availability through bin-aware restocking.

4. 🚚 Transfer Management

  • Models intra- and inter-area movement via StockTransferHeader and StockTransferLine.
  • Transfer types (e.g., Replenishment, Picking) are defined in TransferType.
  • Controlled via ActivityAreaTransition rules.

5. πŸ“‹ Task Automation

  • Dynamically generates PutawayTask and PickTask based on current warehouse conditions and routing logic.
  • Tasks validate bin activity types (Pick, Putaway, Bulk).
  • Supports grouping, prioritisation, and routing logic.

βš™οΈ Architectural Highlights

  • Entity Inheritance: Core physical entities derive from Location to 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 FullLocationCode supports barcode generation and intelligent routing.
  • Validation-Backed Design: Enforced task rules ensure logical consistency between bin and task types.

πŸ’‘ Intended Outcomes

  • πŸ“‰ 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.

πŸ› οΈ Tech Stack

  • 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)

Proposed Data Model

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

Loading

About

This project explores the operational flows and management related to a warehouse management system.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors