import React, { useEffect, useRef, useState } from 'react'; import { useSelectedProduct } from '../../../../store/simulation/useSimulationStore'; import { useProductStore } from '../../../../store/simulation/useProductStore'; import { determineExecutionMachineSequences } from '../../simulator/functions/determineExecutionMachineSequences'; import { useArmBotStore } from '../../../../store/simulation/useArmBotStore'; import { useMachineCount, useMachineUptime, useMaterialCycle, useThroughPutData } from '../../../../store/builder/store'; import { useVehicleStore } from '../../../../store/simulation/useVehicleStore'; import { useMachineStore } from '../../../../store/simulation/useMachineStore'; import { useConveyorStore } from '../../../../store/simulation/useConveyorStore'; import { useStorageUnitStore } from '../../../../store/simulation/useStorageUnitStore'; import { useMaterialStore } from '../../../../store/simulation/useMaterialStore'; import { usePauseButtonStore, usePlayButtonStore } from '../../../../store/usePlayButtonStore'; export default function ThroughPutData() { const { selectedProduct } = useSelectedProduct(); const { products, getProductById } = useProductStore(); const { armBots, incrementActiveTime, incrementIdleTime } = useArmBotStore(); const { vehicles } = useVehicleStore(); const { machines } = useMachineStore(); const { conveyors } = useConveyorStore(); const { storageUnits } = useStorageUnitStore(); const { materialHistory } = useMaterialStore(); const { machineCount, setMachineCount } = useMachineCount(); const { machineActiveTime, setMachineActiveTime } = useMachineUptime(); const { materialCycleTime, setMaterialCycleTime } = useMaterialCycle(); // const [totalActiveTime, setTotalActiveTime] = useState(0); const { setThroughputData } = useThroughPutData() // <=== ADD THIS const { isPlaying } = usePlayButtonStore(); // Setting machine count useEffect(() => { if (materialCycleTime < 0) return const fetchProductSequenceData = async () => { const productData = getProductById(selectedProduct.productId); if (productData) { const productSequenceData = await determineExecutionMachineSequences([productData]) if (productSequenceData?.length > 0) { let totalItems = 0; let totalActiveTime = 0; productSequenceData.forEach((sequence) => { sequence.forEach((item) => { if (item.type === "roboticArm") { armBots.filter(arm => arm.modelUuid === item.modelUuid) .forEach(arm => { if (arm.activeTime >= 0) { totalActiveTime += arm.activeTime; } }); } else if (item.type === "vehicle") { vehicles.filter(vehicle => vehicle.modelUuid === item.modelUuid) .forEach(vehicle => { if (vehicle.activeTime >= 0) { // totalActiveTime += vehicle.activeTime; totalActiveTime += 34; } }); } else if (item.type === "machine") { machines.filter(machine => machine.modelUuid === item.modelUuid) .forEach(machine => { if (machine.activeTime >= 0) { // totalActiveTime += machine.activeTime; totalActiveTime += 12; } }); } else if (item.type === "transfer") { conveyors.filter(conveyor => conveyor.modelUuid === item.modelUuid) .forEach(conveyor => { if (conveyor.activeTime >= 0) { // totalActiveTime += conveyor.activeTime; totalActiveTime += 89; } }); } else if (item.type === "storageUnit") { storageUnits.filter(storage => storage.modelUuid === item.modelUuid) .forEach(storage => { if (storage.activeTime >= 0) { // totalActiveTime += storage.activeTime; totalActiveTime += 45; } }); } }); totalItems += sequence.length; }); setMachineCount(totalItems); setMachineActiveTime(totalActiveTime); } } }; fetchProductSequenceData(); }, [products, selectedProduct, getProductById, setMachineCount, isPlaying, armBots, materialCycleTime]); // Setting material cycle time useEffect(() => { materialHistory.forEach((material) => { const start = material.material.startTime ?? 0; const end = material.material.endTime ?? 0; if (start === 0 || end === 0) return; const totalCycleTime = end - start; setMaterialCycleTime(totalCycleTime.toFixed(2)); // Set the material cycle time in the store }); }, [materialHistory]); useEffect(() => { if (machineActiveTime > 0 && materialCycleTime > 0 && machineCount > 0) { const avgProcessTime = (machineActiveTime / materialCycleTime) * 100; // % value const throughput = (3600 / materialCycleTime) * machineCount * (avgProcessTime / 100); // ✅ division by 100 setThroughputData(throughput.toFixed(2)); // Set the throughput data in the store console.log('---Throughput Results---'); console.log('Total Active Time:', machineActiveTime); console.log('Material Cycle Time:', materialCycleTime); console.log('Machine Count:', machineCount); console.log('Average Process Time (%):', avgProcessTime); console.log('Calculated Throughput:', throughput); } }, [machineActiveTime, materialCycleTime, machineCount]); return ( <> ); }