feat: implement a new simulation analyzer component to track and analyze various performance metrics and material flow.
This commit is contained in:
@@ -245,15 +245,51 @@ function Analyzer() {
|
||||
setAnalyzing(false);
|
||||
};
|
||||
|
||||
// Simulation Time Tracking
|
||||
const simulationTimeRef = useRef<number>(0);
|
||||
const lastSpeedUpdateRef = useRef<number>(Date.now());
|
||||
const prevSpeedRef = useRef<number>(speed); // Initialize with current speed
|
||||
|
||||
// Reset accumulated time when simulation stops/starts
|
||||
useEffect(() => {
|
||||
if (!isPlaying) {
|
||||
resetAllRefs();
|
||||
simulationTimeRef.current = 0;
|
||||
lastSpeedUpdateRef.current = Date.now();
|
||||
} else {
|
||||
// Reset start time when simulation starts
|
||||
startTimeRef.current = new Date().toISOString();
|
||||
simulationTimeRef.current = 0;
|
||||
lastSpeedUpdateRef.current = Date.now();
|
||||
}
|
||||
}, [isPlaying]);
|
||||
|
||||
// Track accumulated simulation time on speed change
|
||||
useEffect(() => {
|
||||
if (!isPlaying) {
|
||||
prevSpeedRef.current = speed;
|
||||
return;
|
||||
}
|
||||
|
||||
const now = Date.now();
|
||||
const deltaReal = now - lastSpeedUpdateRef.current;
|
||||
|
||||
// Add time segment using previous speed
|
||||
simulationTimeRef.current += deltaReal * Math.max(1, prevSpeedRef.current);
|
||||
|
||||
lastSpeedUpdateRef.current = now;
|
||||
prevSpeedRef.current = speed; // Update for next segment
|
||||
}, [speed, isPlaying]);
|
||||
|
||||
const getSimulationDuration = () => {
|
||||
if (!isPlaying) return simulationTimeRef.current;
|
||||
|
||||
const now = Date.now();
|
||||
const deltaReal = now - lastSpeedUpdateRef.current;
|
||||
// Current accumulating segment uses current speed
|
||||
return simulationTimeRef.current + deltaReal * Math.max(1, speed);
|
||||
};
|
||||
|
||||
// ============================================================================
|
||||
// ENHANCED UTILITY FUNCTIONS
|
||||
// ============================================================================
|
||||
@@ -326,12 +362,12 @@ function Analyzer() {
|
||||
const wip = materialsOnAsset;
|
||||
|
||||
// Calculate throughput (items per second)
|
||||
// Ensure we don't divide by zero
|
||||
const durationMs = Date.now() - new Date(startTimeRef.current).getTime();
|
||||
// Use accumulated simulation duration
|
||||
const durationMs = getSimulationDuration();
|
||||
|
||||
// Normalize by simulation speed to get "simulation time" throughput
|
||||
const currentSpeed = Math.max(1, speed);
|
||||
const throughput = durationMs > 1000 ? ((removals.length / durationMs) * 1000) / currentSpeed : 0;
|
||||
// Throughput = items / simulation seconds
|
||||
// durationMs is already in "simulation milliseconds" (real ms * speed)
|
||||
const throughput = durationMs > 1000 ? (removals.length / durationMs) * 1000 : 0;
|
||||
|
||||
// Calculate lead times (processing times on this asset)
|
||||
const leadTimes = removals.map((m) => m.processingTime || 0).filter((t) => t > 0);
|
||||
@@ -1975,7 +2011,6 @@ function Analyzer() {
|
||||
};
|
||||
});
|
||||
|
||||
// Material Flow Analysis
|
||||
// Material Flow Analysis
|
||||
const totalMaterialsInSystem = materials.filter((m) => m.isActive).length;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user