|
|
@ -10,11 +10,11 @@ import "tabulator-tables/dist/css/tabulator.min.css";
|
|
|
|
import "../Common/Forms/Tables.css";
|
|
|
|
import "../Common/Forms/Tables.css";
|
|
|
|
import Footer from "./Footer";
|
|
|
|
import Footer from "./Footer";
|
|
|
|
import React, { useState,useRef } from "react";
|
|
|
|
import React, { useState,useRef } from "react";
|
|
|
|
import {CircularData} from "./CircularData";
|
|
|
|
|
|
|
|
import { defaultPlant, defaultProduct, defaultCenter } from "./defaults";
|
|
|
|
import { defaultPlant, defaultProduct, defaultCenter } from "./defaults";
|
|
|
|
import PipelineBlock from "./PipelineBlock";
|
|
|
|
import PipelineBlock from "./PipelineBlock";
|
|
|
|
import '@xyflow/react/dist/style.css';
|
|
|
|
import '@xyflow/react/dist/style.css';
|
|
|
|
import { CircularPlant, CircularCenter} from "./CircularData";
|
|
|
|
import { PlantNode, CenterNode, ProductNode, RELOGScenario} from "./CircularData";
|
|
|
|
|
|
|
|
|
|
|
|
declare global {
|
|
|
|
declare global {
|
|
|
|
interface Window {
|
|
|
|
interface Window {
|
|
|
|
nextX: number;
|
|
|
|
nextX: number;
|
|
|
@ -22,15 +22,17 @@ declare global {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const Default_Scenario: RELOGScenario = {
|
|
|
|
|
|
|
|
Parameters: { version: "1.0"},
|
|
|
|
|
|
|
|
Plants: {},
|
|
|
|
|
|
|
|
Products: {},
|
|
|
|
|
|
|
|
Centers: {},
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const CaseBuilder = () => {
|
|
|
|
const CaseBuilder = () => {
|
|
|
|
const nextUid= useRef(1);
|
|
|
|
const nextUid= useRef(1);
|
|
|
|
const [circularData, setCircularData] = useState<CircularData> ( {
|
|
|
|
const [scenario, setScenario] = useState<RELOGScenario>(Default_Scenario);
|
|
|
|
plants: {},
|
|
|
|
|
|
|
|
products: {},
|
|
|
|
|
|
|
|
centers: {},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
const onClear = () => {};
|
|
|
|
const onClear = () => {};
|
|
|
|
const onSave = () => {};
|
|
|
|
const onSave = () => {};
|
|
|
|
const onLoad = () => {};
|
|
|
|
const onLoad = () => {};
|
|
|
@ -52,7 +54,7 @@ const CaseBuilder = () => {
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const promptName = (prevData:CircularData): string | undefined => {
|
|
|
|
const promptName = (prevData:RELOGScenario): string | undefined => {
|
|
|
|
const name = prompt("Name");
|
|
|
|
const name = prompt("Name");
|
|
|
|
if (!name || name.length ===0) return;
|
|
|
|
if (!name || name.length ===0) return;
|
|
|
|
return name;
|
|
|
|
return name;
|
|
|
@ -60,16 +62,16 @@ const CaseBuilder = () => {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const onAddPlant = () => {
|
|
|
|
const onAddPlant = () => {
|
|
|
|
setCircularData((prevData) => {
|
|
|
|
setScenario((prevData) => {
|
|
|
|
const name = promptName(prevData);
|
|
|
|
const name = promptName(prevData);
|
|
|
|
if (name ===undefined) return prevData;
|
|
|
|
if (name ===undefined) return prevData;
|
|
|
|
|
|
|
|
|
|
|
|
const uid = `${name}-${nextUid.current++}`;
|
|
|
|
const uid = `${name}-${nextUid.current++}`;
|
|
|
|
const [x,y] = randomPosition();
|
|
|
|
const [x,y] = randomPosition();
|
|
|
|
const newData: CircularData = {
|
|
|
|
const newData: RELOGScenario = {
|
|
|
|
...prevData,
|
|
|
|
...prevData,
|
|
|
|
plants: {
|
|
|
|
Plants: {
|
|
|
|
...prevData.plants,
|
|
|
|
...prevData.Plants,
|
|
|
|
[uid]: {
|
|
|
|
[uid]: {
|
|
|
|
...defaultPlant,
|
|
|
|
...defaultPlant,
|
|
|
|
x,
|
|
|
|
x,
|
|
|
@ -84,15 +86,15 @@ const CaseBuilder = () => {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const onAddProduct = () => {
|
|
|
|
const onAddProduct = () => {
|
|
|
|
setCircularData((prevData) => {
|
|
|
|
setScenario((prevData) => {
|
|
|
|
const name = promptName(prevData);
|
|
|
|
const name = promptName(prevData);
|
|
|
|
if (name ===undefined) return prevData;
|
|
|
|
if (name ===undefined) return prevData;
|
|
|
|
const uid = `${name}-${nextUid.current++}`;
|
|
|
|
const uid = `${name}-${nextUid.current++}`;
|
|
|
|
const [x,y] = randomPosition();
|
|
|
|
const [x,y] = randomPosition();
|
|
|
|
const newData: CircularData = {
|
|
|
|
const newData: RELOGScenario = {
|
|
|
|
...prevData,
|
|
|
|
...prevData,
|
|
|
|
products: {
|
|
|
|
Products: {
|
|
|
|
...prevData.products,
|
|
|
|
...prevData.Products,
|
|
|
|
[uid]: {
|
|
|
|
[uid]: {
|
|
|
|
...defaultProduct,
|
|
|
|
...defaultProduct,
|
|
|
|
x,
|
|
|
|
x,
|
|
|
@ -108,15 +110,15 @@ const CaseBuilder = () => {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const onAddCenter = () => {
|
|
|
|
const onAddCenter = () => {
|
|
|
|
setCircularData((prevData) => {
|
|
|
|
setScenario((prevData) => {
|
|
|
|
const name = promptName(prevData);
|
|
|
|
const name = promptName(prevData);
|
|
|
|
if (name ===undefined) return prevData;
|
|
|
|
if (name ===undefined) return prevData;
|
|
|
|
const uid = `${name}-${nextUid.current++}`;
|
|
|
|
const uid = `${name}-${nextUid.current++}`;
|
|
|
|
const [x,y] = randomPosition();
|
|
|
|
const [x,y] = randomPosition();
|
|
|
|
const newData: CircularData = {
|
|
|
|
const newData: RELOGScenario = {
|
|
|
|
...prevData,
|
|
|
|
...prevData,
|
|
|
|
centers: {
|
|
|
|
Centers: {
|
|
|
|
...prevData.centers,
|
|
|
|
...prevData.Centers,
|
|
|
|
[uid]: {
|
|
|
|
[uid]: {
|
|
|
|
...defaultCenter,
|
|
|
|
...defaultCenter,
|
|
|
|
x,
|
|
|
|
x,
|
|
|
@ -131,13 +133,13 @@ const CaseBuilder = () => {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const onSetCenterInput = (centerName: string, productName: string) => {
|
|
|
|
const onSetCenterInput = (centerName: string, productName: string) => {
|
|
|
|
setCircularData((prev) => {
|
|
|
|
setScenario((prev) => {
|
|
|
|
const center = prev.centers[centerName];
|
|
|
|
const center = prev.Centers[centerName];
|
|
|
|
if (!center) return prev;
|
|
|
|
if (!center) return prev;
|
|
|
|
return {
|
|
|
|
return {
|
|
|
|
...prev,
|
|
|
|
...prev,
|
|
|
|
centers: {
|
|
|
|
centers: {
|
|
|
|
...prev.centers,
|
|
|
|
...prev.Centers,
|
|
|
|
[centerName]: { ...center, input: productName},
|
|
|
|
[centerName]: { ...center, input: productName},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
};
|
|
|
@ -146,13 +148,13 @@ const onSetCenterInput = (centerName: string, productName: string) => {
|
|
|
|
|
|
|
|
|
|
|
|
const onSetPlantInput = (plantName: string, productName: string) => {
|
|
|
|
const onSetPlantInput = (plantName: string, productName: string) => {
|
|
|
|
|
|
|
|
|
|
|
|
setCircularData((prevData: CircularData) => {
|
|
|
|
setScenario((prevData: RELOGScenario) => {
|
|
|
|
|
|
|
|
|
|
|
|
const plant = prevData.plants[plantName];
|
|
|
|
const plant = prevData.Plants[plantName];
|
|
|
|
|
|
|
|
|
|
|
|
if (!plant) return prevData;
|
|
|
|
if (!plant) return prevData;
|
|
|
|
|
|
|
|
|
|
|
|
const updatedPlant: CircularPlant = {
|
|
|
|
const updatedPlant: PlantNode = {
|
|
|
|
|
|
|
|
|
|
|
|
...plant,
|
|
|
|
...plant,
|
|
|
|
|
|
|
|
|
|
|
@ -170,7 +172,7 @@ const onSetCenterInput = (centerName: string, productName: string) => {
|
|
|
|
|
|
|
|
|
|
|
|
plants: {
|
|
|
|
plants: {
|
|
|
|
|
|
|
|
|
|
|
|
...prevData.plants,
|
|
|
|
...prevData.Plants,
|
|
|
|
|
|
|
|
|
|
|
|
[plantName]: updatedPlant,
|
|
|
|
[plantName]: updatedPlant,
|
|
|
|
|
|
|
|
|
|
|
@ -185,8 +187,8 @@ const onSetCenterInput = (centerName: string, productName: string) => {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const onAddPlantOutput = (plantName: string, productName: string) => {
|
|
|
|
const onAddPlantOutput = (plantName: string, productName: string) => {
|
|
|
|
setCircularData(prevData => {
|
|
|
|
setScenario(prevData => {
|
|
|
|
const plant = prevData.plants[plantName];
|
|
|
|
const plant = prevData.Plants[plantName];
|
|
|
|
if (!plant) return prevData;
|
|
|
|
if (!plant) return prevData;
|
|
|
|
|
|
|
|
|
|
|
|
const newOutputs = plant.outputs.includes(productName)
|
|
|
|
const newOutputs = plant.outputs.includes(productName)
|
|
|
@ -196,7 +198,7 @@ const onAddPlantOutput = (plantName: string, productName: string) => {
|
|
|
|
return {
|
|
|
|
return {
|
|
|
|
...prevData,
|
|
|
|
...prevData,
|
|
|
|
plants: {
|
|
|
|
plants: {
|
|
|
|
...prevData.plants,
|
|
|
|
...prevData.Plants,
|
|
|
|
[plantName]: {
|
|
|
|
[plantName]: {
|
|
|
|
...plant,
|
|
|
|
...plant,
|
|
|
|
outputs: newOutputs,
|
|
|
|
outputs: newOutputs,
|
|
|
@ -207,15 +209,15 @@ const onAddPlantOutput = (plantName: string, productName: string) => {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const onAddCenterOutput = (centerName: string, productName: string) => {
|
|
|
|
const onAddCenterOutput = (centerName: string, productName: string) => {
|
|
|
|
setCircularData((prev) => {
|
|
|
|
setScenario((prev) => {
|
|
|
|
const center = prev.centers[centerName];
|
|
|
|
const center = prev.Centers[centerName];
|
|
|
|
if (!center) return prev;
|
|
|
|
if (!center) return prev;
|
|
|
|
|
|
|
|
|
|
|
|
const updatedOutputs = [...center.output, productName];
|
|
|
|
const updatedOutputs = [...center.output, productName];
|
|
|
|
return {
|
|
|
|
return {
|
|
|
|
...prev,
|
|
|
|
...prev,
|
|
|
|
centers: {
|
|
|
|
centers: {
|
|
|
|
...prev.centers,
|
|
|
|
...prev.Centers,
|
|
|
|
[centerName]: { ...center, output: updatedOutputs},
|
|
|
|
[centerName]: { ...center, output: updatedOutputs},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
};
|
|
|
@ -225,20 +227,20 @@ const onAddCenterOutput = (centerName: string, productName: string) => {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const onMovePlant = (plantName: string, x: number, y: number) => {
|
|
|
|
const onMovePlant = (plantName: string, x: number, y: number) => {
|
|
|
|
setCircularData((prevData: CircularData): CircularData => {
|
|
|
|
setScenario((prevData: RELOGScenario): RELOGScenario => {
|
|
|
|
const newData: CircularData ={ ...prevData};
|
|
|
|
const newData: RELOGScenario ={ ...prevData};
|
|
|
|
if (!newData.plants[plantName]) return prevData;
|
|
|
|
if (!newData.Plants[plantName]) return prevData;
|
|
|
|
newData.plants[plantName].x =x;
|
|
|
|
newData.Plants[plantName].x =x;
|
|
|
|
newData.plants[plantName].y =y;
|
|
|
|
newData.Plants[plantName].y =y;
|
|
|
|
return newData;
|
|
|
|
return newData;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const onMoveProduct = (productName: string, x: number, y: number) => {
|
|
|
|
const onMoveProduct = (productName: string, x: number, y: number) => {
|
|
|
|
setCircularData((prevData: CircularData): CircularData => {
|
|
|
|
setScenario((prevData: RELOGScenario): RELOGScenario => {
|
|
|
|
const newData: CircularData ={ ...prevData};
|
|
|
|
const newData: RELOGScenario ={ ...prevData};
|
|
|
|
const product = newData.products[productName];
|
|
|
|
const product = newData.Products[productName];
|
|
|
|
if (!product) return prevData;
|
|
|
|
if (!product) return prevData;
|
|
|
|
product.x = x;
|
|
|
|
product.x = x;
|
|
|
|
product.y =y;
|
|
|
|
product.y =y;
|
|
|
@ -248,13 +250,13 @@ const onAddCenterOutput = (centerName: string, productName: string) => {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const onMoveCenter = (centerName: string, x: number, y: number) => {
|
|
|
|
const onMoveCenter = (centerName: string, x: number, y: number) => {
|
|
|
|
setCircularData((prev) => {
|
|
|
|
setScenario((prev) => {
|
|
|
|
const center = prev.centers[centerName];
|
|
|
|
const center = prev.Centers[centerName];
|
|
|
|
if (!center) return prev;
|
|
|
|
if (!center) return prev;
|
|
|
|
return {
|
|
|
|
return {
|
|
|
|
...prev,
|
|
|
|
...prev,
|
|
|
|
centers: {
|
|
|
|
centers: {
|
|
|
|
...prev.centers,
|
|
|
|
...prev.Centers,
|
|
|
|
[centerName]: { ...center,x,y},
|
|
|
|
[centerName]: { ...center,x,y},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
};
|
|
|
@ -262,39 +264,39 @@ const onAddCenterOutput = (centerName: string, productName: string) => {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const onRemovePlant = (plantName: string) => {
|
|
|
|
const onRemovePlant = (plantName: string) => {
|
|
|
|
setCircularData(prev => {
|
|
|
|
setScenario(prev => {
|
|
|
|
const next = { ...prev };
|
|
|
|
const next = { ...prev };
|
|
|
|
delete next.plants[plantName];
|
|
|
|
delete next.Plants[plantName];
|
|
|
|
|
|
|
|
|
|
|
|
return next;
|
|
|
|
return next;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
};
|
|
|
|
const onRemoveProduct = (productName: string) => {
|
|
|
|
const onRemoveProduct = (productName: string) => {
|
|
|
|
setCircularData(prev => {
|
|
|
|
setScenario(prev => {
|
|
|
|
const next = { ...prev };
|
|
|
|
const next = { ...prev };
|
|
|
|
delete next.products[productName];
|
|
|
|
delete next.Products[productName];
|
|
|
|
|
|
|
|
|
|
|
|
return next;
|
|
|
|
return next;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const onRemoveCenter = (centerName: string) => {
|
|
|
|
const onRemoveCenter = (centerName: string) => {
|
|
|
|
setCircularData(prev => {
|
|
|
|
setScenario(prev => {
|
|
|
|
const next = { ...prev };
|
|
|
|
const next = { ...prev };
|
|
|
|
delete next.centers[centerName];
|
|
|
|
delete next.Centers[centerName];
|
|
|
|
|
|
|
|
|
|
|
|
return next;
|
|
|
|
return next;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const onRenamePlant = (uniqueId: string, newName: string) => {
|
|
|
|
const onRenamePlant = (uniqueId: string, newName: string) => {
|
|
|
|
setCircularData(prev => {
|
|
|
|
setScenario(prev => {
|
|
|
|
const plant = prev.plants[uniqueId];
|
|
|
|
const plant = prev.Plants[uniqueId];
|
|
|
|
if (!plant) return prev;
|
|
|
|
if (!plant) return prev;
|
|
|
|
const next = {
|
|
|
|
const next = {
|
|
|
|
...prev,
|
|
|
|
...prev,
|
|
|
|
plants: {
|
|
|
|
plants: {
|
|
|
|
...prev.plants,
|
|
|
|
...prev.Plants,
|
|
|
|
[uniqueId]: { ...plant, name: newName},
|
|
|
|
[uniqueId]: { ...plant, name: newName},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
};
|
|
|
@ -305,13 +307,13 @@ const onAddCenterOutput = (centerName: string, productName: string) => {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const onRenameProduct = (uniqueId: string, newName: string) => {
|
|
|
|
const onRenameProduct = (uniqueId: string, newName: string) => {
|
|
|
|
setCircularData(prev => {
|
|
|
|
setScenario(prev => {
|
|
|
|
const product = prev.products[uniqueId];
|
|
|
|
const product = prev.Products[uniqueId];
|
|
|
|
if (!product) return prev;
|
|
|
|
if (!product) return prev;
|
|
|
|
const next = {
|
|
|
|
const next = {
|
|
|
|
...prev,
|
|
|
|
...prev,
|
|
|
|
products: {
|
|
|
|
products: {
|
|
|
|
...prev.products,
|
|
|
|
...prev.Products,
|
|
|
|
[uniqueId]: { ...product, name: newName},
|
|
|
|
[uniqueId]: { ...product, name: newName},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
};
|
|
|
@ -320,13 +322,13 @@ const onRenameProduct = (uniqueId: string, newName: string) => {
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const onRenameCenter = (uniqueId: string, newName: string) => {
|
|
|
|
const onRenameCenter = (uniqueId: string, newName: string) => {
|
|
|
|
setCircularData(prev => {
|
|
|
|
setScenario(prev => {
|
|
|
|
const center = prev.centers[uniqueId];
|
|
|
|
const center = prev.Centers[uniqueId];
|
|
|
|
if (!center) return prev;
|
|
|
|
if (!center) return prev;
|
|
|
|
const next = {
|
|
|
|
const next = {
|
|
|
|
...prev,
|
|
|
|
...prev,
|
|
|
|
centers: {
|
|
|
|
centers: {
|
|
|
|
...prev.centers,
|
|
|
|
...prev.Centers,
|
|
|
|
[uniqueId]: { ...center, name: newName},
|
|
|
|
[uniqueId]: { ...center, name: newName},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
};
|
|
|
|
};
|
|
|
@ -345,15 +347,15 @@ const onRenameCenter = (uniqueId: string, newName: string) => {
|
|
|
|
onAddProduct={onAddProduct}
|
|
|
|
onAddProduct={onAddProduct}
|
|
|
|
onMovePlant={onMovePlant}
|
|
|
|
onMovePlant={onMovePlant}
|
|
|
|
onMoveProduct={onMoveProduct}
|
|
|
|
onMoveProduct={onMoveProduct}
|
|
|
|
plants={circularData.plants}
|
|
|
|
plants={scenario.Plants}
|
|
|
|
products={circularData.products}
|
|
|
|
products={scenario.Products}
|
|
|
|
onSetPlantInput={onSetPlantInput}
|
|
|
|
onSetPlantInput={onSetPlantInput}
|
|
|
|
onAddPlantOutput={onAddPlantOutput}
|
|
|
|
onAddPlantOutput={onAddPlantOutput}
|
|
|
|
onAddCenter= {onAddCenter}
|
|
|
|
onAddCenter= {onAddCenter}
|
|
|
|
onAddCenterInput={onSetCenterInput}
|
|
|
|
onAddCenterInput={onSetCenterInput}
|
|
|
|
onAddCenterOutput={onAddCenterOutput}
|
|
|
|
onAddCenterOutput={onAddCenterOutput}
|
|
|
|
onMoveCenter={onMoveCenter}
|
|
|
|
onMoveCenter={onMoveCenter}
|
|
|
|
centers={circularData.centers}
|
|
|
|
centers={scenario.Centers}
|
|
|
|
onRemovePlant={onRemovePlant}
|
|
|
|
onRemovePlant={onRemovePlant}
|
|
|
|
onRemoveProduct={onRemoveProduct}
|
|
|
|
onRemoveProduct={onRemoveProduct}
|
|
|
|
onRemoveCenter={onRemoveCenter}
|
|
|
|
onRemoveCenter={onRemoveCenter}
|
|
|
|