Merge remote-tracking branch 'origin/v2' into simulation-agv-v2

This commit is contained in:
Poovizhi99 2025-05-02 14:05:31 +05:30
commit 14e3a60db3
20 changed files with 345 additions and 192 deletions

View File

@ -35,7 +35,7 @@ const ActionsList: React.FC<ActionsListProps> = ({
const handleRenameAction = (newName: string) => { const handleRenameAction = (newName: string) => {
if (!selectedAction.actionId) return; if (!selectedAction.actionId) return;
const event = renameAction(selectedAction.actionId, newName); const event = renameAction(selectedProduct.productId, selectedAction.actionId, newName);
if (event) { if (event) {
upsertProductOrEventApi({ upsertProductOrEventApi({

View File

@ -72,7 +72,7 @@ function ConveyorMechanics() {
const validOption = option as | "default" | "spawn" | "swap" | "delay" | "despawn"; const validOption = option as | "default" | "spawn" | "swap" | "delay" | "despawn";
setActiveOption(validOption); setActiveOption(validOption);
const event = updateAction(selectedPointData.action.actionUuid, { const event = updateAction(selectedProduct.productId, selectedPointData.action.actionUuid, {
actionType: validOption, actionType: validOption,
}); });
@ -88,7 +88,7 @@ function ConveyorMechanics() {
const handleRenameAction = (newName: string) => { const handleRenameAction = (newName: string) => {
if (!selectedEventData || !selectedPointData) return; if (!selectedEventData || !selectedPointData) return;
const event = updateAction(selectedPointData.action.actionUuid, { actionName: newName }); const event = updateAction(selectedProduct.productId, selectedPointData.action.actionUuid, { actionName: newName });
if (event) { if (event) {
updateBackend( updateBackend(
@ -102,7 +102,7 @@ function ConveyorMechanics() {
const handleSpawnCountChange = (value: string) => { const handleSpawnCountChange = (value: string) => {
if (!selectedEventData || !selectedPointData) return; if (!selectedEventData || !selectedPointData) return;
const event = updateAction(selectedPointData.action.actionUuid, { const event = updateAction(selectedProduct.productId, selectedPointData.action.actionUuid, {
spawnCount: value === "inherit" ? "inherit" : parseFloat(value), spawnCount: value === "inherit" ? "inherit" : parseFloat(value),
}); });
@ -118,7 +118,7 @@ function ConveyorMechanics() {
const handleSpawnIntervalChange = (value: string) => { const handleSpawnIntervalChange = (value: string) => {
if (!selectedEventData || !selectedPointData) return; if (!selectedEventData || !selectedPointData) return;
const event = updateAction(selectedPointData.action.actionUuid, { const event = updateAction(selectedProduct.productId, selectedPointData.action.actionUuid, {
spawnInterval: value === "inherit" ? "inherit" : parseFloat(value), spawnInterval: value === "inherit" ? "inherit" : parseFloat(value),
}); });
@ -134,7 +134,7 @@ function ConveyorMechanics() {
const handleMaterialSelect = (material: string) => { const handleMaterialSelect = (material: string) => {
if (!selectedEventData || !selectedPointData) return; if (!selectedEventData || !selectedPointData) return;
const event = updateAction(selectedPointData.action.actionUuid, { material }); const event = updateAction(selectedProduct.productId, selectedPointData.action.actionUuid, { material });
if (event) { if (event) {
updateBackend( updateBackend(
@ -148,7 +148,7 @@ function ConveyorMechanics() {
const handleDelayChange = (value: string) => { const handleDelayChange = (value: string) => {
if (!selectedEventData || !selectedPointData) return; if (!selectedEventData || !selectedPointData) return;
const event = updateAction(selectedPointData.action.actionUuid, { const event = updateAction(selectedProduct.productId, selectedPointData.action.actionUuid, {
delay: value === "inherit" ? "inherit" : parseFloat(value), delay: value === "inherit" ? "inherit" : parseFloat(value),
}); });

View File

@ -51,7 +51,7 @@ function MachineMechanics() {
const validOption = option as "process"; const validOption = option as "process";
setActiveOption(validOption); setActiveOption(validOption);
const event = updateAction(selectedPointData.action.actionUuid, { const event = updateAction(selectedProduct.productId, selectedPointData.action.actionUuid, {
actionType: validOption, actionType: validOption,
}); });
@ -67,19 +67,19 @@ function MachineMechanics() {
const handleRenameAction = (newName: string) => { const handleRenameAction = (newName: string) => {
if (!selectedPointData) return; if (!selectedPointData) return;
const event = updateAction(selectedPointData.action.actionUuid, { actionName: newName }); const event = updateAction(selectedProduct.productId, selectedPointData.action.actionUuid, { actionName: newName });
}; };
const handleProcessTimeChange = (value: string) => { const handleProcessTimeChange = (value: string) => {
if (!selectedPointData) return; if (!selectedPointData) return;
const event = updateAction(selectedPointData.action.actionUuid, { const event = updateAction(selectedProduct.productId, selectedPointData.action.actionUuid, {
processTime: parseFloat(value), processTime: parseFloat(value),
}); });
}; };
const handleMaterialSelect = (material: string) => { const handleMaterialSelect = (material: string) => {
if (!selectedPointData) return; if (!selectedPointData) return;
const event = updateAction(selectedPointData.action.actionUuid, { const event = updateAction(selectedProduct.productId, selectedPointData.action.actionUuid, {
swapMaterial: material, swapMaterial: material,
}); });
}; };

View File

@ -59,7 +59,7 @@ function RoboticArmMechanics() {
const handleRenameAction = (newName: string) => { const handleRenameAction = (newName: string) => {
if (!selectedAction.actionId) return; if (!selectedAction.actionId) return;
const event = updateAction(selectedAction.actionId, { actionName: newName }); const event = updateAction(selectedProduct.productId, selectedAction.actionId, { actionName: newName });
if (selectedPointData) { if (selectedPointData) {
const updatedActions = selectedPointData.actions.map((action) => const updatedActions = selectedPointData.actions.map((action) =>
@ -101,7 +101,7 @@ function RoboticArmMechanics() {
if (!selectedAction.actionId || !selectedPointData) return; if (!selectedAction.actionId || !selectedPointData) return;
const [x, y, z] = value.split(",").map(Number); const [x, y, z] = value.split(",").map(Number);
const event = updateAction(selectedAction.actionId, { const event = updateAction(selectedProduct.productId, selectedAction.actionId, {
process: { process: {
startPoint: [x, y, z] as [number, number, number], startPoint: [x, y, z] as [number, number, number],
endPoint: selectedPointData.actions.find((a) => a.actionUuid === selectedAction.actionId)?.process.endPoint || null, endPoint: selectedPointData.actions.find((a) => a.actionUuid === selectedAction.actionId)?.process.endPoint || null,
@ -122,7 +122,7 @@ function RoboticArmMechanics() {
if (!selectedAction.actionId || !selectedPointData) return; if (!selectedAction.actionId || !selectedPointData) return;
const [x, y, z] = value.split(",").map(Number); const [x, y, z] = value.split(",").map(Number);
const event = updateAction(selectedAction.actionId, { const event = updateAction(selectedProduct.productId, selectedAction.actionId, {
process: { process: {
startPoint: selectedPointData.actions.find((a) => a.actionUuid === selectedAction.actionId)?.process.startPoint || null, startPoint: selectedPointData.actions.find((a) => a.actionUuid === selectedAction.actionId)?.process.startPoint || null,
endPoint: [x, y, z] as [number, number, number], endPoint: [x, y, z] as [number, number, number],
@ -181,7 +181,7 @@ function RoboticArmMechanics() {
const handleDeleteAction = (actionUuid: string) => { const handleDeleteAction = (actionUuid: string) => {
if (!selectedPointData) return; if (!selectedPointData) return;
const event = removeAction(actionUuid); const event = removeAction(selectedProduct.productId, actionUuid);
if (event) { if (event) {
updateBackend( updateBackend(

View File

@ -51,7 +51,7 @@ function StorageMechanics() {
const validOption = option as "store" | "spawn"; const validOption = option as "store" | "spawn";
setActiveOption(validOption); setActiveOption(validOption);
const event = updateAction(selectedPointData.action.actionUuid, { const event = updateAction(selectedProduct.productId, selectedPointData.action.actionUuid, {
actionType: validOption, actionType: validOption,
}); });
@ -67,7 +67,7 @@ function StorageMechanics() {
const handleRenameAction = (newName: string) => { const handleRenameAction = (newName: string) => {
if (!selectedPointData) return; if (!selectedPointData) return;
const event = updateAction(selectedPointData.action.actionUuid, { actionName: newName }); const event = updateAction(selectedProduct.productId, selectedPointData.action.actionUuid, { actionName: newName });
if (event) { if (event) {
updateBackend( updateBackend(
@ -81,7 +81,7 @@ function StorageMechanics() {
const handleCapacityChange = (value: string) => { const handleCapacityChange = (value: string) => {
if (!selectedPointData) return; if (!selectedPointData) return;
const event = updateAction(selectedPointData.action.actionUuid, { const event = updateAction(selectedProduct.productId, selectedPointData.action.actionUuid, {
storageCapacity: parseInt(value), storageCapacity: parseInt(value),
}); });

View File

@ -72,7 +72,7 @@ function VehicleMechanics() {
const validOption = option as "travel"; const validOption = option as "travel";
setActiveOption(validOption); setActiveOption(validOption);
const event = updateAction(selectedPointData.action.actionUuid, { const event = updateAction(selectedProduct.productId, selectedPointData.action.actionUuid, {
actionType: validOption, actionType: validOption,
}); });
@ -88,7 +88,7 @@ function VehicleMechanics() {
const handleRenameAction = (newName: string) => { const handleRenameAction = (newName: string) => {
if (!selectedPointData) return; if (!selectedPointData) return;
const event = updateAction(selectedPointData.action.actionUuid, { actionName: newName }); const event = updateAction(selectedProduct.productId, selectedPointData.action.actionUuid, { actionName: newName });
if (event) { if (event) {
updateBackend( updateBackend(
@ -102,7 +102,7 @@ function VehicleMechanics() {
const handleLoadCapacityChange = (value: string) => { const handleLoadCapacityChange = (value: string) => {
if (!selectedPointData) return; if (!selectedPointData) return;
const event = updateAction(selectedPointData.action.actionUuid, { const event = updateAction(selectedProduct.productId, selectedPointData.action.actionUuid, {
loadCapacity: parseFloat(value), loadCapacity: parseFloat(value),
}); });
@ -118,7 +118,7 @@ function VehicleMechanics() {
const handleUnloadDurationChange = (value: string) => { const handleUnloadDurationChange = (value: string) => {
if (!selectedPointData) return; if (!selectedPointData) return;
const event = updateAction(selectedPointData.action.actionUuid, { const event = updateAction(selectedProduct.productId, selectedPointData.action.actionUuid, {
unLoadDuration: parseFloat(value), unLoadDuration: parseFloat(value),
}); });

View File

@ -202,11 +202,11 @@ function processLoadedModel(
rotation: [item.eventData.point?.rotation[0] || 0, item.eventData.point?.rotation[1] || 0, item.eventData.point?.rotation[2] || 0], rotation: [item.eventData.point?.rotation[0] || 0, item.eventData.point?.rotation[1] || 0, item.eventData.point?.rotation[2] || 0],
action: { action: {
actionUuid: THREE.MathUtils.generateUUID(), actionUuid: THREE.MathUtils.generateUUID(),
actionName: "Vehicle Action", actionName: "Action 1",
actionType: "travel", actionType: "travel",
unLoadDuration: 5, unLoadDuration: 5,
loadCapacity: 10, loadCapacity: 10,
steeringAngle:0, steeringAngle: 0,
pickUpPoint: null, pickUpPoint: null,
unLoadPoint: null, unLoadPoint: null,
triggers: [] triggers: []
@ -254,7 +254,7 @@ function processLoadedModel(
rotation: [item.eventData.point?.rotation[0] || 0, item.eventData.point?.rotation[1] || 0, item.eventData.point?.rotation[2] || 0], rotation: [item.eventData.point?.rotation[0] || 0, item.eventData.point?.rotation[1] || 0, item.eventData.point?.rotation[2] || 0],
action: { action: {
actionUuid: THREE.MathUtils.generateUUID(), actionUuid: THREE.MathUtils.generateUUID(),
actionName: "Process Action", actionName: "Action 1",
actionType: "process", actionType: "process",
processTime: 10, processTime: 10,
swapMaterial: "material-id", swapMaterial: "material-id",
@ -279,7 +279,7 @@ function processLoadedModel(
actions: [ actions: [
{ {
actionUuid: THREE.MathUtils.generateUUID(), actionUuid: THREE.MathUtils.generateUUID(),
actionName: "Pick and Place", actionName: "Action 1",
actionType: "pickAndPlace", actionType: "pickAndPlace",
process: { process: {
startPoint: [0, 0, 0], startPoint: [0, 0, 0],

View File

@ -1,29 +1,42 @@
import React from 'react' import React, { useEffect } from 'react'
import MachineInstances from './instances/machineInstances' import MachineInstances from './instances/machineInstances'
import { useMachineStore } from '../../../store/simulation/useMachineStore'
import { useSelectedProduct } from '../../../store/simulation/useSimulationStore';
function Machine() { function Machine() {
const { addMachine, addCurrentAction, removeMachine } = useMachineStore();
const { selectedProduct } = useSelectedProduct();
const machineSample: MachineEventSchema = { const machineSample: MachineEventSchema[] = [
modelUuid: "machine-1234-5678-9012", {
modelName: "CNC Milling Machine", modelUuid: "machine-1234-5678-9012",
position: [10, 0, 5], modelName: "CNC Milling Machine",
rotation: [0, 0, 0], position: [10, 0, 5],
state: "idle",
type: "machine",
point: {
uuid: "machine-point-9876-5432-1098",
position: [10, 0.5, 5.2],
rotation: [0, 0, 0], rotation: [0, 0, 0],
action: { state: "idle",
actionUuid: "machine-action-2468-1357-8024", type: "machine",
actionName: "Metal Processing", point: {
actionType: "process", uuid: "machine-point-9876-5432-1098",
processTime: 10, position: [10, 0.5, 5.2],
swapMaterial: "steel", rotation: [0, 0, 0],
triggers: [] action: {
actionUuid: "machine-action-2468-1357-8024",
actionName: "Metal Processing",
actionType: "process",
processTime: 10,
swapMaterial: "steel",
triggers: []
}
} }
} }
}; ];
useEffect(() => {
removeMachine(machineSample[0].modelUuid);
addMachine(selectedProduct.productId, machineSample[0]);
// addCurrentAction(machineSample[0].modelUuid, machineSample[0].point.action.actionUuid);
}, [])
return ( return (
<> <>

View File

@ -7,7 +7,7 @@ import { upsertProductOrEventApi } from '../../../services/simulation/UpsertProd
import { getAllProductsApi } from '../../../services/simulation/getallProductsApi'; import { getAllProductsApi } from '../../../services/simulation/getallProductsApi';
function Products() { function Products() {
const { products, addProduct, setProducts } = useProductStore(); const { addProduct, setProducts } = useProductStore();
const { setSelectedProduct } = useSelectedProduct(); const { setSelectedProduct } = useSelectedProduct();
useEffect(() => { useEffect(() => {
@ -27,9 +27,6 @@ function Products() {
}) })
}, []) }, [])
useEffect(() => {
}, [])
return ( return (
<> <>

View File

@ -171,10 +171,16 @@ function TriggerConnector() {
(intersect) => (intersect) =>
intersect.object.name === ('Event-Sphere') intersect.object.name === ('Event-Sphere')
); );
if (intersects.length === 0) return; if (intersects.length === 0) {
setFirstSelectedPoint(null);
return;
};
const currentObject = intersects[0].object; const currentObject = intersects[0].object;
if (!currentObject || currentObject.name !== 'Event-Sphere') return; if (!currentObject || currentObject.name !== 'Event-Sphere') {
setFirstSelectedPoint(null);
return;
};
const modelUuid = currentObject.userData.modelUuid; const modelUuid = currentObject.userData.modelUuid;
const pointUuid = currentObject.userData.pointUuid; const pointUuid = currentObject.userData.pointUuid;
@ -189,7 +195,10 @@ function TriggerConnector() {
const event = getEventByModelUuid(selectedProduct.productId, modelUuid); const event = getEventByModelUuid(selectedProduct.productId, modelUuid);
if (!point || !event) return; if (!point || !event) {
setFirstSelectedPoint(null);
return;
};
let actionUuid: string | undefined; let actionUuid: string | undefined;
if ('action' in point && point.action) { if ('action' in point && point.action) {
@ -228,7 +237,7 @@ function TriggerConnector() {
}; };
if (firstSelectedPoint.actionUuid) { if (firstSelectedPoint.actionUuid) {
const event = addTrigger(firstSelectedPoint.actionUuid, trigger); const event = addTrigger(selectedProduct.productId, firstSelectedPoint.actionUuid, trigger);
if (event) { if (event) {
updateBackend( updateBackend(
@ -254,7 +263,12 @@ function TriggerConnector() {
pointUuid pointUuid
); );
if (!point) return; const event = getEventByModelUuid(selectedProduct.productId, modelUuid);
if (!point || !event) {
setFirstSelectedPoint(null);
return;
};
let actionUuid: string | undefined; let actionUuid: string | undefined;
if ('action' in point && point.action) { if ('action' in point && point.action) {
@ -270,12 +284,12 @@ function TriggerConnector() {
delay: 0, delay: 0,
triggeredAsset: { triggeredAsset: {
triggeredModel: { triggeredModel: {
modelName: currentObject.parent?.parent?.name || 'Unknown', modelName: event.modelName || 'Unknown',
modelUuid: modelUuid modelUuid: modelUuid
}, },
triggeredPoint: { triggeredPoint: {
pointName: currentObject.name, pointName: 'Point',
pointUuid: pointUuid pointUuid: point.uuid
}, },
triggeredAction: actionUuid ? { triggeredAction: actionUuid ? {
actionName: getActionByUuid(selectedProduct.productId, actionUuid)?.actionName || 'Action', actionName: getActionByUuid(selectedProduct.productId, actionUuid)?.actionName || 'Action',
@ -285,13 +299,24 @@ function TriggerConnector() {
}; };
if (firstSelectedPoint.actionUuid) { if (firstSelectedPoint.actionUuid) {
addTrigger(firstSelectedPoint.actionUuid, trigger); const event = addTrigger(selectedProduct.productId, firstSelectedPoint.actionUuid, trigger);
if (event) {
updateBackend(
selectedProduct.productName,
selectedProduct.productId,
organization,
event
);
}
} }
setFirstSelectedPoint(null); setFirstSelectedPoint(null);
} else if (firstSelectedPoint) {
setFirstSelectedPoint(null);
} }
}; };
if (subModule === 'simulations') { if (subModule === 'simulations' && !deleteTool) {
canvasElement.addEventListener("mousedown", onMouseDown); canvasElement.addEventListener("mousedown", onMouseDown);
canvasElement.addEventListener("mouseup", onMouseUp); canvasElement.addEventListener("mouseup", onMouseUp);
canvasElement.addEventListener("mousemove", onMouseMove); canvasElement.addEventListener("mousemove", onMouseMove);
@ -305,7 +330,7 @@ function TriggerConnector() {
canvasElement.removeEventListener('contextmenu', handleRightClick); canvasElement.removeEventListener('contextmenu', handleRightClick);
}; };
}, [gl, subModule, selectedProduct, firstSelectedPoint]); }, [gl, subModule, selectedProduct, firstSelectedPoint, deleteTool]);
useFrame(() => { useFrame(() => {
@ -373,9 +398,8 @@ function TriggerConnector() {
const removeConnection = (connection: ConnectionLine) => { const removeConnection = (connection: ConnectionLine) => {
if (connection.trigger.triggerUuid) { if (connection.trigger.triggerUuid) {
const event = removeTrigger(connection.trigger.triggerUuid); const event = removeTrigger(selectedProduct.productId, connection.trigger.triggerUuid);
if (event) { if (event) {
console.log('event: ', event);
updateBackend( updateBackend(
selectedProduct.productName, selectedProduct.productName,
selectedProduct.productId, selectedProduct.productId,

View File

@ -1,45 +1,46 @@
import React, { useEffect, useState } from "react"; import React, { useEffect } from "react";
import VehicleInstances from "./instances/vehicleInstances"; import VehicleInstances from "./instances/vehicleInstances";
import { useVehicleStore } from "../../../store/simulation/useVehicleStore"; import { useVehicleStore } from "../../../store/simulation/useVehicleStore";
import { useFloorItems } from "../../../store/store";
import { useSelectedEventData, useSelectedEventSphere, useSelectedProduct } from "../../../store/simulation/useSimulationStore"; import { useSelectedEventData, useSelectedEventSphere, useSelectedProduct } from "../../../store/simulation/useSimulationStore";
import VehicleUI from "../ui/vehicle/vehicleUI"; import VehicleUI from "../ui/vehicle/vehicleUI";
import { usePlayButtonStore } from "../../../store/usePlayButtonStore"; import { usePlayButtonStore } from "../../../store/usePlayButtonStore";
import { useProductStore } from "../../../store/simulation/useProductStore"; import { useProductStore } from "../../../store/simulation/useProductStore";
function Vehicles() { function Vehicles() {
const { getProductById } = useProductStore(); const { products, getProductById } = useProductStore();
const { selectedProduct } = useSelectedProduct(); const { selectedProduct } = useSelectedProduct();
const { vehicles, addVehicle, removeVehicle } = useVehicleStore(); const { vehicles, addVehicle, clearvehicles } = useVehicleStore();
const { selectedEventSphere } = useSelectedEventSphere(); const { selectedEventSphere } = useSelectedEventSphere();
const { selectedEventData } = useSelectedEventData(); const { selectedEventData } = useSelectedEventData();
const { floorItems } = useFloorItems();
const { isPlaying } = usePlayButtonStore(); const { isPlaying } = usePlayButtonStore();
useEffect(() => { useEffect(() => {
if (selectedProduct.productId) { if (selectedProduct.productId) {
const product = getProductById(selectedProduct.productId); const product = getProductById(selectedProduct.productId);
if (product) { if (product) {
clearvehicles();
product.eventDatas.forEach(events => { product.eventDatas.forEach(events => {
if (events.type === 'vehicle') { if (events.type === 'vehicle') {
removeVehicle(events.modelUuid);
addVehicle(selectedProduct.productId, events); addVehicle(selectedProduct.productId, events);
} }
}); });
} }
} }
}, [selectedProduct]); }, [selectedProduct, products]);
useEffect(() => {
useEffect(() => {
// console.log('vehicles: ', vehicles); // console.log('vehicles: ', vehicles);
}, [vehicles]) }, [vehicles])
return ( return (
<> <>
<VehicleInstances /> <VehicleInstances />
{selectedEventSphere && selectedEventData?.data.type === "vehicle" && !isPlaying && {selectedEventSphere && selectedEventData?.data.type === "vehicle" && !isPlaying &&
< VehicleUI /> < VehicleUI />
} }
</> </>
); );
} }

View File

@ -66,8 +66,7 @@ const RealTimeVisulization: React.FC = () => {
const { selectedZone, setSelectedZone } = useSelectedZoneStore(); const { selectedZone, setSelectedZone } = useSelectedZoneStore();
const { setRightSelect } = useRightSelected(); const { setRightSelect } = useRightSelected();
const { editWidgetOptions, setEditWidgetOptions } = const { editWidgetOptions, setEditWidgetOptions } = useEditWidgetOptionsStore();
useEditWidgetOptionsStore();
const { rightClickSelected, setRightClickSelected } = useRightClickSelected(); const { rightClickSelected, setRightClickSelected } = useRightClickSelected();
const [openConfirmationPopup, setOpenConfirmationPopup] = useState(false); const [openConfirmationPopup, setOpenConfirmationPopup] = useState(false);
const { setFloatingWidget } = useFloatingWidget(); const { setFloatingWidget } = useFloatingWidget();
@ -76,8 +75,6 @@ const RealTimeVisulization: React.FC = () => {
const { setSelectedChartId } = useWidgetStore(); const { setSelectedChartId } = useWidgetStore();
const [waitingPanels, setWaitingPanels] = useState(null); const [waitingPanels, setWaitingPanels] = useState(null);
console.log("waitingPanels: ", waitingPanels);
OuterClick({ OuterClick({
contextClassName: [ contextClassName: [
"chart-container", "chart-container",

View File

@ -10,6 +10,7 @@ interface ArmBotStore {
modelUuid: string, modelUuid: string,
updates: Partial<Omit<ArmBotStatus, 'modelUuid' | 'productId'>> updates: Partial<Omit<ArmBotStatus, 'modelUuid' | 'productId'>>
) => void; ) => void;
clearArmBots: () => void;
addCurrentAction: (modelUuid: string, actionUuid: string) => void; addCurrentAction: (modelUuid: string, actionUuid: string) => void;
removeCurrentAction: (modelUuid: string) => void; removeCurrentAction: (modelUuid: string) => void;
@ -39,14 +40,17 @@ export const useArmBotStore = create<ArmBotStore>()(
addArmBot: (productId, event) => { addArmBot: (productId, event) => {
set((state) => { set((state) => {
state.armBots.push({ const exists = state.armBots.some(a => a.modelUuid === event.modelUuid);
...event, if (!exists) {
productId, state.armBots.push({
isActive: false, ...event,
idleTime: 0, productId,
activeTime: 0, isActive: false,
state: 'idle', idleTime: 0,
}); activeTime: 0,
state: 'idle',
});
}
}); });
}, },
@ -65,6 +69,12 @@ export const useArmBotStore = create<ArmBotStore>()(
}); });
}, },
clearArmBots: () => {
set((state) => {
state.armBots = [];
});
},
addCurrentAction: (modelUuid, actionUuid) => { addCurrentAction: (modelUuid, actionUuid) => {
set((state) => { set((state) => {
const armBot = state.armBots.find(a => a.modelUuid === modelUuid); const armBot = state.armBots.find(a => a.modelUuid === modelUuid);

View File

@ -10,6 +10,7 @@ interface ConveyorStore {
modelUuid: string, modelUuid: string,
updates: Partial<Omit<ConveyorStatus, 'modelUuid' | 'productId'>> updates: Partial<Omit<ConveyorStatus, 'modelUuid' | 'productId'>>
) => void; ) => void;
clearConveyors: () => void;
setConveyorActive: (modelUuid: string, isActive: boolean) => void; setConveyorActive: (modelUuid: string, isActive: boolean) => void;
setConveyorState: (modelUuid: string, newState: ConveyorStatus['state']) => void; setConveyorState: (modelUuid: string, newState: ConveyorStatus['state']) => void;
@ -30,14 +31,17 @@ export const useConveyorStore = create<ConveyorStore>()(
addConveyor: (productId, event) => { addConveyor: (productId, event) => {
set((state) => { set((state) => {
state.conveyors.push({ const exists = state.conveyors.some(c => c.modelUuid === event.modelUuid);
...event, if (!exists) {
productId, state.conveyors.push({
isActive: false, ...event,
idleTime: 0, productId,
activeTime: 0, isActive: false,
state: 'idle', idleTime: 0,
}); activeTime: 0,
state: 'idle',
});
}
}); });
}, },
@ -56,6 +60,12 @@ export const useConveyorStore = create<ConveyorStore>()(
}); });
}, },
clearConveyors: () => {
set((state) => {
state.conveyors = [];
});
},
setConveyorActive: (modelUuid, isActive) => { setConveyorActive: (modelUuid, isActive) => {
set((state) => { set((state) => {
const conveyor = state.conveyors.find(c => c.modelUuid === modelUuid); const conveyor = state.conveyors.find(c => c.modelUuid === modelUuid);

View File

@ -49,7 +49,9 @@ export const useEventsStore = create<EventsStore>()(
// Event-level actions // Event-level actions
addEvent: (event) => { addEvent: (event) => {
set((state) => { set((state) => {
state.events.push(event); if (!state.events.some(e => 'modelUuid' in e && e.modelUuid === event.modelUuid)) {
state.events.push(event);
}
}); });
}, },
@ -76,9 +78,14 @@ export const useEventsStore = create<EventsStore>()(
set((state) => { set((state) => {
const event = state.events.find(e => 'modelUuid' in e && e.modelUuid === modelUuid); const event = state.events.find(e => 'modelUuid' in e && e.modelUuid === modelUuid);
if (event && 'points' in event) { if (event && 'points' in event) {
(event as ConveyorEventSchema).points.push(point as ConveyorPointSchema); const existingPoint = (event as ConveyorEventSchema).points.find(p => p.uuid === point.uuid);
if (!existingPoint) {
(event as ConveyorEventSchema).points.push(point as ConveyorPointSchema);
}
} else if (event && 'point' in event) { } else if (event && 'point' in event) {
(event as VehicleEventSchema | RoboticArmEventSchema | MachineEventSchema | StorageEventSchema).point = point as any; if (!(event as any).point || (event as any).point.uuid !== point.uuid) {
(event as VehicleEventSchema | RoboticArmEventSchema | MachineEventSchema | StorageEventSchema).point = point as any;
}
} }
}); });
}, },
@ -113,14 +120,15 @@ export const useEventsStore = create<EventsStore>()(
const event = state.events.find(e => 'modelUuid' in e && e.modelUuid === modelUuid); const event = state.events.find(e => 'modelUuid' in e && e.modelUuid === modelUuid);
if (event && 'points' in event) { if (event && 'points' in event) {
const point = (event as ConveyorEventSchema).points.find(p => p.uuid === pointUuid); const point = (event as ConveyorEventSchema).points.find(p => p.uuid === pointUuid);
if (point) { if (point && (!point.action || point.action.actionUuid !== action.actionUuid)) {
point.action = action as any; point.action = action as any;
} }
} else if (event && 'point' in event && (event as any).point.uuid === pointUuid) { } else if (event && 'point' in event && (event as any).point.uuid === pointUuid) {
if ('action' in (event as any).point) { const point = (event as any).point;
(event as any).point.action = action; if ('action' in point && (!point.action || point.action.actionUuid !== action.actionUuid)) {
} else if ('actions' in (event as any).point) { point.action = action;
(event as any).point.actions.push(action); } else if ('actions' in point && !point.actions.some((a: any) => a.actionUuid === action.actionUuid)) {
point.actions.push(action);
} }
} }
}); });
@ -183,18 +191,22 @@ export const useEventsStore = create<EventsStore>()(
if ('points' in event) { if ('points' in event) {
for (const point of (event as ConveyorEventSchema).points) { for (const point of (event as ConveyorEventSchema).points) {
if (point.action && point.action.actionUuid === actionUuid) { if (point.action && point.action.actionUuid === actionUuid) {
point.action.triggers.push(trigger); if (!point.action.triggers.some(t => t.triggerUuid === trigger.triggerUuid)) {
point.action.triggers.push(trigger);
}
return; return;
} }
} }
} else if ('point' in event) { } else if ('point' in event) {
const point = (event as any).point; const point: MachinePointSchema | VehiclePointSchema = (event as any).point;
if ('action' in point && point.action.actionUuid === actionUuid) { if ('action' in point && point.action.actionUuid === actionUuid) {
point.action.triggers.push(trigger); if (!point.action.triggers.some(t => t.triggerUuid === trigger.triggerUuid)) {
point.action.triggers.push(trigger);
}
return; return;
} else if ('actions' in point) { } else if ('actions' in point) {
const action = point.actions.find((a: any) => a.actionUuid === actionUuid); const action = (point as RoboticArmPointSchema).actions.find((a) => a.actionUuid === actionUuid);
if (action) { if (action && !action.triggers.some(t => t.triggerUuid === trigger.triggerUuid)) {
action.triggers.push(trigger); action.triggers.push(trigger);
return; return;
} }

View File

@ -4,23 +4,23 @@ import { immer } from 'zustand/middleware/immer';
interface MachineStore { interface MachineStore {
machines: MachineStatus[]; machines: MachineStatus[];
// Actions
addMachine: (productId: string, machine: MachineEventSchema) => void; addMachine: (productId: string, machine: MachineEventSchema) => void;
removeMachine: (modelUuid: string) => void; removeMachine: (modelUuid: string) => void;
updateMachine: ( updateMachine: (
modelUuid: string, modelUuid: string,
updates: Partial<Omit<MachineStatus, 'modelUuid' | 'productId'>> updates: Partial<Omit<MachineStatus, 'modelUuid' | 'productId'>>
) => void; ) => void;
clearMachines: () => void;
addCurrentAction: (modelUuid: string, actionUuid: string) => void;
removeCurrentAction: (modelUuid: string) => void;
// Status updates
setMachineActive: (modelUuid: string, isActive: boolean) => void; setMachineActive: (modelUuid: string, isActive: boolean) => void;
setMachineState: (modelUuid: string, newState: MachineStatus['state']) => void; setMachineState: (modelUuid: string, newState: MachineStatus['state']) => void;
// Time tracking
incrementActiveTime: (modelUuid: string, incrementBy: number) => void; incrementActiveTime: (modelUuid: string, incrementBy: number) => void;
incrementIdleTime: (modelUuid: string, incrementBy: number) => void; incrementIdleTime: (modelUuid: string, incrementBy: number) => void;
// Helpers
getMachineById: (modelUuid: string) => MachineStatus | undefined; getMachineById: (modelUuid: string) => MachineStatus | undefined;
getMachinesByProduct: (productId: string) => MachineStatus[]; getMachinesByProduct: (productId: string) => MachineStatus[];
getMachinesBystate: (state: string) => MachineStatus[]; getMachinesBystate: (state: string) => MachineStatus[];
@ -32,17 +32,19 @@ export const useMachineStore = create<MachineStore>()(
immer((set, get) => ({ immer((set, get) => ({
machines: [], machines: [],
// Actions
addMachine: (productId, machine) => { addMachine: (productId, machine) => {
set((state) => { set((state) => {
state.machines.push({ const exists = state.machines.some(m => m.modelUuid === machine.modelUuid);
...machine, if (!exists) {
productId, state.machines.push({
isActive: false, ...machine,
idleTime: 0, productId,
activeTime: 0, isActive: false,
state: 'idle', idleTime: 0,
}); activeTime: 0,
state: 'idle',
});
}
}); });
}, },
@ -61,7 +63,36 @@ export const useMachineStore = create<MachineStore>()(
}); });
}, },
// Status updates clearMachines: () => {
set((state) => {
state.machines = [];
});
},
addCurrentAction: (modelUuid) => {
set((state) => {
const armBot = state.machines.find(a => a.modelUuid === modelUuid);
if (armBot) {
const action = armBot.point.action;
if (action) {
armBot.currentAction = {
actionUuid: action.actionUuid,
actionName: action.actionName,
};
}
}
});
},
removeCurrentAction: (modelUuid) => {
set((state) => {
const armBot = state.machines.find(a => a.modelUuid === modelUuid);
if (armBot) {
armBot.currentAction = undefined;
}
});
},
setMachineActive: (modelUuid, isActive) => { setMachineActive: (modelUuid, isActive) => {
set((state) => { set((state) => {
const machine = state.machines.find(m => m.modelUuid === modelUuid); const machine = state.machines.find(m => m.modelUuid === modelUuid);
@ -80,7 +111,6 @@ export const useMachineStore = create<MachineStore>()(
}); });
}, },
// Time tracking
incrementActiveTime: (modelUuid, incrementBy) => { incrementActiveTime: (modelUuid, incrementBy) => {
set((state) => { set((state) => {
const machine = state.machines.find(m => m.modelUuid === modelUuid); const machine = state.machines.find(m => m.modelUuid === modelUuid);
@ -99,7 +129,6 @@ export const useMachineStore = create<MachineStore>()(
}); });
}, },
// Helpers
getMachineById: (modelUuid) => { getMachineById: (modelUuid) => {
return get().machines.find(m => m.modelUuid === modelUuid); return get().machines.find(m => m.modelUuid === modelUuid);
}, },

View File

@ -33,27 +33,30 @@ type ProductsStore = {
pointUuid: string, pointUuid: string,
action: ConveyorPointSchema['action'] | VehiclePointSchema['action'] | RoboticArmPointSchema['actions'][0] | MachinePointSchema['action'] | StoragePointSchema['action'] action: ConveyorPointSchema['action'] | VehiclePointSchema['action'] | RoboticArmPointSchema['actions'][0] | MachinePointSchema['action'] | StoragePointSchema['action']
) => EventsSchema | undefined; ) => EventsSchema | undefined;
removeAction: (actionUuid: string) => EventsSchema | undefined; removeAction: (productId: string, actionUuid: string) => EventsSchema | undefined;
updateAction: ( updateAction: (
productId: string,
actionUuid: string, actionUuid: string,
updates: Partial<ConveyorPointSchema['action'] | VehiclePointSchema['action'] | RoboticArmPointSchema['actions'][0] | MachinePointSchema['action'] | StoragePointSchema['action']> updates: Partial<ConveyorPointSchema['action'] | VehiclePointSchema['action'] | RoboticArmPointSchema['actions'][0] | MachinePointSchema['action'] | StoragePointSchema['action']>
) => EventsSchema | undefined; ) => EventsSchema | undefined;
// Trigger-level actions // Trigger-level actions
addTrigger: ( addTrigger: (
productId: string,
actionUuid: string, actionUuid: string,
trigger: TriggerSchema trigger: TriggerSchema
) => EventsSchema | undefined; ) => EventsSchema | undefined;
removeTrigger: (triggerUuid: string) => EventsSchema | undefined; removeTrigger: (productId: string, triggerUuid: string) => EventsSchema | undefined;
updateTrigger: ( updateTrigger: (
productId: string,
triggerUuid: string, triggerUuid: string,
updates: Partial<TriggerSchema> updates: Partial<TriggerSchema>
) => void; ) => void;
// Renaming functions // Renaming functions
renameProduct: (productId: string, newName: string) => void; renameProduct: (productId: string, newName: string) => void;
renameAction: (actionUuid: string, newName: string) => EventsSchema | undefined; renameAction: (productId: string, actionUuid: string, newName: string) => EventsSchema | undefined;
renameTrigger: (triggerUuid: string, newName: string) => void; renameTrigger: (productId: string, triggerUuid: string, newName: string) => void;
// Helper functions // Helper functions
getProductById: (productId: string) => { productName: string; productId: string; eventDatas: EventsSchema[] } | undefined; getProductById: (productId: string) => { productName: string; productId: string; eventDatas: EventsSchema[] } | undefined;
@ -71,12 +74,15 @@ export const useProductStore = create<ProductsStore>()(
// Product-level actions // Product-level actions
addProduct: (productName, productId) => { addProduct: (productName, productId) => {
set((state) => { set((state) => {
const newProduct = { const existingProduct = state.products.find(p => p.productId === productId);
productName, if (!existingProduct) {
productId: productId, const newProduct = {
eventDatas: [] productName,
}; productId: productId,
state.products.push(newProduct); eventDatas: []
};
state.products.push(newProduct);
}
}); });
}, },
@ -106,7 +112,10 @@ export const useProductStore = create<ProductsStore>()(
set((state) => { set((state) => {
const product = state.products.find(p => p.productId === productId); const product = state.products.find(p => p.productId === productId);
if (product) { if (product) {
product.eventDatas.push(event); const existingEvent = product.eventDatas.find(e => 'modelUuid' in e && e.modelUuid === event.modelUuid);
if (!existingEvent) {
product.eventDatas.push(event);
}
} }
}); });
}, },
@ -120,7 +129,7 @@ export const useProductStore = create<ProductsStore>()(
}); });
}, },
deleteEvent: (modelUuid: string) => { deleteEvent: (modelUuid) => {
set((state) => { set((state) => {
for (const product of state.products) { for (const product of state.products) {
product.eventDatas = product.eventDatas.filter(e => 'modelUuid' in e && e.modelUuid !== modelUuid); product.eventDatas = product.eventDatas.filter(e => 'modelUuid' in e && e.modelUuid !== modelUuid);
@ -150,9 +159,15 @@ export const useProductStore = create<ProductsStore>()(
if (product) { if (product) {
const event = product.eventDatas.find(e => 'modelUuid' in e && e.modelUuid === modelUuid); const event = product.eventDatas.find(e => 'modelUuid' in e && e.modelUuid === modelUuid);
if (event && 'points' in event) { if (event && 'points' in event) {
(event as ConveyorEventSchema).points.push(point as ConveyorPointSchema); const existingPoint = (event as ConveyorEventSchema).points.find(p => p.uuid === point.uuid);
if (!existingPoint) {
(event as ConveyorEventSchema).points.push(point as ConveyorPointSchema);
}
} else if (event && 'point' in event) { } else if (event && 'point' in event) {
(event as VehicleEventSchema | RoboticArmEventSchema | MachineEventSchema | StorageEventSchema).point = point as any; const existingPoint = (event as any).point?.uuid === point.uuid;
if (!existingPoint) {
(event as VehicleEventSchema | RoboticArmEventSchema | MachineEventSchema | StorageEventSchema).point = point as any;
}
} }
} }
}); });
@ -198,17 +213,22 @@ export const useProductStore = create<ProductsStore>()(
const event = product.eventDatas.find(e => 'modelUuid' in e && e.modelUuid === modelUuid); const event = product.eventDatas.find(e => 'modelUuid' in e && e.modelUuid === modelUuid);
if (event && 'points' in event) { if (event && 'points' in event) {
const point = (event as ConveyorEventSchema).points.find(p => p.uuid === pointUuid); const point = (event as ConveyorEventSchema).points.find(p => p.uuid === pointUuid);
if (point) { if (point && (!point.action || point.action.actionUuid !== action.actionUuid)) {
point.action = action as any; point.action = action as any;
updatedEvent = JSON.parse(JSON.stringify(event)); updatedEvent = JSON.parse(JSON.stringify(event));
} }
} else if (event && 'point' in event && (event as any).point.uuid === pointUuid) { } else if (event && 'point' in event && (event as any).point.uuid === pointUuid) {
if ('action' in (event as any).point) { if ('action' in (event as any).point) {
(event as any).point.action = action; if (!(event as any).point.action || (event as any).point.action.actionUuid !== action.actionUuid) {
updatedEvent = JSON.parse(JSON.stringify(event)); (event as any).point.action = action;
updatedEvent = JSON.parse(JSON.stringify(event));
}
} else if ('actions' in (event as any).point) { } else if ('actions' in (event as any).point) {
(event as any).point.actions.push(action); const existingAction = (event as any).point.actions.find((a: any) => a.actionUuid === action.actionUuid);
updatedEvent = JSON.parse(JSON.stringify(event)); if (!existingAction) {
(event as any).point.actions.push(action);
updatedEvent = JSON.parse(JSON.stringify(event));
}
} }
} }
} }
@ -216,10 +236,11 @@ export const useProductStore = create<ProductsStore>()(
return updatedEvent; return updatedEvent;
}, },
removeAction: (actionUuid: string) => { removeAction: (productId, actionUuid) => {
let updatedEvent: EventsSchema | undefined; let updatedEvent: EventsSchema | undefined;
set((state) => { set((state) => {
for (const product of state.products) { const product = state.products.find(p => p.productId === productId);
if (product) {
for (const event of product.eventDatas) { for (const event of product.eventDatas) {
if ('points' in event) { if ('points' in event) {
// Handle ConveyorEventSchema // Handle ConveyorEventSchema
@ -248,10 +269,11 @@ export const useProductStore = create<ProductsStore>()(
return updatedEvent; return updatedEvent;
}, },
updateAction: (actionUuid, updates) => { updateAction: (productId, actionUuid, updates) => {
let updatedEvent: EventsSchema | undefined; let updatedEvent: EventsSchema | undefined;
set((state) => { set((state) => {
for (const product of state.products) { const product = state.products.find(p => p.productId === productId);
if (product) {
for (const event of product.eventDatas) { for (const event of product.eventDatas) {
if ('points' in event) { if ('points' in event) {
for (const point of (event as ConveyorEventSchema).points) { for (const point of (event as ConveyorEventSchema).points) {
@ -283,30 +305,40 @@ export const useProductStore = create<ProductsStore>()(
}, },
// Trigger-level actions // Trigger-level actions
addTrigger: (actionUuid, trigger) => { addTrigger: (productId, actionUuid, trigger) => {
let updatedEvent: EventsSchema | undefined; let updatedEvent: EventsSchema | undefined;
set((state) => { set((state) => {
for (const product of state.products) { const product = state.products.find(p => p.productId === productId);
if (product) {
for (const event of product.eventDatas) { for (const event of product.eventDatas) {
if ('points' in event) { if ('points' in event) {
for (const point of (event as ConveyorEventSchema).points) { for (const point of (event as ConveyorEventSchema).points) {
if (point.action && point.action.actionUuid === actionUuid) { if (point.action && point.action.actionUuid === actionUuid) {
point.action.triggers.push(trigger); const existingTrigger = point.action.triggers.find(t => t.triggerUuid === trigger.triggerUuid);
updatedEvent = JSON.parse(JSON.stringify(event)); if (!existingTrigger) {
point.action.triggers.push(trigger);
updatedEvent = JSON.parse(JSON.stringify(event));
}
return; return;
} }
} }
} else if ('point' in event) { } else if ('point' in event) {
const point = (event as any).point; const point = (event as any).point;
if ('action' in point && point.action.actionUuid === actionUuid) { if ('action' in point && point.action.actionUuid === actionUuid) {
point.action.triggers.push(trigger); const existingTrigger = point.action.triggers.find((t: any) => t.triggerUuid === trigger.triggerUuid);
updatedEvent = JSON.parse(JSON.stringify(event)); if (!existingTrigger) {
point.action.triggers.push(trigger);
updatedEvent = JSON.parse(JSON.stringify(event));
}
return; return;
} else if ('actions' in point) { } else if ('actions' in point) {
const action = point.actions.find((a: any) => a.actionUuid === actionUuid); const action = point.actions.find((a: any) => a.actionUuid === actionUuid);
if (action) { if (action) {
action.triggers.push(trigger); const existingTrigger = action.triggers.find((t: any) => t.triggerUuid === trigger.triggerUuid);
updatedEvent = JSON.parse(JSON.stringify(event)); if (!existingTrigger) {
action.triggers.push(trigger);
updatedEvent = JSON.parse(JSON.stringify(event));
}
return; return;
} }
} }
@ -317,28 +349,38 @@ export const useProductStore = create<ProductsStore>()(
return updatedEvent; return updatedEvent;
}, },
removeTrigger: (triggerUuid) => { removeTrigger: (productId, triggerUuid) => {
let updatedEvent: EventsSchema | undefined; let updatedEvent: EventsSchema | undefined;
set((state) => { set((state) => {
for (const product of state.products) { const product = state.products.find(p => p.productId === productId);
if (product) {
for (const event of product.eventDatas) { for (const event of product.eventDatas) {
if ('points' in event) { if ('points' in event) {
for (const point of (event as ConveyorEventSchema).points) { for (const point of (event as ConveyorEventSchema).points) {
if (point.action && 'triggers' in point.action) { if (point.action && 'triggers' in point.action) {
point.action.triggers = point.action.triggers.filter(t => t.triggerUuid !== triggerUuid); const Trigger = point.action.triggers.find(t => t.triggerUuid === triggerUuid);
updatedEvent = JSON.parse(JSON.stringify(event)); if (Trigger) {
point.action.triggers = point.action.triggers.filter(t => t.triggerUuid !== triggerUuid);
updatedEvent = JSON.parse(JSON.stringify(event));
}
} }
} }
} else if ('point' in event) { } else if ('point' in event) {
const point = (event as any).point; const point = (event as any).point;
if ('action' in point && 'triggers' in point.action) { if ('action' in point && 'triggers' in point.action) {
point.action.triggers = point.action.triggers.filter((t: any) => t.triggerUuid !== triggerUuid); const Trigger = point.action.triggers.find((t: any) => t.triggerUuid === triggerUuid);
updatedEvent = JSON.parse(JSON.stringify(event)); if (Trigger) {
point.action.triggers = point.action.triggers.filter((t: any) => t.triggerUuid !== triggerUuid);
updatedEvent = JSON.parse(JSON.stringify(event));
}
} else if ('actions' in point) { } else if ('actions' in point) {
for (const action of point.actions) { for (const action of point.actions) {
if ('triggers' in action) { if ('triggers' in action) {
action.triggers = action.triggers.filter((t: any) => t.triggerUuid !== triggerUuid); const Trigger = action.triggers.find((t: any) => t.triggerUuid === triggerUuid);
updatedEvent = JSON.parse(JSON.stringify(event)); if (Trigger) {
action.triggers = action.triggers.filter((t: any) => t.triggerUuid !== triggerUuid);
updatedEvent = JSON.parse(JSON.stringify(event));
}
} }
} }
} }
@ -349,9 +391,10 @@ export const useProductStore = create<ProductsStore>()(
return updatedEvent; return updatedEvent;
}, },
updateTrigger: (triggerUuid, updates) => { updateTrigger: (productId, triggerUuid, updates) => {
set((state) => { set((state) => {
for (const product of state.products) { const product = state.products.find(p => p.productId === productId);
if (product) {
for (const event of product.eventDatas) { for (const event of product.eventDatas) {
if ('points' in event) { if ('points' in event) {
for (const point of (event as ConveyorEventSchema).points) { for (const point of (event as ConveyorEventSchema).points) {
@ -398,10 +441,11 @@ export const useProductStore = create<ProductsStore>()(
}); });
}, },
renameAction: (actionUuid, newName) => { renameAction: (productId, actionUuid, newName) => {
let updatedEvent: EventsSchema | undefined; let updatedEvent: EventsSchema | undefined;
set((state) => { set((state) => {
for (const product of state.products) { const product = state.products.find(p => p.productId === productId);
if (product) {
for (const event of product.eventDatas) { for (const event of product.eventDatas) {
if ('points' in event) { if ('points' in event) {
for (const point of (event as ConveyorEventSchema).points) { for (const point of (event as ConveyorEventSchema).points) {
@ -432,9 +476,10 @@ export const useProductStore = create<ProductsStore>()(
return updatedEvent; return updatedEvent;
}, },
renameTrigger: (triggerUuid, newName) => { renameTrigger: (productId, triggerUuid, newName) => {
set((state) => { set((state) => {
for (const product of state.products) { const product = state.products.find(p => p.productId === productId);
if (product) {
for (const event of product.eventDatas) { for (const event of product.eventDatas) {
if ('points' in event) { if ('points' in event) {
for (const point of (event as ConveyorEventSchema).points) { for (const point of (event as ConveyorEventSchema).points) {

View File

@ -4,26 +4,22 @@ import { immer } from 'zustand/middleware/immer';
interface StorageUnitStore { interface StorageUnitStore {
storageUnits: StorageUnitStatus[]; storageUnits: StorageUnitStatus[];
// Actions
addStorageUnit: (productId: string, storageUnit: StorageEventSchema) => void; addStorageUnit: (productId: string, storageUnit: StorageEventSchema) => void;
removeStorageUnit: (modelUuid: string) => void; removeStorageUnit: (modelUuid: string) => void;
updateStorageUnit: ( updateStorageUnit: (
modelUuid: string, modelUuid: string,
updates: Partial<Omit<StorageUnitStatus, 'modelUuid' | 'productId'>> updates: Partial<Omit<StorageUnitStatus, 'modelUuid' | 'productId'>>
) => void; ) => void;
clearStorageUnits: () => void;
// Status updates
setStorageUnitActive: (modelUuid: string, isActive: boolean) => void; setStorageUnitActive: (modelUuid: string, isActive: boolean) => void;
setStorageUnitState: (modelUuid: string, newState: StorageUnitStatus['state']) => void; setStorageUnitState: (modelUuid: string, newState: StorageUnitStatus['state']) => void;
// Load updates
updateStorageUnitLoad: (modelUuid: string, incrementBy: number) => void; updateStorageUnitLoad: (modelUuid: string, incrementBy: number) => void;
// Time tracking
incrementActiveTime: (modelUuid: string, incrementBy: number) => void; incrementActiveTime: (modelUuid: string, incrementBy: number) => void;
incrementIdleTime: (modelUuid: string, incrementBy: number) => void; incrementIdleTime: (modelUuid: string, incrementBy: number) => void;
// Helpers
getStorageUnitById: (modelUuid: string) => StorageUnitStatus | undefined; getStorageUnitById: (modelUuid: string) => StorageUnitStatus | undefined;
getStorageUnitsByProduct: (productId: string) => StorageUnitStatus[]; getStorageUnitsByProduct: (productId: string) => StorageUnitStatus[];
getStorageUnitsBystate: (state: string) => StorageUnitStatus[]; getStorageUnitsBystate: (state: string) => StorageUnitStatus[];
@ -37,18 +33,20 @@ export const useStorageUnitStore = create<StorageUnitStore>()(
immer((set, get) => ({ immer((set, get) => ({
storageUnits: [], storageUnits: [],
// Actions
addStorageUnit: (productId, storageUnit) => { addStorageUnit: (productId, storageUnit) => {
set((state) => { set((state) => {
state.storageUnits.push({ const exists = state.storageUnits.some(s => s.modelUuid === storageUnit.modelUuid);
...storageUnit, if (!exists) {
productId, state.storageUnits.push({
isActive: false, ...storageUnit,
idleTime: 0, productId,
activeTime: 0, isActive: false,
currentLoad: 0, idleTime: 0,
state: 'idle', activeTime: 0,
}); currentLoad: 0,
state: 'idle',
});
}
}); });
}, },
@ -67,7 +65,12 @@ export const useStorageUnitStore = create<StorageUnitStore>()(
}); });
}, },
// Status updates clearStorageUnits: () => {
set(() => ({
storageUnits: [],
}));
},
setStorageUnitActive: (modelUuid, isActive) => { setStorageUnitActive: (modelUuid, isActive) => {
set((state) => { set((state) => {
const unit = state.storageUnits.find(s => s.modelUuid === modelUuid); const unit = state.storageUnits.find(s => s.modelUuid === modelUuid);
@ -86,7 +89,6 @@ export const useStorageUnitStore = create<StorageUnitStore>()(
}); });
}, },
// Load updates
updateStorageUnitLoad: (modelUuid, incrementBy) => { updateStorageUnitLoad: (modelUuid, incrementBy) => {
set((state) => { set((state) => {
const unit = state.storageUnits.find(s => s.modelUuid === modelUuid); const unit = state.storageUnits.find(s => s.modelUuid === modelUuid);
@ -96,7 +98,6 @@ export const useStorageUnitStore = create<StorageUnitStore>()(
}); });
}, },
// Time tracking
incrementActiveTime: (modelUuid, incrementBy) => { incrementActiveTime: (modelUuid, incrementBy) => {
set((state) => { set((state) => {
const unit = state.storageUnits.find(s => s.modelUuid === modelUuid); const unit = state.storageUnits.find(s => s.modelUuid === modelUuid);
@ -115,7 +116,6 @@ export const useStorageUnitStore = create<StorageUnitStore>()(
}); });
}, },
// Helpers
getStorageUnitById: (modelUuid) => { getStorageUnitById: (modelUuid) => {
return get().storageUnits.find(s => s.modelUuid === modelUuid); return get().storageUnits.find(s => s.modelUuid === modelUuid);
}, },

View File

@ -20,6 +20,7 @@ interface VehiclesStore {
modelUuid: string, modelUuid: string,
updates: Partial<Omit<VehicleStatus, 'modelUuid' | 'productId'>> updates: Partial<Omit<VehicleStatus, 'modelUuid' | 'productId'>>
) => void; ) => void;
clearvehicles: () => void;
setVehicleActive: (modelUuid: string, isActive: boolean) => void; setVehicleActive: (modelUuid: string, isActive: boolean) => void;
updateSteeringAngle: (modelUuid: string, steeringAngle: number) => void; updateSteeringAngle: (modelUuid: string, steeringAngle: number) => void;
@ -41,15 +42,18 @@ export const useVehicleStore = create<VehiclesStore>()(
addVehicle: (productId, event) => { addVehicle: (productId, event) => {
set((state) => { set((state) => {
state.vehicles.push({ const exists = state.vehicles.some(v => v.modelUuid === event.modelUuid);
...event, if (!exists) {
productId, state.vehicles.push({
isActive: false, ...event,
idleTime: 0, productId,
activeTime: 0, isActive: false,
currentLoad: 0, idleTime: 0,
distanceTraveled: 0, activeTime: 0,
}); currentLoad: 0,
distanceTraveled: 0,
});
}
}); });
}, },
@ -68,6 +72,12 @@ export const useVehicleStore = create<VehiclesStore>()(
}); });
}, },
clearvehicles: () => {
set((state) => {
state.vehicles = [];
});
},
setVehicleActive: (modelUuid, isActive) => { setVehicleActive: (modelUuid, isActive) => {
set((state) => { set((state) => {
const vehicle = state.vehicles.find(v => v.modelUuid === modelUuid); const vehicle = state.vehicles.find(v => v.modelUuid === modelUuid);

View File

@ -88,6 +88,7 @@ interface StoragePointSchema {
actionType: "store"; actionType: "store";
materials: { materialName: string; materialId: string; }[]; materials: { materialName: string; materialId: string; }[];
storageCapacity: number; storageCapacity: number;
triggers: TriggerSchema[];
}; };
} }
@ -143,6 +144,10 @@ interface MachineStatus extends MachineEventSchema {
isActive: boolean; isActive: boolean;
idleTime: number; idleTime: number;
activeTime: number; activeTime: number;
currentAction?: {
actionUuid: string;
actionName: string;
};
} }
interface ArmBotStatus extends RoboticArmEventSchema { interface ArmBotStatus extends RoboticArmEventSchema {