@flexabrain/mcp-server
Version:
Advanced electrical schematic analysis MCP server with rail engineering expertise
532 lines • 30.6 kB
JavaScript
import { electricalSchematicAnalyzer } from '../services/electrical-analyzer.js';
/**
* MCP Tool: Generate Maintenance Schedule
*
* Generates comprehensive maintenance schedules for electrical components
* based on rail engineering best practices, manufacturer specifications,
* and operating conditions. Optimizes maintenance timing to prevent failures.
*/
export async function generateMaintenanceSchedule(args) {
try {
// Configure analysis for maintenance scheduling
const analysisOptions = {
analysis_depth: args.maintenance_level === 'comprehensive' ? 'comprehensive' :
args.maintenance_level === 'standard' ? 'standard' : 'basic',
focus_areas: ['maintenance', 'safety'],
...(args.rail_system_type && {
rail_system_context: {
system_type: args.rail_system_type,
voltage_system: 'Variable',
region: 'GLOBAL',
applicable_standards: ['EN 50155', 'IEC 62278', 'IEEE 1934']
}
})
};
// Perform comprehensive analysis
const analysisResult = await electricalSchematicAnalyzer.analyzeSchematic(args.image_path, analysisOptions);
if (!analysisResult.success || !analysisResult.analysis) {
throw new Error('Maintenance schedule generation failed: ' + (analysisResult.errors?.[0]?.message || 'Unknown error'));
}
const analysis = analysisResult.analysis;
const scheduleHorizon = args.schedule_horizon || 24; // Default 24 months
// Generate comprehensive maintenance schedule
let schedule = '# 🔧 Electrical System Maintenance Schedule\n\n';
// Executive Summary
schedule += generateMaintenanceSummary(analysis, args, scheduleHorizon);
// Component Inventory & Criticality
schedule += generateComponentCriticality(analysis.components, args);
// Maintenance Calendar Overview
schedule += generateMaintenanceCalendar(analysis.components, scheduleHorizon, args);
// Detailed Component Schedules
schedule += generateDetailedSchedules(analysis.components, analysis.maintenance_guidance, args, scheduleHorizon);
// Priority Maintenance Actions
schedule += generatePriorityActions(analysis.maintenance_guidance, args);
// Safety-Critical Maintenance
schedule += generateSafetyCriticalMaintenance(analysis.components, analysis.safety_analysis);
// Seasonal & Environmental Considerations
schedule += generateEnvironmentalMaintenance(analysis.components, args);
// Cost Analysis
if (args.include_costs) {
schedule += generateCostAnalysis(analysis.components, args, scheduleHorizon);
}
// Maintenance Resources & Planning
schedule += generateResourcePlanning(analysis.components, args);
// Documentation & Compliance Requirements
schedule += generateComplianceRequirements(analysis.compliance_report, args);
// Schedule Summary & Recommendations
schedule += generateScheduleSummary(analysis, args, scheduleHorizon);
return schedule;
}
catch (error) {
return `❌ **Error generating maintenance schedule**\n\nError: ${error instanceof Error ? error.message : String(error)}`;
}
}
/**
* Generate maintenance executive summary
*/
function generateMaintenanceSummary(analysis, args, horizonMonths) {
const totalComponents = analysis.components.length;
const criticalComponents = analysis.components.filter((c) => ['critical', 'high'].includes(c.safety_level)).length;
let summary = '## 📋 Maintenance Overview\n\n';
summary += `**Schedule Horizon**: ${horizonMonths} months\n`;
summary += `**Total Components**: ${totalComponents}\n`;
summary += `**Safety Critical**: ${criticalComponents} components\n`;
summary += `**Operating Environment**: ${args.operating_environment?.toUpperCase() || 'STANDARD'}\n`;
summary += `**Maintenance Level**: ${args.maintenance_level?.toUpperCase() || 'STANDARD'}\n\n`;
// Calculate maintenance statistics
const maintenanceActions = estimateMaintenanceActions(analysis.components, horizonMonths, args);
summary += '### Maintenance Statistics\n\n';
summary += `- **Inspections**: ${maintenanceActions.inspections} scheduled\n`;
summary += `- **Testing**: ${maintenanceActions.testing} sessions\n`;
summary += `- **Calibrations**: ${maintenanceActions.calibrations} required\n`;
summary += `- **Overhauls**: ${maintenanceActions.overhauls} planned\n`;
summary += `- **Emergency Reserves**: ${Math.ceil(maintenanceActions.total * 0.1)} actions (10% buffer)\n\n`;
// Risk assessment
const riskLevel = assessMaintenanceRisk(analysis.components, args);
summary += `**Risk Assessment**: ${riskLevel.icon} ${riskLevel.level}\n`;
summary += `**Risk Factors**: ${riskLevel.factors.join(', ')}\n\n`;
return summary;
}
/**
* Generate component criticality analysis
*/
function generateComponentCriticality(components, args) {
let criticality = '## 🎯 Component Criticality Analysis\n\n';
// Categorize components by criticality
const critical = components.filter(c => c.safety_level === 'critical');
const high = components.filter(c => c.safety_level === 'high');
const medium = components.filter(c => c.safety_level === 'medium');
const low = components.filter(c => c.safety_level === 'low');
criticality += '### Criticality Distribution\n\n';
criticality += '| Level | Count | Components | Maintenance Priority |\n';
criticality += '|-------|-------|------------|----------------------|\n';
criticality += `| 🔴 Critical | ${critical.length} | ${critical.map(c => c.id).join(', ') || 'None'} | Immediate |\n`;
criticality += `| 🟠 High | ${high.length} | ${high.map(c => c.id).join(', ') || 'None'} | Priority |\n`;
criticality += `| 🟡 Medium | ${medium.length} | ${medium.map(c => c.id).join(', ') || 'None'} | Standard |\n`;
criticality += `| 🟢 Low | ${low.length} | ${low.map(c => c.id).join(', ') || 'None'} | Routine |\n`;
criticality += '\n';
if (args.criticality_weighting) {
criticality += '### Criticality-Based Scheduling\n\n';
criticality += '- **Critical Components**: 25% more frequent maintenance\n';
criticality += '- **High Priority**: 15% more frequent maintenance\n';
criticality += '- **Standard Components**: Manufacturer recommended intervals\n';
criticality += '- **Low Priority**: Extended intervals where safe\n\n';
}
// Component failure impact analysis
criticality += '### Failure Impact Assessment\n\n';
if (critical.length > 0) {
criticality += '#### Critical Component Failures\n';
for (const component of critical.slice(0, 5)) { // Limit to 5 for readability
criticality += `- **${component.id}**: System shutdown, safety risk, immediate repair required\n`;
}
criticality += '\n';
}
if (high.length > 0) {
criticality += '#### High Priority Component Failures\n';
for (const component of high.slice(0, 3)) {
criticality += `- **${component.id}**: Service degradation, scheduled repair within 24-48 hours\n`;
}
criticality += '\n';
}
return criticality;
}
/**
* Generate maintenance calendar overview
*/
function generateMaintenanceCalendar(components, horizonMonths, args) {
let calendar = '## 📅 Maintenance Calendar Overview\n\n';
// Generate monthly breakdown
const monthlySchedule = generateMonthlyBreakdown(components, horizonMonths, args);
calendar += '### Monthly Maintenance Distribution\n\n';
calendar += '| Month | Inspections | Testing | Calibration | Overhaul | Total Actions |\n';
calendar += '|-------|-------------|---------|-------------|----------|---------------|\n';
for (let month = 1; month <= Math.min(horizonMonths, 12); month++) {
const schedule = monthlySchedule[month] || { inspections: 0, testing: 0, calibration: 0, overhaul: 0 };
const total = schedule.inspections + schedule.testing + schedule.calibration + schedule.overhaul;
calendar += `| Month ${month} | ${schedule.inspections} | ${schedule.testing} | ${schedule.calibration} | ${schedule.overhaul} | **${total}** |\n`;
}
calendar += '\n';
// Peak maintenance periods
calendar += '### Peak Maintenance Periods\n\n';
const peakMonths = Object.entries(monthlySchedule)
.sort(([, a], [, b]) => (b.inspections + b.testing + b.calibration + b.overhaul) - (a.inspections + a.testing + a.calibration + a.overhaul))
.slice(0, 3);
if (peakMonths.length > 0) {
calendar += 'High maintenance activity expected in:\n';
for (const [month, schedule] of peakMonths) {
const total = schedule.inspections + schedule.testing + schedule.calibration + schedule.overhaul;
calendar += `- **Month ${month}**: ${total} maintenance actions\n`;
}
}
else {
calendar += 'Maintenance load is evenly distributed across the schedule horizon.\n';
}
calendar += '\n';
return calendar;
}
/**
* Generate detailed component maintenance schedules
*/
function generateDetailedSchedules(components, maintenanceGuidance, args, horizonMonths) {
let detailed = '## 🔧 Detailed Component Schedules\n\n';
// Group components by type for organized scheduling
const componentsByType = components.reduce((acc, component) => {
if (!acc[component.type])
acc[component.type] = [];
acc[component.type].push(component);
return acc;
}, {});
for (const [type, typeComponents] of Object.entries(componentsByType)) {
detailed += `### ${formatComponentType(type)} Maintenance\n\n`;
detailed += '| Component | Next Inspection | Next Testing | Next Calibration | Next Overhaul |\n';
detailed += '|-----------|-----------------|--------------|------------------|---------------|\n';
for (const component of typeComponents) {
const schedule = findComponentSchedule(component.id, maintenanceGuidance);
detailed += `| **${component.id}** | `;
detailed += `${formatDate(schedule?.next_inspection)} | `;
detailed += `${formatDate(schedule?.next_testing) || 'N/A'} | `;
detailed += `${formatDate(schedule?.next_calibration) || 'N/A'} | `;
detailed += `${formatDate(schedule?.next_overhaul) || 'N/A'} |\n`;
}
detailed += '\n';
// Component-specific maintenance notes
detailed += `#### ${formatComponentType(type)} Maintenance Notes\n\n`;
detailed += getMaintenanceNotes(type, args);
detailed += '\n';
}
return detailed;
}
/**
* Generate priority maintenance actions
*/
function generatePriorityActions(maintenanceGuidance, args) {
let priority = '## ⚡ Priority Maintenance Actions\n\n';
const priorityActions = maintenanceGuidance?.priority_actions || [];
if (priorityActions.length === 0) {
priority += '✅ **No immediate priority actions identified**\n\n';
return priority;
}
priority += '### Immediate Actions Required\n\n';
for (const action of priorityActions) {
const urgencyIcon = action.urgency === 'URGENT' ? '🔴' :
action.urgency === 'HIGH' ? '🟠' : '🟡';
priority += `#### ${urgencyIcon} ${action.action}\n\n`;
priority += `**Components**: ${action.component_ids?.join(', ') || 'System-wide'}\n`;
priority += `**Urgency**: ${action.urgency}\n`;
priority += `**Estimated Duration**: ${action.estimated_duration || 'TBD'}\n`;
priority += `**Estimated Cost**: ${action.estimated_cost || 'TBD'}\n\n`;
if (args.rail_system_type) {
priority += `**Rail System Impact**: Review scheduling to minimize service disruption\n`;
}
priority += '---\n\n';
}
return priority;
}
/**
* Generate safety-critical maintenance section
*/
function generateSafetyCriticalMaintenance(components, safetyAnalysis) {
let safety = '## 🛡️ Safety-Critical Maintenance\n\n';
const criticalComponents = components.filter(c => c.safety_level === 'critical');
if (criticalComponents.length === 0) {
safety += '✅ **No safety-critical components requiring special maintenance protocols**\n\n';
return safety;
}
safety += '### Critical Safety Components\n\n';
safety += '| Component | Safety Level | Special Requirements | Inspection Frequency |\n';
safety += '|-----------|--------------|---------------------|----------------------|\n';
for (const component of criticalComponents) {
const requirements = getSafetyRequirements(component.type);
const frequency = getCriticalInspectionFrequency(component.type);
safety += `| **${component.id}** | 🔴 ${component.safety_level} | ${requirements} | ${frequency} |\n`;
}
safety += '\n';
// High voltage maintenance safety
if (safetyAnalysis?.electrical_shock_hazards?.present) {
safety += '### High Voltage Safety Protocols\n\n';
safety += '- **Lockout/Tagout**: Required for all high voltage maintenance\n';
safety += '- **PPE Requirements**: Arc flash rated equipment per NFPA 70E\n';
safety += '- **Qualified Personnel**: Only authorized electricians\n';
safety += '- **Safety Permits**: Hot work permits where required\n';
safety += '- **Emergency Procedures**: Rescue and first aid protocols\n\n';
}
// Arc flash considerations
if (safetyAnalysis?.arc_flash_hazards?.present) {
safety += '### Arc Flash Protection During Maintenance\n\n';
safety += `- **PPE Category**: ${safetyAnalysis.arc_flash_hazards.ppe_category}\n`;
safety += `- **Incident Energy**: ${safetyAnalysis.arc_flash_hazards.estimated_energy} cal/cm²\n`;
safety += '- **Working Distance**: Maintain safe approach boundaries\n';
safety += '- **De-energized Work**: Preferred method when feasible\n\n';
}
return safety;
}
/**
* Generate environmental maintenance considerations
*/
function generateEnvironmentalMaintenance(components, args) {
let environmental = '## 🌦️ Environmental Maintenance Considerations\n\n';
const environment = args.operating_environment || 'standard';
environmental += `### ${environment.toUpperCase()} Environment Adaptations\n\n`;
switch (environment) {
case 'outdoor':
environmental += '- **Weather Protection**: Inspect seals and enclosures more frequently\n';
environmental += '- **Corrosion Prevention**: Enhanced cleaning and protective coatings\n';
environmental += '- **UV Degradation**: Monitor plastic and rubber components\n';
environmental += '- **Temperature Cycling**: Account for thermal expansion/contraction\n';
break;
case 'harsh':
environmental += '- **Contamination Control**: Frequent cleaning of electrical contacts\n';
environmental += '- **Vibration Effects**: Check mounting hardware and connections\n';
environmental += '- **Moisture Ingress**: Enhanced IP rating verification\n';
environmental += '- **Chemical Exposure**: Use compatible materials and coatings\n';
break;
case 'controlled':
environmental += '- **Stable Conditions**: Standard maintenance intervals applicable\n';
environmental += '- **Dust Control**: Regular cleaning but less frequent than harsh environments\n';
environmental += '- **Temperature Control**: Monitor HVAC system performance\n';
break;
default:
environmental += '- **Standard Conditions**: Follow manufacturer recommendations\n';
environmental += '- **Seasonal Variations**: Adjust for local climate conditions\n';
}
environmental += '\n### Seasonal Maintenance Calendar\n\n';
environmental += '| Season | Focus Area | Typical Activities |\n';
environmental += '|--------|------------|--------------------|\n';
environmental += '| Spring | Cleaning & Inspection | Remove winter debris, check seals |\n';
environmental += '| Summer | Cooling Systems | Verify ventilation, clean filters |\n';
environmental += '| Fall | Preparation | Weatherproofing, heating system checks |\n';
environmental += '| Winter | Monitoring | Increased inspection frequency |\n';
environmental += '\n';
return environmental;
}
/**
* Generate cost analysis
*/
function generateCostAnalysis(components, args, horizonMonths) {
let costs = '## 💰 Maintenance Cost Analysis\n\n';
const costEstimates = calculateMaintenanceCosts(components, args, horizonMonths);
costs += '### Cost Breakdown\n\n';
costs += '| Category | Annual Cost | Total Cost | Percentage |\n';
costs += '|----------|-------------|------------|------------|\n';
const totalCost = costEstimates.inspection + costEstimates.testing + costEstimates.calibration + costEstimates.overhaul + costEstimates.emergency;
costs += `| Inspections | $${costEstimates.inspection.toLocaleString()} | $${Math.round(costEstimates.inspection * horizonMonths / 12).toLocaleString()} | ${((costEstimates.inspection / totalCost) * 100).toFixed(1)}% |\n`;
costs += `| Testing | $${costEstimates.testing.toLocaleString()} | $${Math.round(costEstimates.testing * horizonMonths / 12).toLocaleString()} | ${((costEstimates.testing / totalCost) * 100).toFixed(1)}% |\n`;
costs += `| Calibration | $${costEstimates.calibration.toLocaleString()} | $${Math.round(costEstimates.calibration * horizonMonths / 12).toLocaleString()} | ${((costEstimates.calibration / totalCost) * 100).toFixed(1)}% |\n`;
costs += `| Overhauls | $${costEstimates.overhaul.toLocaleString()} | $${Math.round(costEstimates.overhaul * horizonMonths / 12).toLocaleString()} | ${((costEstimates.overhaul / totalCost) * 100).toFixed(1)}% |\n`;
costs += `| Emergency Reserve | $${costEstimates.emergency.toLocaleString()} | $${Math.round(costEstimates.emergency * horizonMonths / 12).toLocaleString()} | ${((costEstimates.emergency / totalCost) * 100).toFixed(1)}% |\n`;
costs += `| **Total** | **$${totalCost.toLocaleString()}** | **$${Math.round(totalCost * horizonMonths / 12).toLocaleString()}** | **100%** |\n`;
costs += '\n### Cost Optimization Opportunities\n\n';
costs += '- **Predictive Maintenance**: Reduce emergency repairs by 30-50%\n';
costs += '- **Bulk Scheduling**: Group similar maintenance activities\n';
costs += '- **Condition Monitoring**: Extend intervals for stable components\n';
costs += '- **Training**: Reduce contractor dependency for routine tasks\n\n';
return costs;
}
/**
* Generate resource planning section
*/
function generateResourcePlanning(components, args) {
let resources = '## 👥 Maintenance Resources & Planning\n\n';
// Estimate resource requirements
const resourceNeeds = calculateResourceNeeds(components, args);
resources += '### Personnel Requirements\n\n';
resources += '| Skill Level | Hours/Month | Personnel Type |\n';
resources += '|-------------|-------------|----------------|\n';
resources += `| Electrician (Journeyman) | ${resourceNeeds.electrician} | Licensed electrical technician |\n`;
resources += `| Technician (Specialized) | ${resourceNeeds.technician} | Equipment-specific training |\n`;
resources += `| Engineer (PE) | ${resourceNeeds.engineer} | Professional oversight |\n`;
resources += `| Total Labor Hours | **${resourceNeeds.total}** | Combined effort |\n`;
resources += '\n';
resources += '### Equipment & Tools\n\n';
resources += '- **Test Equipment**: Multimeters, insulation testers, oscilloscopes\n';
resources += '- **Safety Equipment**: Arc flash PPE, voltage detectors, grounding sets\n';
resources += '- **Specialized Tools**: Torque wrenches, fiber optic cleaners, thermal cameras\n';
resources += '- **Lifting Equipment**: Where required for heavy components\n\n';
resources += '### Parts & Materials Inventory\n\n';
resources += '- **Critical Spares**: Maintain 2-week lead time coverage\n';
resources += '- **Consumables**: Cleaning supplies, lubricants, contact enhancers\n';
resources += '- **Replacement Parts**: Based on MTBF and criticality analysis\n';
resources += '- **Emergency Stock**: 10% buffer for unplanned maintenance\n\n';
return resources;
}
/**
* Generate compliance requirements
*/
function generateComplianceRequirements(complianceReport, args) {
let compliance = '## 📋 Documentation & Compliance\n\n';
compliance += '### Maintenance Documentation Requirements\n\n';
compliance += '- **Work Orders**: Detailed maintenance records\n';
compliance += '- **Test Results**: Measurement data and pass/fail criteria\n';
compliance += '- **Calibration Certificates**: Traceable to national standards\n';
compliance += '- **Safety Inspections**: Arc flash studies, ground fault tests\n';
compliance += '- **Training Records**: Personnel qualification documentation\n\n';
compliance += '### Regulatory Compliance\n\n';
if (args.rail_system_type) {
compliance += '#### Rail Industry Standards\n';
compliance += '- **EN 50155**: Railway rolling stock equipment standards\n';
compliance += '- **IEC 62278**: Railway RAMS (Reliability, Availability, Maintainability, Safety)\n';
compliance += '- **FRA/FTA**: Federal railroad administration requirements (US)\n';
compliance += '- **TSI**: Technical Specifications for Interoperability (EU)\n\n';
}
compliance += '#### Electrical Safety Standards\n';
compliance += '- **NFPA 70E**: Electrical safety in the workplace\n';
compliance += '- **IEEE 1584**: Arc flash hazard calculation\n';
compliance += '- **OSHA 1910**: Occupational safety standards\n';
compliance += '- **IEC 60364**: Low voltage electrical installations\n\n';
compliance += '### Audit & Inspection Schedule\n\n';
compliance += '- **Internal Audits**: Quarterly maintenance program reviews\n';
compliance += '- **External Inspections**: Annual third-party assessments\n';
compliance += '- **Regulatory Inspections**: As required by local authorities\n';
compliance += '- **Certification Renewals**: Track expiration dates\n\n';
return compliance;
}
/**
* Generate schedule summary and recommendations
*/
function generateScheduleSummary(analysis, args, horizonMonths) {
let summary = '## 📊 Schedule Summary & Recommendations\n\n';
summary += '### Key Metrics\n\n';
const totalComponents = analysis.components.length;
const criticalComponents = analysis.components.filter((c) => c.safety_level === 'critical').length;
const maintenanceActions = estimateMaintenanceActions(analysis.components, horizonMonths, args);
summary += `- **Total Components Under Maintenance**: ${totalComponents}\n`;
summary += `- **Safety Critical Components**: ${criticalComponents}\n`;
summary += `- **Total Maintenance Actions**: ${maintenanceActions.total}\n`;
summary += `- **Average Actions per Month**: ${Math.round(maintenanceActions.total / horizonMonths)}\n`;
summary += `- **Schedule Horizon**: ${horizonMonths} months\n\n`;
summary += '### Implementation Recommendations\n\n';
summary += '1. **Phase Implementation**: Start with critical components first\n';
summary += '2. **Resource Planning**: Ensure adequate personnel and budget allocation\n';
summary += '3. **CMMS Integration**: Use computerized maintenance management system\n';
summary += '4. **Predictive Maintenance**: Implement condition monitoring where beneficial\n';
summary += '5. **Documentation**: Maintain detailed maintenance records\n\n';
summary += '### Success Metrics\n\n';
summary += '- **Equipment Availability**: Target >99% for critical components\n';
summary += '- **MTBF Improvement**: 20% increase in mean time between failures\n';
summary += '- **Cost Reduction**: 15% reduction in emergency maintenance\n';
summary += '- **Safety Performance**: Zero maintenance-related incidents\n\n';
summary += '### Next Steps\n\n';
summary += '1. **Approval Process**: Review and approve maintenance schedule\n';
summary += '2. **Resource Allocation**: Secure budget and personnel\n';
summary += '3. **Tool Preparation**: Acquire necessary equipment and spare parts\n';
summary += '4. **Training**: Ensure personnel are qualified for all tasks\n';
summary += '5. **System Setup**: Configure CMMS and tracking systems\n';
summary += '6. **Schedule Launch**: Begin implementation with priority components\n\n';
summary += '---\n';
summary += `*Maintenance schedule generated on ${new Date().toISOString().split('T')[0]} using FlexaBrain MCP Server v${analysis.analyzer_version}*\n`;
return summary;
}
// Helper functions
function formatComponentType(type) {
return type.split('_').map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(' ');
}
function formatDate(date) {
if (!date)
return 'N/A';
const isoString = date.toISOString();
return isoString.split('T')[0] ?? 'N/A';
}
function estimateMaintenanceActions(components, horizonMonths, args) {
const multiplier = args.operating_environment === 'harsh' ? 1.5 :
args.operating_environment === 'outdoor' ? 1.25 : 1.0;
const inspections = Math.round(components.length * horizonMonths * 0.5 * multiplier);
const testing = Math.round(components.length * horizonMonths * 0.25 * multiplier);
const calibrations = Math.round(components.length * horizonMonths * 0.1 * multiplier);
const overhauls = Math.round(components.length * horizonMonths * 0.05 * multiplier);
return {
inspections,
testing,
calibrations,
overhauls,
total: inspections + testing + calibrations + overhauls
};
}
function assessMaintenanceRisk(components, args) {
const criticalCount = components.filter(c => c.safety_level === 'critical').length;
const environmentFactor = args.operating_environment === 'harsh' ? 2 :
args.operating_environment === 'outdoor' ? 1.5 : 1;
const riskScore = (criticalCount * 2 + components.length * 0.1) * environmentFactor;
if (riskScore > 10) {
return { level: 'HIGH', icon: '🔴', factors: ['Multiple critical components', 'Harsh environment'] };
}
else if (riskScore > 5) {
return { level: 'MEDIUM', icon: '🟡', factors: ['Some critical components', 'Standard environment'] };
}
else {
return { level: 'LOW', icon: '🟢', factors: ['Few critical components', 'Controlled environment'] };
}
}
function generateMonthlyBreakdown(components, horizonMonths, args) {
const breakdown = {};
for (let month = 1; month <= horizonMonths; month++) {
const actions = estimateMaintenanceActions(components, 1, args);
// Add some variation to make it realistic
const variation = 0.8 + Math.random() * 0.4; // 80-120% of average
breakdown[month] = {
inspections: Math.round(actions.inspections * variation),
testing: Math.round(actions.testing * variation),
calibration: Math.round(actions.calibrations * variation),
overhaul: Math.round(actions.overhauls * variation)
};
}
return breakdown;
}
function findComponentSchedule(componentId, maintenanceGuidance) {
return maintenanceGuidance?.component_schedules?.find((s) => s.component_id === componentId);
}
function getMaintenanceNotes(componentType, args) {
const notes = {
'converter': '- Clean cooling fins and check thermal management\n- Verify DC link capacitor health\n- Test protection relay settings',
'transformer': '- Oil analysis (if oil-filled)\n- Insulation resistance testing\n- Tap changer maintenance (if applicable)',
'circuit_breaker': '- Contact resistance measurement\n- Operating mechanism lubrication\n- Arc chute inspection and cleaning',
'relay': '- Calibration verification\n- Contact cleaning\n- Time delay accuracy testing',
'motor': '- Bearing lubrication\n- Insulation resistance testing\n- Vibration analysis'
};
return notes[componentType] || '- Visual inspection\n- Electrical testing\n- Performance verification';
}
function getSafetyRequirements(componentType) {
const requirements = {
'converter': 'De-energize and lockout, PPE Category 3',
'transformer': 'Oil testing, high voltage safety',
'circuit_breaker': 'Arc flash protection, qualified personnel',
'relay': 'System isolation, calibrated test equipment'
};
return requirements[componentType] || 'Standard electrical safety';
}
function getCriticalInspectionFrequency(componentType) {
const frequencies = {
'converter': 'Monthly',
'transformer': 'Quarterly',
'circuit_breaker': 'Monthly',
'relay': 'Bi-weekly'
};
return frequencies[componentType] || 'Monthly';
}
function calculateMaintenanceCosts(components, args, horizonMonths) {
const baseCosts = {
inspection: 150, // per inspection
testing: 300, // per test session
calibration: 500, // per calibration
overhaul: 2000 // per overhaul
};
const actions = estimateMaintenanceActions(components, 12, args); // Annual
return {
inspection: actions.inspections * baseCosts.inspection,
testing: actions.testing * baseCosts.testing,
calibration: actions.calibrations * baseCosts.calibration,
overhaul: actions.overhauls * baseCosts.overhaul,
emergency: (actions.inspections * baseCosts.inspection + actions.testing * baseCosts.testing) * 0.2 // 20% emergency buffer
};
}
function calculateResourceNeeds(components, args) {
const baseHours = components.length * 2; // 2 hours per component per month average
const environmentMultiplier = args.operating_environment === 'harsh' ? 1.5 : 1.0;
const totalHours = Math.round(baseHours * environmentMultiplier);
return {
electrician: Math.round(totalHours * 0.6),
technician: Math.round(totalHours * 0.3),
engineer: Math.round(totalHours * 0.1),
total: totalHours
};
}
//# sourceMappingURL=generate-maintenance-schedule.js.map