pms-analysis-reports-mcp-server
Version:
PMS analysis reports server handling maintenance reports, equipment analysis, compliance tracking, and performance metrics with ERP access for data extraction
100 lines • 5.31 kB
JavaScript
import { getDataLink, getVesselImoListFromFleet, exportDataForImoListGeneric, convertToCSV } from "../../utils/helper_functions.js";
import { getTypesenseClient } from "../../utils/typesense.js";
import { logger } from "../../index.js";
import { filterImoListForCompany } from "../../utils/company-filtering.js";
export class ExportToolHandler {
constructor() {
this.typesenseClient = getTypesenseClient();
}
// Fleet Operations Tools
async exportFleetPms(arguments_) {
logger.info("exportFleetPms called", arguments_);
const fleetImo = Number(arguments_.fleet_imo);
const startDate = arguments_.start_date;
const endDate = arguments_.end_date;
if (!fleetImo) {
throw new Error("fleet_imo is required. Only the following properties are allowed: fleet_imo, start_date, end_date. Please check the tool schema for exportFleetPms for the allowed properties.");
}
try {
// Step 1: Get vessel IMO list from fleet
logger.info(`Step 1: Getting vessel IMO list for fleet IMO ${fleetImo}`);
const mongodbEtlDevDataDbName = process.env.MONGODB_ETL_DEV_DATA_DB_NAME || process.env.mongodbEtlDevDataDbName || 'syia-etl-dev';
const mongodbEtlDevDataUri = process.env.MONGODB_ETL_DEV_DATA_URI || process.env.mongodbEtlDevDataUri || '';
const vesselImoList = await getVesselImoListFromFleet(fleetImo, mongodbEtlDevDataDbName, mongodbEtlDevDataUri);
if (!vesselImoList || vesselImoList.length === 0) {
return [{
type: "text",
text: `No vessels found for fleet IMO: ${fleetImo}`,
title: "No Vessels Found"
}];
}
logger.info(`Found ${vesselImoList.length} vessels in fleet IMO ${fleetImo}`);
// Step 1.5: Filter out vessels that are not part of the current company
// This fetches company IMOs once (cached) and filters the list efficiently using O(1) Set lookups
const filteredVesselImoList = await filterImoListForCompany(vesselImoList, mongodbEtlDevDataDbName, mongodbEtlDevDataUri);
if (!filteredVesselImoList || filteredVesselImoList.length === 0) {
return [{
type: "text",
text: `No vessels from fleet IMO ${fleetImo} belong to your company. Access denied.`,
title: "No Vessels Found"
}];
}
// Step 2: Export PMS records for all vessels in the fleet
logger.info(`Step 2: Exporting PMS records for ${vesselImoList.length} vessels`);
const pmsDocuments = await this.exportPmsForImoList(vesselImoList, startDate, endDate);
if (!pmsDocuments || pmsDocuments.length === 0) {
return [{
type: "text",
text: `No PMS maintenance records found for fleet IMO ${fleetImo} with the specified criteria`,
title: "No PMS Records Found"
}];
}
logger.info(`Found ${pmsDocuments.length} PMS maintenance records for fleet IMO ${fleetImo}`);
// Step 3: Convert to CSV
logger.info(`Step 3: Converting ${pmsDocuments.length} records to CSV`);
const csvData = convertToCSV(pmsDocuments);
// Insert tracking data to MongoDB (optional)
try {
const dataLink = await getDataLink(pmsDocuments);
const linkHeader = `Fleet PMS export for fleet IMO ${fleetImo}`;
const vesselName = pmsDocuments.length > 0 ? pmsDocuments[0].vesselName : null;
// await insertDataLinkToMongoDB(dataLink, linkHeader, sessionId, String(fleetImo), vesselName || `Fleet_${fleetImo}`, mongodbEtlDevDataDbName, mongodbEtlDevDataUri);
}
catch (trackingError) {
logger.warn(`Failed to insert tracking data: ${trackingError}`);
// Continue execution even if tracking fails
}
// Return CSV data
const content = {
type: "text",
text: csvData,
title: `Fleet PMS Export - IMO ${fleetImo}`,
format: "csv"
};
return [content];
}
catch (error) {
logger.error(`Error exporting fleet PMS for IMO ${fleetImo}: ${error}`);
throw new Error(`Error exporting fleet PMS: ${String(error)}`);
}
}
async exportPmsForImoList(imoList, startDate, endDate) {
return exportDataForImoListGeneric('pms', // collection
imoList, // imoList
startDate, // startDate
endDate, // endDate
'jobDueDate', // dateField (instead of 'reportDate')
"_id,docId,fleetId,vesselId,fleetManagerId,technicalSuperintendentId,id,embedding", // excludeFields
[
'inspectionTargetDate',
'reportDate',
'closingDate',
'targetDate',
'nextDueDate',
'extendedDate',
'jobDueDate', // Add this
'jobDoneDate' // Add this
]);
}
}
//# sourceMappingURL=exportTools.js.map