use super::equipment::{Equipment, EquipmentCapabilityTestResult, EquipmentCapabilityTestSpecification};
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum WorkCenterType {
ProcessCell,
ProductionLine,
ProductionUnit,
StorageZone,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum WorkUnitType {
Unit,
WorkCell,
StorageUnit,
ProductionEquipment,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(
feature = "serde",
serde(bound(
serialize = "ID: serde::Serialize",
deserialize = "ID: serde::Deserialize<'de>"
))
)]
pub struct Enterprise<ID> {
pub id: ID,
pub name: String,
pub properties: Vec<EnterpriseProperty<ID>>,
pub sites: Vec<Site<ID>>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(
feature = "serde",
serde(bound(
serialize = "ID: serde::Serialize",
deserialize = "ID: serde::Deserialize<'de>"
))
)]
pub struct EnterpriseProperty<ID> {
pub id: ID,
pub name: String,
pub nested_properties: Vec<EnterpriseProperty<ID>>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(
feature = "serde",
serde(bound(
serialize = "ID: serde::Serialize",
deserialize = "ID: serde::Deserialize<'de>"
))
)]
pub struct Site<ID> {
pub id: ID,
pub name: String,
pub properties: Vec<SiteProperty<ID>>,
pub areas: Vec<Area<ID>>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(
feature = "serde",
serde(bound(
serialize = "ID: serde::Serialize",
deserialize = "ID: serde::Deserialize<'de>"
))
)]
pub struct SiteProperty<ID> {
pub id: ID,
pub name: String,
pub nested_properties: Vec<SiteProperty<ID>>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(
feature = "serde",
serde(bound(
serialize = "ID: serde::Serialize",
deserialize = "ID: serde::Deserialize<'de>"
))
)]
pub struct Area<ID> {
pub id: ID,
pub name: String,
pub properties: Vec<AreaProperty<ID>>,
pub work_centers: Vec<WorkCenter<ID>>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(
feature = "serde",
serde(bound(
serialize = "ID: serde::Serialize",
deserialize = "ID: serde::Deserialize<'de>"
))
)]
pub struct AreaProperty<ID> {
pub id: ID,
pub name: String,
pub nested_properties: Vec<AreaProperty<ID>>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(
feature = "serde",
serde(bound(
serialize = "ID: serde::Serialize",
deserialize = "ID: serde::Deserialize<'de>"
))
)]
pub struct WorkCenter<ID> {
pub id: ID,
pub name: String,
pub work_center_type: WorkCenterType,
pub equipment_classes: Vec<ID>, pub properties: Vec<WorkCenterProperty<ID>>,
pub work_units: Vec<WorkUnit<ID>>,
pub equipment_capability_test_specifications: Vec<EquipmentCapabilityTestSpecification<ID>>,
pub equipment_capability_test_results: Vec<EquipmentCapabilityTestResult<ID>>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(
feature = "serde",
serde(bound(
serialize = "ID: serde::Serialize",
deserialize = "ID: serde::Deserialize<'de>"
))
)]
pub struct WorkCenterProperty<ID> {
pub id: ID,
pub name: String,
pub maps_to_equipment_class_property_id: Option<ID>,
pub nested_properties: Vec<WorkCenterProperty<ID>>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(
feature = "serde",
serde(bound(
serialize = "ID: serde::Serialize",
deserialize = "ID: serde::Deserialize<'de>"
))
)]
pub struct WorkUnit<ID> {
pub id: ID,
pub name: String,
pub work_unit_type: WorkUnitType,
pub equipment_classes: Vec<ID>, pub properties: Vec<WorkUnitProperty<ID>>,
pub equipment: Vec<Equipment<ID>>,
pub equipment_capability_test_specifications: Vec<EquipmentCapabilityTestSpecification<ID>>,
pub equipment_capability_test_results: Vec<EquipmentCapabilityTestResult<ID>>,
}
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(
feature = "serde",
serde(bound(
serialize = "ID: serde::Serialize",
deserialize = "ID: serde::Deserialize<'de>"
))
)]
pub struct WorkUnitProperty<ID> {
pub id: ID,
pub name: String,
pub maps_to_equipment_class_property_id: Option<ID>,
pub nested_properties: Vec<WorkUnitProperty<ID>>,
}
#[cfg(test)]
mod tests {
use super::*;
use crate::core::equipment::Equipment;
use uuid::Uuid;
#[test]
fn test_equipment_hierarchy() {
let equipment = Equipment::<Uuid> {
id: Uuid::new_v4(),
name: "Lathe-01".to_string(),
equipment_classes: vec![],
properties: vec![],
sub_equipment: vec![],
};
let work_unit = WorkUnit::<Uuid> {
id: Uuid::new_v4(),
name: "Work Cell A".to_string(),
work_unit_type: WorkUnitType::WorkCell,
equipment_classes: vec![],
properties: vec![],
equipment: vec![equipment],
equipment_capability_test_specifications: vec![],
equipment_capability_test_results: vec![],
};
let work_center = WorkCenter::<Uuid> {
id: Uuid::new_v4(),
name: "Production Line 1".to_string(),
work_center_type: WorkCenterType::ProductionLine,
equipment_classes: vec![],
properties: vec![],
work_units: vec![work_unit],
equipment_capability_test_specifications: vec![],
equipment_capability_test_results: vec![],
};
let area = Area::<Uuid> {
id: Uuid::new_v4(),
name: "Assembly Area".to_string(),
properties: vec![],
work_centers: vec![work_center],
};
let site = Site::<Uuid> {
id: Uuid::new_v4(),
name: "Main Plant".to_string(),
properties: vec![],
areas: vec![area],
};
let enterprise = Enterprise::<Uuid> {
id: Uuid::new_v4(),
name: "Acme Corp".to_string(),
properties: vec![],
sites: vec![site],
};
assert_eq!(enterprise.name, "Acme Corp");
assert_eq!(enterprise.sites[0].name, "Main Plant");
assert_eq!(enterprise.sites[0].areas[0].name, "Assembly Area");
assert_eq!(
enterprise.sites[0].areas[0].work_centers[0].name,
"Production Line 1"
);
assert_eq!(
enterprise.sites[0].areas[0].work_centers[0].work_units[0].name,
"Work Cell A"
);
assert_eq!(
enterprise.sites[0].areas[0].work_centers[0].work_units[0].equipment[0].name,
"Lathe-01"
);
}
}