Refactor simulation store structures to use arrays instead of records for conveyors, machines, storage units, vehicles, and products; remove useSimulationStore; enhance state management and helper functions for better performance and readability.

This commit is contained in:
2025-04-22 14:44:09 +05:30
parent 6363d5b9af
commit 7907bbab0a
9 changed files with 115 additions and 173 deletions

View File

@@ -1,7 +1,7 @@
import { create } from 'zustand';
import { immer } from 'zustand/middleware/immer';
interface VehicleStatus extends VehicleSchemaEvent {
interface VehicleStatus extends VehicleEventSchema {
productId: string;
isActive: boolean;
idleTime: number;
@@ -11,28 +11,21 @@ interface VehicleStatus extends VehicleSchemaEvent {
}
interface VehiclesStore {
vehicles: Record<string, VehicleStatus>;
vehicles: VehicleStatus[];
// Vehicle actions
addVehicle: (productId: string, event: VehicleSchemaEvent) => void;
addVehicle: (productId: string, event: VehicleEventSchema) => void;
removeVehicle: (modelUuid: string) => void;
updateVehicle: (
modelUuid: string,
updates: Partial<Omit<VehicleStatus, 'modelUuid' | 'productId'>>
) => void;
// Status updates
setVehicleActive: (modelUuid: string, isActive: boolean) => void;
updateVehicleLoad: (modelUuid: string, load: number) => void;
// State management
setVehicleState: (modelUuid: string, newState: VehicleStatus['state']) => void;
// Time tracking
incrementActiveTime: (modelUuid: string, incrementBy: number) => void;
incrementIdleTime: (modelUuid: string, incrementBy: number) => void;
// Helper functions
getVehicleById: (modelUuid: string) => VehicleStatus | undefined;
getVehiclesByProduct: (productId: string) => VehicleStatus[];
getActiveVehicles: () => VehicleStatus[];
@@ -41,75 +34,67 @@ interface VehiclesStore {
export const useVehicleStore = create<VehiclesStore>()(
immer((set, get) => ({
vehicles: {},
vehicles: [],
addVehicle: (productId, event) => {
set((state) => {
state.vehicles[event.modelUuid] = {
state.vehicles.push({
...event,
isActive: false,
productId,
isActive: false,
idleTime: 0,
activeTime: 0,
currentLoad: 0,
distanceTraveled: 0,
};
});
});
},
removeVehicle: (modelUuid) => {
set((state) => {
delete state.vehicles[modelUuid];
state.vehicles = state.vehicles.filter(v => v.modelUuid !== modelUuid);
});
},
updateVehicle: (modelUuid, updates) => {
set((state) => {
const vehicle = state.vehicles[modelUuid];
const vehicle = state.vehicles.find(v => v.modelUuid === modelUuid);
if (vehicle) {
Object.assign(vehicle, updates);
}
});
},
// Status updates
setVehicleActive: (modelUuid, isActive) => {
set((state) => {
const vehicle = state.vehicles[modelUuid];
const vehicle = state.vehicles.find(v => v.modelUuid === modelUuid);
if (vehicle) {
vehicle.isActive = isActive;
if (isActive) {
vehicle.state = 'running';
} else {
vehicle.state = vehicle.currentLoad > 0 ? 'idle' : 'stopped';
}
}
});
},
updateVehicleLoad: (modelUuid, load) => {
set((state) => {
const vehicle = state.vehicles[modelUuid];
const vehicle = state.vehicles.find(v => v.modelUuid === modelUuid);
if (vehicle) {
vehicle.currentLoad = load;
}
});
},
// State management
setVehicleState: (modelUuid, newState) => {
set((state) => {
const vehicle = state.vehicles[modelUuid];
const vehicle = state.vehicles.find(v => v.modelUuid === modelUuid);
if (vehicle) {
vehicle.state = newState;
}
});
},
// Time tracking
incrementActiveTime: (modelUuid, incrementBy) => {
set((state) => {
const vehicle = state.vehicles[modelUuid];
const vehicle = state.vehicles.find(v => v.modelUuid === modelUuid);
if (vehicle) {
vehicle.activeTime += incrementBy;
}
@@ -118,32 +103,27 @@ export const useVehicleStore = create<VehiclesStore>()(
incrementIdleTime: (modelUuid, incrementBy) => {
set((state) => {
const vehicle = state.vehicles[modelUuid];
const vehicle = state.vehicles.find(v => v.modelUuid === modelUuid);
if (vehicle) {
vehicle.idleTime += incrementBy;
}
});
},
// Getters
getVehicleById: (modelUuid) => {
return get().vehicles[modelUuid];
return get().vehicles.find(v => v.modelUuid === modelUuid);
},
getVehiclesByProduct: (productId) => {
return Object.values(get().vehicles).filter(
v => v.productId === productId
);
return get().vehicles.filter(v => v.productId === productId);
},
getActiveVehicles: () => {
return Object.values(get().vehicles).filter(v => v.isActive);
return get().vehicles.filter(v => v.isActive);
},
getIdleVehicles: () => {
return Object.values(get().vehicles).filter(
v => !v.isActive && v.currentLoad > 0
);
return get().vehicles.filter(v => !v.isActive && v.currentLoad > 0);
}
}))
);
);