Pick Execution Service - Class Diagrams
Domain Model Overview
classDiagram
class PickSession {
<<Aggregate Root>>
-String sessionId
-String pickerId
-String waveId
-PickStrategy strategy
-SessionStatus status
-List~PickList~ pickLists
-PickPath optimizedPath
-PickCart cart
-DateTime startTime
-DateTime endTime
-PickMetrics metrics
-List~PickConfirmation~ confirmations
+start() void
+pause(reason) void
+resume() void
+complete() void
+addPickList(pickList) void
+optimizePath() void
+confirmPick(pickId, quantity) void
+reportShortage(pickId, available) void
+skipPick(pickId, reason) void
+calculateProgress() Progress
}
class PickList {
<<Entity>>
-String pickListId
-String orderId
-List~PickLine~ lines
-PickPriority priority
-DateTime dueTime
-PickListStatus status
+addLine(line) void
+removeLine(lineId) void
+markPicked(lineId) void
+calculateCompletion() Percentage
+validate() boolean
}
class PickLine {
<<Entity>>
-String lineId
-String skuCode
-String productName
-PickLocation location
-int requestedQuantity
-int pickedQuantity
-String unitOfMeasure
-PickLineStatus status
-List~PickAttribute~ attributes
+pick(quantity) void
+partial(quantity) void
+skip(reason) void
+substitute(newSku) void
}
class PickLocation {
<<Value Object>>
-String locationId
-String zone
-String aisle
-String bay
-String shelf
-String bin
-LocationType type
-Coordinates coordinates
+getFullPath() String
+calculateDistance(other) Distance
+isInZone(zone) boolean
}
class PickPath {
<<Entity>>
-String pathId
-List~PathSegment~ segments
-double totalDistance
-Duration estimatedTime
-OptimizationMethod method
+addSegment(segment) void
+optimize() void
+getNextLocation() PickLocation
+recalculate() void
}
class PickStrategy {
<<Enumeration>>
DISCRETE
BATCH
ZONE
WAVE
CLUSTER
CART_PICK
}
PickSession "1" --> "*" PickList : contains
PickList "1" --> "*" PickLine : contains
PickLine "1" --> "1" PickLocation : has
PickSession "1" --> "1" PickPath : follows
PickSession "1" --> "1" PickStrategy : uses
Path Optimization Engine
classDiagram
class PathOptimizationEngine {
<<Domain Service>>
-WarehouseLayout layout
-OptimizationAlgorithm algorithm
-CongestionAnalyzer congestion
+optimizePath(picks) OptimalPath
+optimizeBatchPath(sessions) List~OptimalPath~
-calculateShortestPath(locations) Path
-avoidCongestion(path) Path
-considerZoneConstraints(path) Path
}
class OptimizationAlgorithm {
<<Strategy Interface>>
+optimize(locations) OptimalPath
}
class TSPAlgorithm {
<<Strategy>>
-HeuristicType heuristic
+optimize(locations) OptimalPath
-nearestNeighbor(locations) Path
-twoOpt(path) Path
-simulatedAnnealing(path) Path
}
class SShapeAlgorithm {
<<Strategy>>
+optimize(locations) OptimalPath
-traverseAisles(locations) Path
-minimizeBacktracking() void
}
class ReturnRouteAlgorithm {
<<Strategy>>
+optimize(locations) OptimalPath
-createReturnPath(locations) Path
-optimizeReturnTrip() void
}
class WarehouseLayout {
<<Entity>>
-String warehouseId
-Graph~Location~ locationGraph
-List~Zone~ zones
-List~Aisle~ aisles
-Map~String, Distance~ distanceMatrix
+getDistance(from, to) Distance
+getPath(from, to) List~Location~
+getZoneLayout(zoneId) ZoneLayout
}
class CongestionAnalyzer {
<<Service>>
-HeatMap currentHeatMap
-List~CongestionZone~ congestedAreas
+analyzeCongestion() CongestionReport
+predictCongestion(time) List~CongestionZone~
+suggestAlternativePath(path) Path
}
PathOptimizationEngine --> OptimizationAlgorithm : uses
OptimizationAlgorithm <|.. TSPAlgorithm
OptimizationAlgorithm <|.. SShapeAlgorithm
OptimizationAlgorithm <|.. ReturnRouteAlgorithm
PathOptimizationEngine --> WarehouseLayout : uses
PathOptimizationEngine --> CongestionAnalyzer : consults
Batch and Zone Picking
classDiagram
class BatchPickManager {
<<Domain Service>>
-BatchingStrategy strategy
-int maxBatchSize
-int maxOrders
+createBatch(orders) PickBatch
+optimizeBatch(batch) void
+splitBatch(batch) List~PickBatch~
-groupOrders(orders) List~OrderGroup~
-assignToCart(batch) CartAssignment
}
class PickBatch {
<<Entity>>
-String batchId
-List~Order~ orders
-List~PickLocation~ locations
-BatchStatus status
-PickCart assignedCart
-DateTime createdAt
+addOrder(order) void
+removeOrder(orderId) void
+consolidateLocations() void
+validate() boolean
}
class ZonePickCoordinator {
<<Domain Service>>
-Map~Zone, ZonePicker~ zonePickers
-ZoneSequence sequence
+coordinatePicking(wave) ZonePickPlan
+assignToZones(picks) Map~Zone, List~Pick~~
+sequenceZones(zones) List~Zone~
-balanceZoneWorkload(assignments) void
}
class PutWallManager {
<<Entity>>
-String putWallId
-List~PutWallSlot~ slots
-Map~String, String~ orderSlotMapping
-PutWallStatus status
+assignSlot(orderId) SlotNumber
+putItem(slotNumber, item) void
+completeOrder(orderId) void
+clearSlot(slotNumber) void
+getAvailableSlots() List~PutWallSlot~
}
class PutWallSlot {
<<Entity>>
-int slotNumber
-String assignedOrderId
-List~Item~ items
-SlotStatus status
-Indicator lightIndicator
+addItem(item) void
+removeItem(itemId) void
+complete() void
+clear() void
+illuminate() void
}
class ClusterPicking {
<<Domain Service>>
-ClusterStrategy strategy
-int clusterSize
+createClusters(orders) List~PickCluster~
+optimizeCluster(cluster) void
-groupByProximity(orders) List~OrderGroup~
-assignToSections(cluster) void
}
BatchPickManager --> PickBatch : creates
ZonePickCoordinator --> PickSession : coordinates
PutWallManager "1" --> "*" PutWallSlot : manages
ClusterPicking --> PickBatch : organizes
Pick Confirmation and Validation
classDiagram
class PickConfirmationService {
<<Domain Service>>
-BarcodeValidator barcodeValidator
-QuantityValidator quantityValidator
-LocationValidator locationValidator
+confirmPick(confirmation) ConfirmationResult
+validateBarcode(barcode, expected) boolean
+validateQuantity(picked, requested) boolean
+validateLocation(scanned, expected) boolean
}
class PickConfirmation {
<<Value Object>>
-String pickLineId
-String scannedBarcode
-String scannedLocation
-int pickedQuantity
-DateTime confirmedAt
-String confirmedBy
-ConfirmationMethod method
+validate() boolean
}
class ShortageHandler {
<<Domain Service>>
-ShortagePolicy policy
-SubstitutionService substitution
+handleShortage(pick, available) ShortageResolution
+suggestSubstitute(sku) List~Substitute~
+allocatePartial(pick, available) PartialAllocation
+reportShortage(shortage) void
}
class PickException {
<<Entity>>
-String exceptionId
-String pickLineId
-ExceptionType type
-String description
-Resolution resolution
-DateTime reportedAt
-String reportedBy
+resolve(resolution) void
+escalate() void
}
class PickAccuracyTracker {
<<Service>>
-Map~String, AccuracyMetrics~ operatorMetrics
-double targetAccuracy
+recordPick(pick, confirmation) void
+calculateAccuracy(operatorId) double
+identifyErrors(period) List~PickError~
+generateAccuracyReport() Report
}
PickConfirmationService --> PickConfirmation : validates
PickConfirmationService --> ShortageHandler : delegates
ShortageHandler --> PickException : creates
PickAccuracyTracker --> PickConfirmation : tracks
Mobile Picking Interface
classDiagram
class MobilePickingAPI {
<<API Controller>>
-PickSessionService sessionService
-PathService pathService
+startSession(pickerId) SessionDto
+getNextPick(sessionId) PickInstructionDto
+confirmPick(confirmation) ConfirmationResponse
+reportIssue(issue) IssueResponse
+completeSession(sessionId) CompletionResponse
}
class PickInstruction {
<<DTO>>
-String pickLineId
-String skuCode
-String productName
-String productImage
-LocationDto location
-int quantity
-String unitOfMeasure
-NavigationDto navigation
+toDisplay() DisplayInstruction
}
class VoicePickingService {
<<Service>>
-VoiceEngine engine
-CommandParser parser
+processVoiceCommand(audio) Command
+generateVoicePrompt(instruction) AudioPrompt
+confirmVoicePick(confirmation) VoiceResponse
}
class RFScannerIntegration {
<<Integration Service>>
-ScannerDriver driver
-BarcodeDecoder decoder
+processScan(scanData) ScanResult
+validateScan(scan, expected) boolean
+triggerScan() void
}
class ARNavigationService {
<<Service>>
-AREngine arEngine
-IndoorPositioning positioning
+generateARPath(from, to) ARNavigation
+showPickLocation(location) ARMarker
+updatePosition(position) void
}
MobilePickingAPI --> PickInstruction : returns
MobilePickingAPI --> VoicePickingService : integrates
MobilePickingAPI --> RFScannerIntegration : uses
MobilePickingAPI --> ARNavigationService : enhances
classDiagram
class PickPerformanceAnalyzer {
<<Analytics Service>>
-MetricsCollector collector
-BenchmarkService benchmark
+analyzePerformance(period) PerformanceReport
+calculatePickRate(operator) PickRate
+identifyBottlenecks() List~Bottleneck~
+compareToTarget(actual, target) Variance
}
class PickMetrics {
<<Entity>>
-String sessionId
-int totalPicks
-int completedPicks
-int shortPicks
-Duration totalTime
-double travelDistance
-double accuracy
-List~ErrorMetric~ errors
+calculateProductivity() double
+calculateUPH() double
+getAveragePickTime() Duration
}
class HeatMapGenerator {
<<Service>>
-LocationTracker tracker
-DensityCalculator calculator
+generateHeatMap(period) HeatMap
+identifyHotspots() List~Hotspot~
+suggestReorganization() ReorgPlan
}
class PickForecastService {
<<Service>>
-MLModel model
-HistoricalData history
+forecastVolume(period) VolumeForcast
+predictPeakTimes() List~PeakPeriod~
+estimateResources(volume) ResourceRequirement
}
PickPerformanceAnalyzer --> PickMetrics : analyzes
PickPerformanceAnalyzer --> HeatMapGenerator : uses
PickPerformanceAnalyzer --> PickForecastService : consults
Domain Events
classDiagram
class PickEvent {
<<Abstract Event>>
-String eventId
-String sessionId
-String pickerId
-DateTime occurredAt
+getEventType() String
}
class PickSessionStartedEvent {
<<Event>>
-String waveId
-int pickCount
-PickStrategy strategy
+getEventType() String
}
class PickConfirmedEvent {
<<Event>>
-String pickLineId
-String skuCode
-int quantity
-PickLocation location
+getEventType() String
}
class PickShortageEvent {
<<Event>>
-String pickLineId
-int requested
-int available
-ShortageReason reason
+getEventType() String
}
class PickSessionCompletedEvent {
<<Event>>
-PickMetrics metrics
-Duration duration
-CompletionStatus status
+getEventType() String
}
class PathOptimizedEvent {
<<Event>>
-double originalDistance
-double optimizedDistance
-double improvement
+getEventType() String
}
PickEvent <|-- PickSessionStartedEvent
PickEvent <|-- PickConfirmedEvent
PickEvent <|-- PickShortageEvent
PickEvent <|-- PickSessionCompletedEvent
PickEvent <|-- PathOptimizedEvent