@@ -54,8 +55,7 @@ const ProductionCapacity = ({
<>
- {throughputData} Units/hour
-
+ {(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..caec3b4 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) {
+ console.log(comparedProducts);
+ }
+ }, [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,18 +218,18 @@ const ComparisonResult = () => {
-
+
*/}
Production Capacity
-
Layout 1
-
Total scrap produced by
-
2.7 ton
+
{highestProductivityProduct?.productName}
+
Total product produced
+
{highestProductivityProduct?.simulationData.productionCapacity}
-
+
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/modules/simulation/analysis/ROI/roiData.tsx b/app/src/modules/simulation/analysis/ROI/roiData.tsx
index a633473..ef016d0 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"]);
@@ -51,39 +51,101 @@ export default function ROIData() {
!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,19 @@ 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: 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,7 +183,7 @@ export default function ROIData() {
}
}
- }, [inputValues, productionCapacityData, selectedProduct?.productUuid, isPlaying]);
+ }, [inputValues, productionCapacityData, throughputData, isPlaying]);
useEffect(() => {
console.log('compareProductsData: ', compareProductsData);
diff --git a/app/src/modules/simulation/analysis/productionCapacity/productionCapacityData.tsx b/app/src/modules/simulation/analysis/productionCapacity/productionCapacityData.tsx
index ced9ddc..960a025 100644
--- a/app/src/modules/simulation/analysis/productionCapacity/productionCapacityData.tsx
+++ b/app/src/modules/simulation/analysis/productionCapacity/productionCapacityData.tsx
@@ -20,38 +20,15 @@ export default function ProductionCapacityData() {
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;
+ console.log('Production_capacity_per_month: ', Production_capacity_per_month);
+ console.log('throughputData: ', throughputData);
-
- 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..ccda49c 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;
@@ -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/store/builder/store.ts b/app/src/store/builder/store.ts
index eba4c47..09a5690 100644
--- a/app/src/store/builder/store.ts
+++ b/app/src/store/builder/store.ts
@@ -726,6 +726,7 @@ export interface CompareProduct {
// totalCost: number;
// revenueGenerated: number;
netProfit: number;
+ productionCapacity: 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;
}