diff --git a/app/src/components/ui/analysis/ROISummary.tsx b/app/src/components/ui/analysis/ROISummary.tsx
index 735cd9e..5e52cc0 100644
--- a/app/src/components/ui/analysis/ROISummary.tsx
+++ b/app/src/components/ui/analysis/ROISummary.tsx
@@ -9,7 +9,7 @@ import {
import SemiCircleProgress from "./SemiCircleProgress";
import { ArrowIcon } from "../../icons/ExportCommonIcons";
import SkeletonUI from "../../templates/SkeletonUI";
-import { useROISummaryData } from "../../../store/builder/store";
+import { useInputValues, useROISummaryData } from "../../../store/builder/store";
const ROISummary = ({
roiSummaryData = {
@@ -67,6 +67,8 @@ const ROISummary = ({
},
}) => {
const [isTableOpen, setIsTableOpen] = useState(false); // State to handle the table open/close
+ const { inputValues } = useInputValues();
+ const productionPeriod = parseFloat(inputValues["Production period"]);
// Function to toggle the breakdown table visibility
const toggleTable = () => {
@@ -95,6 +97,17 @@ const ROISummary = ({
}
}, [roiSummary]);
+ function getPaybackDateFromYears(yearsToAdd: number) {
+ const now = new Date();
+
+ const totalMonths = Math.round(yearsToAdd * 12);
+
+ const paybackDate = new Date(now.getFullYear(), now.getMonth() + totalMonths, now.getDate());
+ const month = paybackDate.toLocaleString("en-GB", { month: "long" });
+ const year = paybackDate.getFullYear();
+ return `${month} ${year}`;
+ }
+
return (
<>
@@ -121,26 +134,30 @@ const ROISummary = ({
- {roiSummary.roiPercentage}%
- ROI
+ {roiSummary.roiPercentage.toFixed(2)}%
+ ROI in the period of {productionPeriod} years
-
+
you're on track to hit it by
-
July 2029
+
{getPaybackDateFromYears(roiSummary.paybackPeriod)}
+
Total Cost Incurred
₹
- {roiSummary.totalCost}
+ {roiSummary.totalCost.toFixed(0)}
@@ -148,7 +165,7 @@ const ROISummary = ({
₹
- {roiSummary.revenueGenerated}
+ {roiSummary.revenueGenerated.toFixed(0)}
@@ -162,8 +179,8 @@ const ROISummary = ({
₹
{roiSummary.netProfit > 0
- ? roiSummary.netProfit
- : roiSummary.netLoss}
+ ? roiSummary.netProfit.toFixed(0)
+ : roiSummary.netLoss.toFixed(0)}
diff --git a/app/src/components/ui/analysis/ThroughputSummary.tsx b/app/src/components/ui/analysis/ThroughputSummary.tsx
index 22cb95a..52fa9f4 100644
--- a/app/src/components/ui/analysis/ThroughputSummary.tsx
+++ b/app/src/components/ui/analysis/ThroughputSummary.tsx
@@ -1,5 +1,5 @@
import { useEffect, useState } from "react";
-import { useMachineCount, useMachineUptime, useMaterialCycle, useProductionCapacityData, useThroughPutData } from "../../../store/builder/store";
+import { useInputValues, useMachineCount, useMachineUptime, useMaterialCycle, useProductionCapacityData, useThroughPutData } from "../../../store/builder/store";
import {
ThroughputSummaryIcon,
} from "../../icons/analysis";
@@ -14,29 +14,30 @@ const ProductionCapacity = ({
const { machineActiveTime } = useMachineUptime();
const { materialCycleTime } = useMaterialCycle();
const { throughputData } = useThroughPutData()
+ const { inputValues } = useInputValues();
const progressPercent = machineActiveTime;
+ const shiftLength = parseFloat(inputValues["Shift length"]);
const totalBars = 6;
const barsToFill = Math.floor((progressPercent / 100) * totalBars);
- const partialFillPercent =
- ((progressPercent / 100) * totalBars - barsToFill) * 100;
+ const partialFillPercent = ((progressPercent / 1000) * totalBars - barsToFill) * 100;
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
- console.log('throughputData: ', throughputData);
if (throughputData > 0) {
setIsLoading(false);
} else {
- setIsLoading(true);
+ setIsLoading(false);
}
}, [throughputData])
+ const Units_per_hour = ((shiftLength * 60) / (materialCycleTime / 60) / shiftLength)
+
return (
<>
-
{!isLoading &&
@@ -54,8 +55,7 @@ const ProductionCapacity = ({
<>
- {throughputData} Units/hour
-
+ {(Units_per_hour).toFixed(2) === "Infinity"? 0 : (Units_per_hour).toFixed(2) } Units/hour
{/* Dynamic Progress Bar */}
diff --git a/app/src/components/ui/compareVersion/ComparisonResult.tsx b/app/src/components/ui/compareVersion/ComparisonResult.tsx
index 36ad1a7..4ce4467 100644
--- a/app/src/components/ui/compareVersion/ComparisonResult.tsx
+++ b/app/src/components/ui/compareVersion/ComparisonResult.tsx
@@ -1,14 +1,41 @@
-import React, { useMemo } from "react";
+import React, { useEffect, useMemo, useState } from "react";
import PerformanceResult from "./result-card/PerformanceResult";
import EnergyUsage from "./result-card/EnergyUsage";
import { Bar, Line, Pie } from "react-chartjs-2";
-import { useCompareProductDataStore } from "../../../store/builder/store";
+import { CompareProduct, useCompareProductDataStore } from "../../../store/builder/store";
import { useComparisonProduct, useMainProduct } from "../../../store/simulation/useSimulationStore";
const ComparisonResult = () => {
- const { compareProductsData, setCompareProductsData } = useCompareProductDataStore();
- const { comparisonProduct, setComparisonProduct } = useComparisonProduct();
- const { mainProduct } = useMainProduct();
+ const { compareProductsData, setCompareProductsData } = useCompareProductDataStore();
+ const { comparisonProduct, setComparisonProduct } = useComparisonProduct();
+ const { mainProduct } = useMainProduct();
+ const [comparedProducts, setComparedProducts] = useState<[CompareProduct, CompareProduct] | []>([]);
+
+ useEffect(() => {
+ if (compareProductsData.length > 0 && mainProduct && comparisonProduct) {
+ const mainProductData = compareProductsData.find(
+ (product) => product.productUuid === mainProduct.productUuid
+ );
+ const comparisonProductData = compareProductsData.find(
+ (product) => product.productUuid === comparisonProduct.productUuid
+ );
+
+ if (mainProductData && comparisonProductData) {
+ setComparedProducts([mainProductData, comparisonProductData]);
+ } else {
+ setComparedProducts([]);
+ }
+ } else {
+ setComparedProducts([]);
+ }
+ }, [compareProductsData, mainProduct, comparisonProduct]);
+
+ useEffect(() => {
+ if (comparedProducts.length === 2) {
+
+ }
+ }, [comparedProducts]);
+
const options = useMemo(
() => ({
responsive: true,
@@ -30,11 +57,11 @@ const ComparisonResult = () => {
const purpleLight = "#b19cd9";
const throughputData = {
- labels: ["Layout 1", "Layout 2"],
+ labels: [comparedProducts[0]?.productName, comparedProducts[1]?.productName],
datasets: [
{
label: "Throughput (units/hr)",
- data: [500, 550],
+ data: [comparedProducts[0]?.simulationData.throughputData, comparedProducts[1]?.simulationData.throughputData],
backgroundColor: [purpleDark, purpleLight],
borderColor: [purpleDark, purpleLight],
borderWidth: 1,
@@ -46,11 +73,11 @@ const ComparisonResult = () => {
const cycleTimePieData = {
- labels: ["Layout 1", "Layout 2"],
+ labels: [comparedProducts[0]?.productName, comparedProducts[1]?.productName],
datasets: [
{
label: "Cycle Time (sec)",
- data: [120, 110],
+ data: [comparedProducts[0]?.simulationData.machineActiveTime, comparedProducts[1]?.simulationData.machineActiveTime],
backgroundColor: [purpleDark, purpleLight],
borderColor: "#fff",
borderWidth: 2,
@@ -59,11 +86,24 @@ const ComparisonResult = () => {
};
const downtimeData = {
- labels: ["Layout 1", "Layout 2"],
+ labels: [comparedProducts[0]?.productName, comparedProducts[1]?.productName],
datasets: [
{
label: "Downtime (mins)",
- data: [17, 12],
+ data: [comparedProducts[0]?.simulationData.machineIdleTime, comparedProducts[1]?.simulationData.machineIdleTime],
+ backgroundColor: [purpleDark, purpleLight],
+ borderColor: "#fff",
+ borderWidth: 2,
+ },
+ ],
+ };
+
+ const productionCapacityData = {
+ labels: [comparedProducts[0]?.productName, comparedProducts[1]?.productName],
+ datasets: [
+ {
+ label: "Production Capacity (units)",
+ data: [comparedProducts[0]?.simulationData.productionCapacity, comparedProducts[1]?.simulationData.productionCapacity],
backgroundColor: [purpleDark, purpleLight],
borderColor: [purpleDark, purpleLight],
borderWidth: 1,
@@ -73,20 +113,21 @@ const ComparisonResult = () => {
],
};
- const scrapRateData = {
- labels: ["Layout 1", "Layout 2"],
- datasets: [
- {
- label: "Scrap Rate (tons)",
- data: [2.7, 1.9],
- backgroundColor: [purpleDark, purpleLight],
- borderColor: [purpleDark, purpleLight],
- borderWidth: 1,
- borderRadius: 10,
- borderSkipped: false,
- },
- ],
- };
+ const highestProductivityProduct = (comparedProducts[0]?.simulationData?.productionCapacity ?? 0) > (comparedProducts[1]?.simulationData?.productionCapacity ?? 0) ? comparedProducts[0] : comparedProducts[1];
+
+ const product1CyclePercentage = (comparedProducts[0]?.simulationData?.machineActiveTime ?? 0) /
+ ((compareProductsData[0]?.simulationData?.machineActiveTime ?? 0) +
+ (compareProductsData[0]?.simulationData?.machineIdleTime ?? 0)) * 100;
+ const product2CyclePercentage = ((comparedProducts[1]?.simulationData?.machineActiveTime ?? 0) /
+ ((compareProductsData[1]?.simulationData?.machineActiveTime ?? 0) +
+ (compareProductsData[1]?.simulationData?.machineIdleTime ?? 0))) * 100;
+
+ const product1IdlePercentage = (comparedProducts[0]?.simulationData?.machineIdleTime ?? 0) /
+ ((compareProductsData[0]?.simulationData?.machineActiveTime ?? 0) +
+ (compareProductsData[0]?.simulationData?.machineIdleTime ?? 0)) * 100;
+ const product2IdlePercentage = ((comparedProducts[1]?.simulationData?.machineIdleTime ?? 0) /
+ ((compareProductsData[1]?.simulationData?.machineActiveTime ?? 0) +
+ (compareProductsData[1]?.simulationData?.machineIdleTime ?? 0))) * 100;
return (
@@ -97,12 +138,12 @@ const ComparisonResult = () => {
Throughput (units/hr)
-
Layout 1
-
500/ hr
+
{comparedProducts[0]?.productName}
+
{comparedProducts[0]?.simulationData.throughputData}/ hr
-
Layout 2
-
550/ hr
+
{comparedProducts[1]?.productName}
+
{comparedProducts[1]?.simulationData.throughputData}/ hr
@@ -115,17 +156,17 @@ const ComparisonResult = () => {
Cycle Time
-
Layout 1
-
120 Sec
+
{comparedProducts[0]?.productName}
+
{compareProductsData[0]?.simulationData.machineActiveTime} Sec
- ↑19.6%
+ ↑{(100 - product1CyclePercentage).toFixed(2)}%
-
Layout 2
-
110 Sec
+
{comparedProducts[1]?.productName}
+
{compareProductsData[1]?.simulationData.machineActiveTime} Sec
- ↑1.6%
+ ↑{(100 - product2CyclePercentage).toFixed(2)}%
@@ -135,6 +176,31 @@ const ComparisonResult = () => {
+
+
+
Overall Downtime
+
+
+
{comparedProducts[0]?.productName}
+
{compareProductsData[0]?.simulationData.machineIdleTime} Sec
+
+ ↑{(100 - product1IdlePercentage).toFixed(2)}%
+
+
+
+
{comparedProducts[1]?.productName}
+
{compareProductsData[1]?.simulationData.machineIdleTime} Sec
+
+ ↑{(100 - product2IdlePercentage).toFixed(2)}%
+
+
+
+
+
+
+{/*
Overall Downtime
@@ -152,23 +218,23 @@ const ComparisonResult = () => {
-
+
*/}
Production Capacity
-
Layout 1
-
Total scrap produced by
-
2.7 ton
+
{highestProductivityProduct?.productName}
+
Total product produced
+
{highestProductivityProduct?.simulationData.productionCapacity}
-
+
-
+ { comparedProducts.length === 2 &&
}
);
diff --git a/app/src/components/ui/compareVersion/result-card/EnergyUsage.tsx b/app/src/components/ui/compareVersion/result-card/EnergyUsage.tsx
index 93e80ec..efe6bc2 100644
--- a/app/src/components/ui/compareVersion/result-card/EnergyUsage.tsx
+++ b/app/src/components/ui/compareVersion/result-card/EnergyUsage.tsx
@@ -20,27 +20,32 @@ ChartJS.register(
);
const EnergyUsage = () => {
- const data = {
- labels: ["Mon", "Tue", "Wed", "Thu", "Fri"],
- datasets: [
- {
- label: "Simulation 1",
- data: [400, 600, 450, 1000, 1000],
- borderColor: "#6a0dad",
- fill: false,
- tension: 0.5, // More curved line
- pointRadius: 0, // Remove point indicators
- },
- {
- label: "Simulation 2",
- data: [300, 500, 700, 950, 1100],
- borderColor: "#b19cd9",
- fill: false,
- tension: 0.5,
- pointRadius: 0,
- },
- ],
- };
+ const data = useMemo(() => {
+ const randomizeData = () =>
+ Array.from({ length: 5 }, () => Math.floor(Math.random() * (2000 - 300 + 1)) + 300);
+
+ return {
+ labels: ["Mon", "Tue", "Wed", "Thu", "Fri"],
+ datasets: [
+ {
+ label: "Simulation 1",
+ data: randomizeData(),
+ borderColor: "#6a0dad",
+ fill: false,
+ tension: 0.5, // More curved line
+ pointRadius: 0, // Remove point indicators
+ },
+ {
+ label: "Simulation 2",
+ data: randomizeData(),
+ borderColor: "#b19cd9",
+ fill: false,
+ tension: 0.5,
+ pointRadius: 0,
+ },
+ ],
+ };
+ }, []);
const options = useMemo(
() => ({
diff --git a/app/src/components/ui/compareVersion/result-card/PerformanceResult.tsx b/app/src/components/ui/compareVersion/result-card/PerformanceResult.tsx
index f21d573..b0a94c2 100644
--- a/app/src/components/ui/compareVersion/result-card/PerformanceResult.tsx
+++ b/app/src/components/ui/compareVersion/result-card/PerformanceResult.tsx
@@ -5,7 +5,8 @@ import {
TickIcon,
} from "../../../icons/ExportCommonIcons";
-const PerformanceResult = () => {
+const PerformanceResult = ({ comparedProducts }: any) => {
+ const ProfitProduct = comparedProducts[0].simulationData.netProfit > comparedProducts[1].simulationData.netProfit ? comparedProducts[0] : comparedProducts[1];
return (
@@ -26,30 +27,30 @@ const PerformanceResult = () => {
98%
-
Environmental impact
+
Net Profit
-
Waste generation
+
ROI Percentage
-
I
-
0.5%
+
+
{ProfitProduct.simulationData.roiPercentage.toFixed(2)}
-
Risk
management
+
Payback Period
-
I
-
0.1%
+
+
{ProfitProduct.simulationData.netProfit}
-
I
-
0.5%
+
+
{parseFloat(ProfitProduct.simulationData.paybackPeriod.toFixed(2))}years
diff --git a/app/src/modules/simulation/analysis/ROI/roiData.tsx b/app/src/modules/simulation/analysis/ROI/roiData.tsx
index a633473..2a26f8d 100644
--- a/app/src/modules/simulation/analysis/ROI/roiData.tsx
+++ b/app/src/modules/simulation/analysis/ROI/roiData.tsx
@@ -4,7 +4,6 @@ import { usePlayButtonStore } from '../../../../store/usePlayButtonStore';
import { useProductContext } from '../../products/productContext';
import { useProductStore } from '../../../../store/simulation/useProductStore';
-
export default function ROIData() {
const { selectedProductStore } = useProductContext();
const { inputValues } = useInputValues();
@@ -36,6 +35,7 @@ export default function ROIData() {
const electricityCost = parseFloat(inputValues["Electricity cost"]);
const fixedCost = parseFloat(inputValues["Fixed costs"]);
const laborCost = parseFloat(inputValues["Labor Cost"]);
+ const laborCount = parseFloat(inputValues["Labor Count"]);
const maintenanceCost = parseFloat(inputValues["Maintenance cost"]);
const materialCost = parseFloat(inputValues["Material cost"]);
const productionPeriod = parseFloat(inputValues["Production period"]);
@@ -49,41 +49,103 @@ export default function ROIData() {
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) {
- console.log('productionCapacityData: ', productionCapacityData);
+
- const totalHoursPerYear = shiftLength * shiftsPerDay * workingDaysPerYear;
- const annualProductionUnits = productionCapacityData * totalHoursPerYear;
- const annualRevenue = annualProductionUnits * sellingPrice;
+ // const totalHoursPerYear = shiftLength * shiftsPerDay * workingDaysPerYear;
+ // const annualProductionUnits = productionCapacityData * totalHoursPerYear;
+ // const annualRevenue = annualProductionUnits * sellingPrice;
- const totalMaterialCost = annualProductionUnits * materialCost;
- const totalLaborCost = laborCost * totalHoursPerYear;
- const totalEnergyCost = electricityCost * totalHoursPerYear;
- const totalMaintenanceCost = maintenanceCost + fixedCost;
- const totalAnnualCost = totalMaterialCost + totalLaborCost + totalEnergyCost + totalMaintenanceCost;
- const annualProfit = annualRevenue - totalAnnualCost;
+ // const totalMaterialCost = annualProductionUnits * materialCost;
+ // const totalLaborCost = laborCost * totalHoursPerYear;
+ // const totalEnergyCost = electricityCost * totalHoursPerYear;
+ // const totalMaintenanceCost = maintenanceCost + fixedCost;
+ // const totalAnnualCost = totalMaterialCost + totalLaborCost + totalEnergyCost + totalMaintenanceCost;
+ // const annualProfit = annualRevenue - totalAnnualCost;
- const netProfit = annualProfit * productionPeriod;
- const roiPercentage = ((annualProfit + salvageValue - initialInvestment) / initialInvestment) * 100;
- const paybackPeriod = initialInvestment / (annualProfit || 1); // Avoid division by 0
+ // const netProfit = annualProfit * productionPeriod;
+ // const roiPercentage = ((annualProfit + salvageValue - initialInvestment) / initialInvestment) * 100;
+ // const paybackPeriod = initialInvestment / (annualProfit || 1); // Avoid division by 0
+
+ // setRoiSummaryData({
+ // productName: selectedProduct.productName,
+ // roiPercentage: parseFloat((roiPercentage / 100).toFixed(2)),
+ // paybackPeriod: parseFloat(paybackPeriod.toFixed(2)),
+ // totalCost: parseFloat(totalAnnualCost.toFixed(2)),
+ // revenueGenerated: parseFloat(annualRevenue.toFixed(2)),
+ // netProfit: netProfit > 0 ? parseFloat(netProfit.toFixed(2)) : 0,
+ // netLoss: netProfit < 0 ? -netProfit : 0
+ // });
+
+ // const productCount = 1000;
+ // const costPerUnit = totalAnnualCost / annualProductionUnits;
+ // const costForTargetUnits = productCount * costPerUnit;
+ // const revenueForTargetUnits = productCount * sellingPrice;
+ // const profitForTargetUnits = revenueForTargetUnits - costForTargetUnits;
+
+ // const netProfitForTarget = profitForTargetUnits > 0 ? profitForTargetUnits : 0;
+ // const netLossForTarget = profitForTargetUnits < 0 ? -profitForTargetUnits : 0;
+
+ // const productData = getProductById(selectedProduct.productUuid);
+ // const prev = useCompareProductDataStore.getState().compareProductsData;
+ // const newData: CompareProduct = {
+ // productUuid: productData?.productUuid ?? '',
+ // productName: productData?.productName ?? '',
+ // simulationData: {
+ // // costPerUnit: parseFloat(costPerUnit.toFixed(2)),
+ // // workingDaysPerYear: parseFloat(workingDaysPerYear.toFixed(2)),
+ // // shiftLength: parseFloat(shiftLength.toFixed(2)),
+ // // shiftsPerDay: parseFloat(shiftsPerDay.toFixed(2)),
+ // roiPercentage: parseFloat((roiPercentage / 100).toFixed(2)),
+ // // paybackPeriod: parseFloat(paybackPeriod.toFixed(2)),
+ // // totalCost: parseFloat(totalAnnualCost.toFixed(2)),
+ // // revenueGenerated: parseFloat(annualRevenue.toFixed(2)),
+ // netProfit: netProfit > 0 ? parseFloat(netProfit.toFixed(2)) : 0,
+ // productionCapacity: parseFloat(productionCapacityData.toFixed(2)),
+ // // netLoss: netProfit < 0 ? parseFloat((-netProfit).toFixed(2)) : 0,
+ // machineIdleTime: parseFloat(machineIdleTime.toFixed(2)),
+ // machineActiveTime: parseFloat(machineActiveTime.toFixed(2)),
+ // throughputData: throughputData,
+ // }
+ // };
+
+ // const existingIndex = prev.findIndex((item: CompareProduct) =>
+ // item.productUuid === productData?.productUuid
+ // );
+
+ // if (existingIndex !== -1) {
+ // const updated = [...prev];
+ // updated[existingIndex] = newData;
+ // setCompareProductsData(updated);
+ // } else {
+ // setCompareProductsData([...prev, newData]);
+ // }
+
+ 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_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 ROI = (Net_profit / initialInvestment) * 100
+
+ const Annual_net_profit = (Annual_units * (sellingPrice - materialCost - laborCost)) - (maintenanceCost + electricityCost + fixedCost) * workingDaysPerYear + (salvageValue * workingDaysPerYear)
+ const Payback_period_years = initialInvestment / Annual_net_profit;
setRoiSummaryData({
productName: selectedProduct.productName,
- roiPercentage: parseFloat((roiPercentage / 100).toFixed(2)),
- paybackPeriod: parseFloat(paybackPeriod.toFixed(2)),
- totalCost: parseFloat(totalAnnualCost.toFixed(2)),
- revenueGenerated: parseFloat(annualRevenue.toFixed(2)),
- netProfit: netProfit > 0 ? parseFloat(netProfit.toFixed(2)) : 0,
- netLoss: netProfit < 0 ? -netProfit : 0
+ roiPercentage: ROI,
+ paybackPeriod: Payback_period_years,
+ totalCost: Total_cost,
+ revenueGenerated: Total_revenue,
+ netProfit: Net_profit > 0 ? Net_profit : 0,
+ netLoss: Net_profit < 0 ? -Net_profit : 0
});
- const productCount = 1000;
- const costPerUnit = totalAnnualCost / annualProductionUnits;
- const costForTargetUnits = productCount * costPerUnit;
- const revenueForTargetUnits = productCount * sellingPrice;
- const profitForTargetUnits = revenueForTargetUnits - costForTargetUnits;
-
- const netProfitForTarget = profitForTargetUnits > 0 ? profitForTargetUnits : 0;
- const netLossForTarget = profitForTargetUnits < 0 ? -profitForTargetUnits : 0;
const productData = getProductById(selectedProduct.productUuid);
const prev = useCompareProductDataStore.getState().compareProductsData;
@@ -91,18 +153,20 @@ export default function ROIData() {
productUuid: productData?.productUuid ?? '',
productName: productData?.productName ?? '',
simulationData: {
- // costPerUnit: parseFloat(costPerUnit.toFixed(2)),
- // workingDaysPerYear: parseFloat(workingDaysPerYear.toFixed(2)),
- // shiftLength: parseFloat(shiftLength.toFixed(2)),
- // shiftsPerDay: parseFloat(shiftsPerDay.toFixed(2)),
- roiPercentage: parseFloat((roiPercentage / 100).toFixed(2)),
- // paybackPeriod: parseFloat(paybackPeriod.toFixed(2)),
- // totalCost: parseFloat(totalAnnualCost.toFixed(2)),
- // revenueGenerated: parseFloat(annualRevenue.toFixed(2)),
- netProfit: netProfit > 0 ? parseFloat(netProfit.toFixed(2)) : 0,
- // netLoss: netProfit < 0 ? parseFloat((-netProfit).toFixed(2)) : 0,
- machineIdleTime: parseFloat(machineIdleTime.toFixed(2)),
- machineActiveTime: parseFloat(machineActiveTime.toFixed(2)),
+ // costPerUnit: costPerUnit,
+ // workingDaysPerYear: workingDaysPerYear,
+ // shiftLength: shiftLength,
+ // shiftsPerDay: shiftsPerDay,
+ roiPercentage: ROI,
+ paybackPeriod: Payback_period_years,
+ // paybackPeriod: paybackPeriod,
+ // totalCost: totalAnnualCost,
+ // revenueGenerated: annualRevenue,
+ netProfit: Net_profit > 0 ? Net_profit : 0,
+ productionCapacity: productionCapacityData,
+ // netLoss: netProfit < 0 ? (-netProfit) : 0,
+ machineIdleTime: machineIdleTime,
+ machineActiveTime: machineActiveTime,
throughputData: throughputData,
}
};
@@ -120,10 +184,10 @@ export default function ROIData() {
}
}
- }, [inputValues, productionCapacityData, selectedProduct?.productUuid, isPlaying]);
+ }, [inputValues, productionCapacityData, throughputData, isPlaying]);
useEffect(() => {
- console.log('compareProductsData: ', compareProductsData);
+
}, [compareProductsData])
return null;
diff --git a/app/src/modules/simulation/analysis/productionCapacity/productionCapacityData.tsx b/app/src/modules/simulation/analysis/productionCapacity/productionCapacityData.tsx
index ced9ddc..888a519 100644
--- a/app/src/modules/simulation/analysis/productionCapacity/productionCapacityData.tsx
+++ b/app/src/modules/simulation/analysis/productionCapacity/productionCapacityData.tsx
@@ -13,45 +13,22 @@ export default function ProductionCapacityData() {
useEffect(() => {
if (!isPlaying) {
- console.log('isPlaying: ', isPlaying);
+
setProductionCapacityData(0);
}
}, [isPlaying]);
useEffect(() => {
if (!inputValues || throughputData === undefined || !isPlaying) return;
- console.log('throughputData: ', throughputData);
-
- const shiftLength = parseFloat(inputValues["Shift length"]);
- console.log('shiftLength: ', shiftLength);
-
- const shiftsPerDay = parseFloat(inputValues["Shifts / day"]);
-
const workingDaysPerYear = parseFloat(inputValues["Working days / year"]);
- const yieldRate = parseFloat(inputValues["Yield rate"]);
+ if (!isNaN(workingDaysPerYear) && throughputData > 0) {
+ const Monthly_working_days = workingDaysPerYear / 12;
+ const Production_capacity_per_month = throughputData * Monthly_working_days;
- if (!isNaN(shiftLength) && !isNaN(shiftsPerDay) && !isNaN(workingDaysPerYear) &&
- !isNaN(yieldRate) && throughputData > 0) {
- // Total units produced per day before yield
- const dailyProduction = throughputData * shiftLength * shiftsPerDay;
-
- // Units after applying yield rate
- const goodUnitsPerDay = dailyProduction * (yieldRate / 100);
-
-
- // Annual output
- const annualProduction = goodUnitsPerDay * workingDaysPerYear;
-
-
- // Final production capacity per hour (after yield)
- const productionPerHour = throughputData * (yieldRate / 100);
-
-
- // Set the final capacity (units/hour)
- setProductionCapacityData(Number(productionPerHour.toFixed(2)));
+ setProductionCapacityData(Number(Production_capacity_per_month.toFixed(2)));
}
}, [throughputData, inputValues, isPlaying]);
diff --git a/app/src/modules/simulation/analysis/throughPut/throughPutData.tsx b/app/src/modules/simulation/analysis/throughPut/throughPutData.tsx
index 72189e0..87655cd 100644
--- a/app/src/modules/simulation/analysis/throughPut/throughPutData.tsx
+++ b/app/src/modules/simulation/analysis/throughPut/throughPutData.tsx
@@ -1,7 +1,7 @@
import { useEffect } from 'react';
import { useProductStore } from '../../../../store/simulation/useProductStore';
import { determineExecutionMachineSequences } from '../../simulator/functions/determineExecutionMachineSequences';
-import { useMachineCount, useMachineDowntime, useMachineUptime, useMaterialCycle, useProcessBar, useThroughPutData } from '../../../../store/builder/store';
+import { useInputValues, useMachineCount, useMachineDowntime, useMachineUptime, useMaterialCycle, useProcessBar, useThroughPutData } from '../../../../store/builder/store';
import { usePlayButtonStore } from '../../../../store/usePlayButtonStore';
import { useSceneContext } from '../../../scene/sceneContext';
import { useProductContext } from '../../products/productContext';
@@ -25,6 +25,7 @@ export default function ThroughPutData() {
const { setProcessBar } = useProcessBar();
const { setThroughputData } = useThroughPutData()
const { isPlaying } = usePlayButtonStore();
+ const { inputValues } = useInputValues();
// Setting machine count
let totalItems = 0;
@@ -179,7 +180,7 @@ export default function ThroughPutData() {
}
const allInactive = !anyArmActive && !anyVehicleActive && !anyMachineActive;
- if (allInactive && materials.length === 0 && materialHistory.length > 0) {
+ if (materials.length >= 0 && materialHistory.length > 0) {
let totalCycleTimeSum = 0;
let cycleCount = 0;
@@ -212,13 +213,17 @@ export default function ThroughPutData() {
}, [armBots, materials, materialHistory, machines, vehicles, selectedProduct?.productUuid])
useEffect(() => {
- if (machineActiveTime > 0 && materialCycleTime > 0 && machineCount > 0 && isPlaying) {
- const utilization = machineActiveTime / 3600; // Active time per hour
- const unitsPerMachinePerHour = 3600 / materialCycleTime;
- const throughput = unitsPerMachinePerHour * machineCount * utilization;
- setThroughputData(Number(throughput.toFixed(2))); // Keep as number
+ const shiftLength = parseFloat(inputValues["Shift length"]);
+ const shiftsPerDay = parseFloat(inputValues["Shifts / day"]);
+ const yieldRate = parseFloat(inputValues["Yield rate"]);
+
+ if (shiftLength > 0 && materialCycleTime > 0 && machineCount > 0 && isPlaying) {
+ const Units_per_shift = (shiftLength * 60) / (materialCycleTime / 60);
+
+ const Throughput_per_day = Units_per_shift * shiftsPerDay * (yieldRate / 100);
+ setThroughputData(Number(Throughput_per_day.toFixed(2))); // Keep as number
}
- }, [machineActiveTime, materialCycleTime, machineCount, selectedProduct?.productUuid, isPlaying]);
+ }, [materialCycleTime, machineCount, isPlaying, inputValues]);
return (
<>
diff --git a/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx b/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx
index 9952888..6eb41a3 100644
--- a/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx
+++ b/app/src/modules/simulation/vehicle/instances/instance/vehicleInstance.tsx
@@ -48,7 +48,6 @@ function VehicleInstance({ agvDetail }: Readonly<{ agvDetail: VehicleStatus }>)
const computePath = useCallback(
(start: any, end: any) => {
- console.log('end: ', end);
try {
const navMeshQuery = new NavMeshQuery(navMesh);
const { path: segmentPath } = navMeshQuery.computePath(start, end);
@@ -57,7 +56,6 @@ function VehicleInstance({ agvDetail }: Readonly<{ agvDetail: VehicleStatus }>)
Math.round(segmentPath[segmentPath.length - 1].x) == Math.round(end.x) &&
Math.round(segmentPath[segmentPath.length - 1].z) == Math.round(end.z)
) {
- console.log('if ', segmentPath);
return segmentPath?.map(({ x, y, z }) => [x, 0, z] as [number, number, number]) || [];
} else {
console.log("There is no path here...Choose valid path")
diff --git a/app/src/pages/UserAuth.tsx b/app/src/pages/UserAuth.tsx
index 6ec0036..9ecc018 100644
--- a/app/src/pages/UserAuth.tsx
+++ b/app/src/pages/UserAuth.tsx
@@ -43,7 +43,7 @@ const UserAuth: React.FC = () => {
const organization = email.split("@")[1].split(".")[0];
try {
const res = await signInApi(email, password, organization, fingerprint);
- console.log('res: ', res);
+ // console.log('res: ', res);
if (res.message.message === "login successfull") {
setError("");
setOrganization(organization);
@@ -56,10 +56,10 @@ const UserAuth: React.FC = () => {
localStorage.setItem("refreshToken", res.message.refreshToken);
try {
- console.log('res.message.userId: ', res.message.userId);
- console.log('organization: ', organization);
+ // console.log('res.message.userId: ', res.message.userId);
+ // console.log('organization: ', organization);
const projects = await recentlyViewed(organization, res.message.userId);
- console.log('projects: ', projects);
+ // console.log('projects: ', projects);
if (res.message.isShare) {
if (Object.values(projects.RecentlyViewed).length > 0) {
diff --git a/app/src/store/builder/store.ts b/app/src/store/builder/store.ts
index eba4c47..890a0e8 100644
--- a/app/src/store/builder/store.ts
+++ b/app/src/store/builder/store.ts
@@ -726,6 +726,8 @@ export interface CompareProduct {
// totalCost: number;
// revenueGenerated: number;
netProfit: number;
+ productionCapacity: number;
+ paybackPeriod: number;
// netLoss: number;
machineIdleTime: number;
machineActiveTime: number;
diff --git a/app/src/styles/components/simulation/simulation.scss b/app/src/styles/components/simulation/simulation.scss
index 403d7ee..302ad7a 100644
--- a/app/src/styles/components/simulation/simulation.scss
+++ b/app/src/styles/components/simulation/simulation.scss
@@ -64,13 +64,14 @@
.production-details {
.production-wrapper {
display: flex;
- align-items: center;
+ // align-items: center;
flex-direction: column;
gap: 6px;
.header {
display: flex;
flex-direction: row;
+ justify-content: start;
gap: 6px;
}