///|
pub(all) struct PlantHealthKPIs {
total_asset_count : Int
active_asset_count : Int
operational_availability_percent : Double
total_power_demand_kw : Double
target_takt_time_sec : Double
max_output_per_hour : Double
plant_health_score : Double
} derive(Debug, Eq)
///|
pub fn compute_plant_kpis(graph : @graph.FactoryGraph) -> PlantHealthKPIs {
let total_nodes = graph.node_count()
let active_nodes = graph.calculate_active_nodes_count()
let total_power = graph.calculate_total_power_kw()
let b_report = analyze_production_bottlenecks(graph)
let avail_pct = if total_nodes > 0 {
active_nodes.to_double() / total_nodes.to_double() * 100.0
} else {
0.0
}
let health_score = avail_pct * 0.5 +
b_report.line_balance_efficiency_percent * 0.5
{
total_asset_count: total_nodes,
active_asset_count: active_nodes,
operational_availability_percent: avail_pct,
total_power_demand_kw: total_power,
target_takt_time_sec: b_report.takt_time_target_sec,
max_output_per_hour: b_report.max_theoretical_hourly_output,
plant_health_score: health_score,
}
}