2025-05-14 04:27:31 +00:00
|
|
|
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';
|
2025-05-14 04:38:55 +00:00
|
|
|
import { useMachineCount, useMachineUptime, useMaterialCycle, useThroughPutData } from '../../../../store/builder/store';
|
2025-05-14 04:27:31 +00:00
|
|
|
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 { materials } = 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
|
|
|
|
// console.log('materialCycleTime: ', materialCycleTime);
|
|
|
|
const fetchProductSequenceData = async () => {
|
|
|
|
const productData = getProductById(selectedProduct.productId);
|
|
|
|
if (productData) {
|
|
|
|
const productSequenceData = await determineExecutionMachineSequences([productData]);
|
|
|
|
// console.log('productSequenceData: ', productSequenceData);
|
|
|
|
|
|
|
|
if (productSequenceData?.length > 0) {
|
|
|
|
let totalItems = 0;
|
|
|
|
let totalActiveTime = 0;
|
|
|
|
|
|
|
|
productSequenceData.forEach((sequence) => {
|
|
|
|
// console.log('sequence: ', 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 += 10;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
} 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 += 7;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
} else if (item.type === "storageUnit") {
|
|
|
|
storageUnits.filter(storage => storage.modelUuid === item.modelUuid)
|
|
|
|
.forEach(storage => {
|
|
|
|
if (storage.activeTime >= 0) {
|
|
|
|
// totalActiveTime += storage.activeTime;
|
|
|
|
// totalActiveTime += 9;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
totalItems += sequence.length;
|
|
|
|
});
|
|
|
|
|
|
|
|
setMachineCount(totalItems);
|
|
|
|
setMachineActiveTime(totalActiveTime);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
fetchProductSequenceData();
|
|
|
|
}, [products, selectedProduct, getProductById, setMachineCount, isPlaying, armBots, materialCycleTime]);
|
|
|
|
|
|
|
|
// Setting material cycle time
|
|
|
|
useEffect(() => {
|
|
|
|
materials.map((material) => {
|
|
|
|
// console.log('material: ', material);
|
|
|
|
// const totalCycleTime = material.endTime - material.startTime;//dynamic
|
|
|
|
const staticStartTime = 50;
|
|
|
|
const staticEndTime = 100;
|
|
|
|
const totalCycleTime = staticEndTime - staticStartTime;
|
|
|
|
setMaterialCycleTime(totalCycleTime)
|
|
|
|
|
|
|
|
})
|
|
|
|
}, [materials]);
|
|
|
|
|
|
|
|
|
|
|
|
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 (
|
|
|
|
<>
|
|
|
|
</>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// useEffect(() => {
|
|
|
|
// if (!isPlaying) return;
|
|
|
|
|
|
|
|
// const intervalMs = 1000
|
|
|
|
|
|
|
|
// if (!armBot.isActive && armBot.state == "idle" && (currentPhase == "rest" || currentPhase == "init") && !isIdleRef.current) {
|
|
|
|
// isIdleRef.current = true
|
|
|
|
|
|
|
|
// // Stop the timer
|
|
|
|
// // 🚨 1. Clear Active Timer
|
|
|
|
// if (activeTimerId.current) {
|
|
|
|
// clearInterval(activeTimerId.current);
|
|
|
|
// activeTimerId.current = null;
|
|
|
|
// }
|
|
|
|
// incrementActiveTime(armBot.modelUuid, activeSecondsElapsed.current)
|
|
|
|
// console.log(`✅ Active Cycle completed in ${activeSecondsElapsed.current} seconds`);
|
|
|
|
|
|
|
|
// // 🚨 2. Reset active timer seconds after logging
|
|
|
|
// // activeSecondsElapsed.current = 0;
|
|
|
|
|
|
|
|
// // 🚨 3. Start Idle Timer (clean old idle timer first)
|
|
|
|
// if (idleTimerId.current) {
|
|
|
|
// clearInterval(idleTimerId.current);
|
|
|
|
// idleTimerId.current = null;
|
|
|
|
// }
|
|
|
|
|
|
|
|
// idleSecondsElapsed.current = 0;
|
|
|
|
// idleTimerId.current = setInterval(() => {
|
|
|
|
// if (!isPausedRef.current) {
|
|
|
|
// idleSecondsElapsed.current += 1;
|
|
|
|
// console.log(`🕒 Idle Timer: ${idleSecondsElapsed.current} seconds`);
|
|
|
|
// }
|
|
|
|
// }, intervalMs);
|
|
|
|
// }
|
|
|
|
// if (armBot.isActive && armBot.state != "idle" && currentPhase !== "rest" && armBot.currentAction && isIdleRef.current) {
|
|
|
|
// isIdleRef.current = false
|
|
|
|
|
|
|
|
// if (armBot.currentAction) {
|
|
|
|
// // 🚨 Clear Idle Timer
|
|
|
|
// if (idleTimerId.current) {
|
|
|
|
// clearInterval(idleTimerId.current);
|
|
|
|
// idleTimerId.current = null;
|
|
|
|
// }
|
|
|
|
// incrementIdleTime(armBot.modelUuid, idleSecondsElapsed.current)
|
|
|
|
// console.log(`🕒 Idle Cycle completed in: ${idleSecondsElapsed.current} seconds`);
|
|
|
|
// idleSecondsElapsed.current = 0;
|
|
|
|
|
|
|
|
// // 🚨 Start Active Timer
|
|
|
|
// if (activeTimerId.current) {
|
|
|
|
// clearInterval(activeTimerId.current);
|
|
|
|
// }
|
|
|
|
// // activeSecondsElapsed.current = 0;
|
|
|
|
// activeTimerId.current = setInterval(() => {
|
|
|
|
// if (!isPausedRef.current) {
|
|
|
|
// activeSecondsElapsed.current += 1
|
|
|
|
// console.log(`🕒 Active Timer: ${activeSecondsElapsed.current} seconds`);
|
|
|
|
// }
|
|
|
|
// }, intervalMs);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
|
|
|
|
// }, [armBot, currentPhase, isPlaying])
|