import { useEffect } from 'react'; import { useProductStore } from '../../../../store/simulation/useProductStore'; import { determineExecutionMachineSequences } from '../../simulator/functions/determineExecutionMachineSequences'; import { useMachineCount, useMachineUptime, useMaterialCycle, useProcessBar, useThroughPutData } from '../../../../store/builder/store'; import { usePlayButtonStore } from '../../../../store/usePlayButtonStore'; import { useSceneContext } from '../../../scene/sceneContext'; import { useProductContext } from '../../products/productContext'; export default function ThroughPutData() { const { materialStore, armBotStore, machineStore, conveyorStore, vehicleStore, storageUnitStore } = useSceneContext(); const { selectedProductStore } = useProductContext(); const { selectedProduct } = selectedProductStore(); const { products, getProductById } = useProductStore(); const { armBots } = armBotStore(); const { vehicles } = vehicleStore(); const { machines } = machineStore(); const { conveyors } = conveyorStore(); const { storageUnits } = storageUnitStore(); const { materialHistory } = materialStore(); const { machineCount, setMachineCount } = useMachineCount(); const { machineActiveTime, setMachineActiveTime } = useMachineUptime(); const { materialCycleTime, setMaterialCycleTime } = useMaterialCycle(); const { setProcessBar } = useProcessBar(); const { setThroughputData } = useThroughPutData() const { isPlaying } = usePlayButtonStore(); // Setting machine count let totalItems = 0; let totalActiveTime = 0; useEffect(() => { if (!isPlaying) { totalActiveTime = 0; totalItems = 0; setMachineCount(0); setMachineActiveTime(0); setMaterialCycleTime(0); setProcessBar([]); setThroughputData(0); return; } else { let process: any = []; const fetchProductSequenceData = async () => { const productData = getProductById(selectedProduct.productUuid); if (productData) { const productSequenceData = await determineExecutionMachineSequences([productData]) if (productSequenceData?.length > 0) { productSequenceData.forEach((sequence) => { sequence.forEach((item) => { if (item.type === "roboticArm") { armBots.filter(arm => arm.modelUuid === item.modelUuid) .forEach(arm => { if (arm.activeTime >= 0) { process.push({ modelid: arm.modelUuid, modelName: arm.modelName, activeTime: arm?.activeTime }) totalActiveTime += arm.activeTime; } }); } else if (item.type === "vehicle") { vehicles.filter(vehicle => vehicle.modelUuid === item.modelUuid) .forEach(vehicle => { if (vehicle.activeTime >= 0) { process.push({ modelid: vehicle.modelUuid, modelName: vehicle.modelName, activeTime: vehicle?.activeTime }) totalActiveTime += vehicle.activeTime; } }); } else if (item.type === "machine") { machines.filter(machine => machine.modelUuid === item.modelUuid) .forEach(machine => { if (machine.activeTime >= 0) { process.push({ modelid: machine.modelUuid, modelName: machine.modelName, activeTime: machine?.activeTime }) totalActiveTime += machine.activeTime; } }); } else if (item.type === "transfer") { conveyors.filter(conveyor => conveyor.modelUuid === item.modelUuid) .forEach(conveyor => { if (conveyor.activeTime >= 0) { totalActiveTime += conveyor.activeTime; } }); } else if (item.type === "storageUnit") { storageUnits.filter(storage => storage.modelUuid === item.modelUuid) .forEach(storage => { if (storage.activeTime >= 0) { totalActiveTime += storage.activeTime; } }); } }); totalItems += sequence.length; }); setMachineCount(totalItems); setMachineActiveTime(totalActiveTime); let arr = process.map((item: any) => ({ name: item.modelName, completed: Math.round((item.activeTime / totalActiveTime) * 100) })); setProcessBar(arr); } } }; fetchProductSequenceData(); } // if (materialCycleTime <= 0) return }, [products, selectedProduct, getProductById, setMachineCount, materialCycleTime, armBots, vehicles, machines]); // 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) / 1000; // Convert milliseconds to seconds setMaterialCycleTime(Number(totalCycleTime.toFixed(2))); // Set the material cycle time in the store }); }, [materialHistory]); useEffect(() => { if (machineActiveTime > 0 && materialCycleTime > 0 && machineCount > 0) { const utilization = machineActiveTime / 3600; // Active time per hour const unitsPerMachinePerHour = 3600 / materialCycleTime; const throughput = unitsPerMachinePerHour * machineCount * utilization; setThroughputData(throughput.toFixed(2)); // Set throughput to state/store // console.log('---Throughput Results---'); // console.log('Machine Active Time (s):', machineActiveTime); // console.log('Material Cycle Time (s):', materialCycleTime); // console.log('Machine Count:', machineCount); // console.log('Utilization:', utilization); // console.log('Throughput (units/hr):', throughput); } }, [machineActiveTime, materialCycleTime, machineCount]); return ( <> ); }