integerated product context to scene context

This commit is contained in:
2025-09-05 15:54:38 +05:30
parent 9904a5079d
commit 23570d7007
67 changed files with 2573 additions and 4197 deletions

View File

@@ -1,22 +1,19 @@
import React, { useEffect } from 'react'
import { CompareProduct, useCompareProductDataStore, useInputValues, useMachineDowntime, useMachineUptime, useProductionCapacityData, useROISummaryData, useThroughPutData } from '../../../../store/builder/store';
import { usePlayButtonStore } from '../../../../store/ui/usePlayButtonStore';
import { useProductContext } from '../../products/productContext';
import { useSceneContext } from '../../../scene/sceneContext';
import { useEffect } from "react";
import { CompareProduct, useCompareProductDataStore, useInputValues, useMachineDowntime, useMachineUptime, useProductionCapacityData, useROISummaryData, useThroughPutData } from "../../../../store/builder/store";
import { usePlayButtonStore } from "../../../../store/ui/usePlayButtonStore";
import { useSceneContext } from "../../../scene/sceneContext";
export default function ROIData() {
const { selectedProductStore } = useProductContext();
const { inputValues } = useInputValues();
const { productionCapacityData } = useProductionCapacityData()
const { selectedProduct } = selectedProductStore();
const { productionCapacityData } = useProductionCapacityData();
const { isPlaying } = usePlayButtonStore();
const { setRoiSummaryData } = useROISummaryData();
const { productStore } = useSceneContext();
const { getProductById } = productStore();
const { getProductById, selectedProduct } = productStore();
const { compareProductsData, setCompareProductsData } = useCompareProductDataStore();
const { machineActiveTime } = useMachineUptime();
const { machineIdleTime } = useMachineDowntime();
const { throughputData } = useThroughPutData()
const { throughputData } = useThroughPutData();
useEffect(() => {
if (isPlaying) return;
@@ -47,10 +44,7 @@ export default function ROIData() {
const shiftsPerDay = parseFloat(inputValues["Shifts / day"]);
const workingDaysPerYear = parseFloat(inputValues["Working days / year"]);
if (!isNaN(electricityCost) && !isNaN(fixedCost) && !isNaN(laborCost) && !isNaN(maintenanceCost) &&
!isNaN(materialCost) && !isNaN(productionPeriod) && !isNaN(salvageValue) && !isNaN(sellingPrice) &&
!isNaN(shiftLength) && !isNaN(shiftsPerDay) && !isNaN(workingDaysPerYear) && productionCapacityData > 0) {
if (!isNaN(electricityCost) && !isNaN(fixedCost) && !isNaN(laborCost) && !isNaN(maintenanceCost) && !isNaN(materialCost) && !isNaN(productionPeriod) && !isNaN(salvageValue) && !isNaN(sellingPrice) && !isNaN(shiftLength) && !isNaN(shiftsPerDay) && !isNaN(workingDaysPerYear) && productionCapacityData > 0) {
// const totalHoursPerYear = shiftLength * shiftsPerDay * workingDaysPerYear;
// const annualProductionUnits = productionCapacityData * totalHoursPerYear;
// const annualRevenue = annualProductionUnits * sellingPrice;
@@ -120,20 +114,20 @@ export default function ROIData() {
// setCompareProductsData([...prev, newData]);
// }
const Annual_units = throughputData * workingDaysPerYear
const Total_units = Annual_units * productionPeriod
const Annual_units = throughputData * workingDaysPerYear;
const Total_units = Annual_units * productionPeriod;
const Total_revenue = Total_units * sellingPrice
const Total_variable_cost = Total_units * (materialCost + (laborCost))
const Total_revenue = Total_units * sellingPrice;
const Total_variable_cost = Total_units * (materialCost + laborCost);
const Total_fixed_cost = (maintenanceCost + electricityCost + fixedCost) * workingDaysPerYear * productionPeriod
const Total_cost = Total_variable_cost + Total_fixed_cost
const Total_fixed_cost = (maintenanceCost + electricityCost + fixedCost) * workingDaysPerYear * productionPeriod;
const Total_cost = Total_variable_cost + Total_fixed_cost;
const Net_profit = Total_revenue - Total_cost + (salvageValue * workingDaysPerYear * productionPeriod)
const Net_profit = Total_revenue - Total_cost + salvageValue * workingDaysPerYear * productionPeriod;
const ROI = (Net_profit / initialInvestment) * 100
const ROI = (Net_profit / initialInvestment) * 100;
const Annual_net_profit = (Annual_units * (sellingPrice - materialCost - laborCost)) - (maintenanceCost + electricityCost + fixedCost) * workingDaysPerYear + (salvageValue * workingDaysPerYear)
const Annual_net_profit = Annual_units * (sellingPrice - materialCost - laborCost) - (maintenanceCost + electricityCost + fixedCost) * workingDaysPerYear + salvageValue * workingDaysPerYear;
const Payback_period_years = initialInvestment / Annual_net_profit;
setRoiSummaryData({
@@ -143,15 +137,14 @@ export default function ROIData() {
totalCost: Total_cost,
revenueGenerated: Total_revenue,
netProfit: Net_profit > 0 ? Net_profit : 0,
netLoss: Net_profit < 0 ? -Net_profit : 0
netLoss: Net_profit < 0 ? -Net_profit : 0,
});
const productData = getProductById(selectedProduct.productUuid);
const prev = useCompareProductDataStore.getState().compareProductsData;
const newData: CompareProduct = {
productUuid: productData?.productUuid ?? '',
productName: productData?.productName ?? '',
productUuid: productData?.productUuid ?? "",
productName: productData?.productName ?? "",
simulationData: {
// costPerUnit: costPerUnit,
// workingDaysPerYear: workingDaysPerYear,
@@ -168,12 +161,10 @@ export default function ROIData() {
machineIdleTime: machineIdleTime,
machineActiveTime: machineActiveTime,
throughputData: throughputData,
}
},
};
const existingIndex = prev.findIndex((item: CompareProduct) =>
item.productUuid === productData?.productUuid
);
const existingIndex = prev.findIndex((item: CompareProduct) => item.productUuid === productData?.productUuid);
if (existingIndex !== -1) {
const updated = [...prev];
@@ -183,12 +174,9 @@ export default function ROIData() {
setCompareProductsData([...prev, newData]);
}
}
}, [inputValues, productionCapacityData, throughputData, isPlaying]);
useEffect(() => {
}, [compareProductsData])
useEffect(() => {}, [compareProductsData]);
return null;
}

View File

@@ -1,15 +1,12 @@
import { useEffect } from 'react';
import { determineExecutionMachineSequences } from '../../simulator/functions/determineExecutionMachineSequences';
import { useInputValues, useMachineCount, useMachineDowntime, useMachineUptime, useMaterialCycle, useProcessBar, useThroughPutData } from '../../../../store/builder/store';
import { usePlayButtonStore } from '../../../../store/ui/usePlayButtonStore';
import { useSceneContext } from '../../../scene/sceneContext';
import { useProductContext } from '../../products/productContext';
import { useEffect } from "react";
import { determineExecutionMachineSequences } from "../../simulator/functions/determineExecutionMachineSequences";
import { useInputValues, useMachineCount, useMachineDowntime, useMachineUptime, useMaterialCycle, useProcessBar, useThroughPutData } from "../../../../store/builder/store";
import { usePlayButtonStore } from "../../../../store/ui/usePlayButtonStore";
import { useSceneContext } from "../../../scene/sceneContext";
export default function ThroughPutData() {
const { materialStore, armBotStore, machineStore, conveyorStore, vehicleStore, storageUnitStore, productStore } = useSceneContext();
const { selectedProductStore } = useProductContext();
const { selectedProduct } = selectedProductStore();
const { products, getProductById } = productStore();
const { products, getProductById, selectedProduct } = productStore();
const { armBots } = armBotStore();
const { vehicles } = vehicleStore();
const { machines } = machineStore();
@@ -21,14 +18,14 @@ export default function ThroughPutData() {
const { machineIdleTime, setMachineIdleTime } = useMachineDowntime();
const { materialCycleTime, setMaterialCycleTime } = useMaterialCycle();
const { setProcessBar } = useProcessBar();
const { setThroughputData } = useThroughPutData()
const { setThroughputData } = useThroughPutData();
const { isPlaying } = usePlayButtonStore();
const { inputValues } = useInputValues();
// Setting machine count
let totalItems = 0;
let totalActiveTime = 0;
let totalIdleTime = 0
let totalIdleTime = 0;
useEffect(() => {
if (!isPlaying) {
@@ -42,7 +39,7 @@ export default function ThroughPutData() {
setProcessBar([]);
setThroughputData(0);
}
}, [isPlaying])
}, [isPlaying]);
useEffect(() => {
if (isPlaying) {
@@ -50,15 +47,16 @@ export default function ThroughPutData() {
const fetchProductSequenceData = async () => {
const productData = getProductById(selectedProduct.productUuid);
if (productData) {
const productSequenceData = await determineExecutionMachineSequences([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 => {
armBots
.filter((arm) => arm.modelUuid === item.modelUuid)
.forEach((arm) => {
if (arm.activeTime > 0) {
process.push({ modelid: arm.modelUuid, modelName: arm.modelName, activeTime: arm?.activeTime })
process.push({ modelid: arm.modelUuid, modelName: arm.modelName, activeTime: arm?.activeTime });
totalActiveTime += arm.activeTime;
}
if (arm.idleTime > 0) {
@@ -66,10 +64,11 @@ export default function ThroughPutData() {
}
});
} else if (item.type === "vehicle") {
vehicles.filter(vehicle => vehicle.modelUuid === item.modelUuid)
.forEach(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 })
process.push({ modelid: vehicle.modelUuid, modelName: vehicle.modelName, activeTime: vehicle?.activeTime });
totalActiveTime += vehicle.activeTime;
}
@@ -78,10 +77,11 @@ export default function ThroughPutData() {
}
});
} else if (item.type === "machine") {
machines.filter(machine => machine.modelUuid === item.modelUuid)
.forEach(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 })
process.push({ modelid: machine.modelUuid, modelName: machine.modelName, activeTime: machine?.activeTime });
totalActiveTime += machine.activeTime;
}
if (machine.idleTime > 0) {
@@ -89,15 +89,17 @@ export default function ThroughPutData() {
}
});
} else if (item.type === "transfer") {
conveyors.filter(conveyor => conveyor.modelUuid === item.modelUuid)
.forEach(conveyor => {
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 => {
storageUnits
.filter((storage) => storage.modelUuid === item.modelUuid)
.forEach((storage) => {
if (storage.activeTime > 0) {
// totalActiveTime += storage.activeTime;
}
@@ -108,13 +110,12 @@ export default function ThroughPutData() {
totalItems += sequence.length;
});
setMachineCount(totalItems);
setMachineActiveTime(totalActiveTime);
setMachineIdleTime(totalIdleTime);
let arr = process.map((item: any) => ({
name: item.modelName,
completed: Math.round((item.activeTime / totalActiveTime) * 100)
completed: Math.round((item.activeTime / totalActiveTime) * 100),
}));
setProcessBar(arr);
}
@@ -136,12 +137,12 @@ export default function ThroughPutData() {
if (productData) {
const productSequenceData = await determineExecutionMachineSequences([productData]);
if (productSequenceData?.length > 0) {
productSequenceData.forEach(sequence => {
sequence.forEach(item => {
productSequenceData.forEach((sequence) => {
sequence.forEach((item) => {
if (item.type === "roboticArm") {
armBots
.filter(arm => arm.modelUuid === item.modelUuid)
.forEach(arm => {
.filter((arm) => arm.modelUuid === item.modelUuid)
.forEach((arm) => {
if (arm.isActive) {
anyArmActive = true;
} else {
@@ -151,8 +152,8 @@ export default function ThroughPutData() {
}
if (item.type === "vehicle") {
vehicles
.filter(vehicle => vehicle.modelUuid === item.modelUuid)
.forEach(vehicle => {
.filter((vehicle) => vehicle.modelUuid === item.modelUuid)
.forEach((vehicle) => {
if (vehicle.isActive) {
anyVehicleActive = true;
} else {
@@ -162,8 +163,8 @@ export default function ThroughPutData() {
}
if (item.type === "machine") {
machines
.filter(machine => machine.modelUuid === item.modelUuid)
.forEach(machine => {
.filter((machine) => machine.modelUuid === item.modelUuid)
.forEach((machine) => {
if (machine.isActive) {
anyMachineActive = true;
} else {
@@ -178,7 +179,6 @@ export default function ThroughPutData() {
const allInactive = !anyArmActive && !anyVehicleActive && !anyMachineActive;
if (materialHistory.length > 0) {
let totalCycleTimeSum = 0;
let cycleCount = 0;
@@ -207,7 +207,7 @@ export default function ThroughPutData() {
return () => {
if (timeoutId) clearTimeout(timeoutId);
};
}, [armBots, materials, materialHistory, machines, vehicles, selectedProduct?.productUuid])
}, [armBots, materials, materialHistory, machines, vehicles, selectedProduct?.productUuid]);
useEffect(() => {
const shiftLength = parseFloat(inputValues["Shift length"]);
@@ -222,8 +222,5 @@ export default function ThroughPutData() {
}
}, [materialCycleTime, machineCount, isPlaying, inputValues]);
return (
<>
</>
);
return <></>;
}