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:
@@ -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);
|
||||
}
|
||||
}))
|
||||
);
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user