From ce7799a45ed68d02dbb34ba87e561bc481649df2 Mon Sep 17 00:00:00 2001 From: Bhaskar Date: Wed, 4 Jun 2025 17:37:57 +0530 Subject: [PATCH] raise a ticket logic changes --- src/controllers/installationController.js | 347 ++++++++++++++-------- 1 file changed, 221 insertions(+), 126 deletions(-) diff --git a/src/controllers/installationController.js b/src/controllers/installationController.js index beaf03fa..846cd42d 100644 --- a/src/controllers/installationController.js +++ b/src/controllers/installationController.js @@ -3859,130 +3859,181 @@ const cron = require("node-cron"); // } // }; -const raiseATicketLikeLogic = async (customerId, connected_to) => { - try { - if (!customerId || !connected_to) return; +// const raiseATicketLikeLogic = async (customerId, connected_to) => { +// try { +// if (!customerId || !connected_to) return; - const normalizedConnectedTo = connected_to.trim().toLowerCase(); +// const normalizedConnectedTo = connected_to.trim().toLowerCase(); - const sensors = await Insensors.find({ customerId }).lean(); - if (!sensors.length) return; +// const sensors = await Insensors.find({ customerId }).lean(); +// if (!sensors.length) return; - const masterSensor = sensors.find( - (s) => s.hardwareId?.trim().toLowerCase() === normalizedConnectedTo && s.type === "master" - ); - if (!masterSensor) return; +// const masterSensor = sensors.find( +// (s) => s.hardwareId?.trim().toLowerCase() === normalizedConnectedTo && s.type === "master" +// ); +// if (!masterSensor) return; - const orders = await Order.find({ customerId }).lean(); +// const orders = await Order.find({ customerId }).lean(); - const connectedSlaves = sensors.filter( - (s) => s.connected_to?.trim().toLowerCase() === normalizedConnectedTo && s.type === "slave" - ); +// const connectedSlaves = sensors.filter( +// (s) => s.connected_to?.trim().toLowerCase() === normalizedConnectedTo && s.type === "slave" +// ); - const disconnectedSlaves = connectedSlaves - .filter((s) => s.connected_status === "disconnected") - .map((s) => ({ - slaveHardwareId: s.tankhardwareId?.trim().toLowerCase(), - slaveName: s.tankName || "Unknown Slave", - })); +// const disconnectedSlaves = connectedSlaves +// .filter((s) => s.connected_status === "disconnected") +// .map((s) => ({ +// slaveHardwareId: s.tankhardwareId?.trim().toLowerCase(), +// slaveName: s.tankName || "Unknown Slave", +// })); - const supportRecord = await Support.findOne({ supportId: "AWHYSU64" }); - if (!supportRecord) return; +// const supportRecord = await Support.findOne({ supportId: "AWHYSU64" }); +// if (!supportRecord) return; - const now = moment.tz("Asia/Kolkata"); - const formattedNow = now.format("YYYY-MM-DD HH:mm:ss"); +// const now = moment.tz("Asia/Kolkata"); +// const formattedNow = now.format("YYYY-MM-DD HH:mm:ss"); - const existingMasterIssue = supportRecord.issues.find( - (issue) => - issue.hardwareId?.trim().toLowerCase() === normalizedConnectedTo && - issue.type === "GSM or LoRa Disconnected" && - !issue.resolved && - !issue.movedToCategory - ); +// const existingMasterIssue = supportRecord.issues.find( +// (issue) => +// issue.hardwareId?.trim().toLowerCase() === normalizedConnectedTo && +// issue.type === "GSM or LoRa Disconnected" && +// !issue.resolved && +// !issue.movedToCategory +// ); - if (existingMasterIssue) { - if (masterSensor.connected_status === "connected") { - return; - } - return; - } +// if (existingMasterIssue) { +// if (masterSensor.connected_status === "connected") { +// return; +// } +// return; +// } - const existingSlaveHardwareIds = new Set(); - supportRecord.issues - .filter( - (issue) => - issue.hardwareId?.trim().toLowerCase() === normalizedConnectedTo && - !issue.movedToCategory - ) - .forEach((issue) => { - (issue.hardwareIds || []).forEach((id) => { - if (typeof id === "string") { - existingSlaveHardwareIds.add(id.trim().toLowerCase()); - } - }); - }); +// const existingSlaveHardwareIds = new Set(); +// supportRecord.issues +// .filter( +// (issue) => +// issue.hardwareId?.trim().toLowerCase() === normalizedConnectedTo && +// !issue.movedToCategory +// ) +// .forEach((issue) => { +// (issue.hardwareIds || []).forEach((id) => { +// if (typeof id === "string") { +// existingSlaveHardwareIds.add(id.trim().toLowerCase()); +// } +// }); +// }); - const newSlaveHardwareIds = []; - const newSlaveNames = []; +// const newSlaveHardwareIds = []; +// const newSlaveNames = []; - for (const slave of disconnectedSlaves) { - const sensorCurrent = sensors.find( - (s) => s.tankhardwareId?.trim().toLowerCase() === slave.slaveHardwareId - ); - console.log("sensorCurrent",sensorCurrent) - if ( - sensorCurrent && - sensorCurrent.connected_status === "disconnected" && - !existingSlaveHardwareIds.has(slave.slaveHardwareId) - ) { - newSlaveHardwareIds.push(slave.slaveHardwareId); - newSlaveNames.push(slave.slaveName); - } - } +// for (const slave of disconnectedSlaves) { +// const sensorCurrent = sensors.find( +// (s) => s.tankhardwareId?.trim().toLowerCase() === slave.slaveHardwareId +// ); +// console.log("sensorCurrent",sensorCurrent) +// if ( +// sensorCurrent && +// sensorCurrent.connected_status === "disconnected" && +// !existingSlaveHardwareIds.has(slave.slaveHardwareId) +// ) { +// newSlaveHardwareIds.push(slave.slaveHardwareId); +// newSlaveNames.push(slave.slaveName); +// } +// } - // 👇 Even if no new slaves found, if master is disconnected, still raise a ticket - const masterDisconnected = masterSensor.connected_status !== "connected"; +// // 👇 Even if no new slaves found, if master is disconnected, still raise a ticket +// const masterDisconnected = masterSensor.connected_status !== "connected"; - if (!masterDisconnected && newSlaveHardwareIds.length === 0) { - return; - } +// if (!masterDisconnected && newSlaveHardwareIds.length === 0) { +// return; +// } - const lastDataTime = - masterSensor.connected_gsm_date && masterSensor.connected_gsm_time - ? `${masterSensor.connected_gsm_date} ${masterSensor.connected_gsm_time}` - : "No data"; - - const message = `Master ${connected_to} is ${masterSensor.connected_status || "disconnected"}${newSlaveHardwareIds.length > 0 - ? ` with ${newSlaveHardwareIds.length} disconnected slave(s)` - : ""}`; - - const newIssue = { - type: "GSM or LoRa Disconnected", - masterHardwareId: normalizedConnectedTo, - hardwareId: normalizedConnectedTo, - hardwareIds: newSlaveHardwareIds, - slaveNames: newSlaveNames, - message, - disconnectedAt: lastDataTime, - lastTicketRaisedAt: formattedNow, - resolved: false, - movedToCategory: false, - createdAt: formattedNow, - }; +// const lastDataTime = +// masterSensor.connected_gsm_date && masterSensor.connected_gsm_time +// ? `${masterSensor.connected_gsm_date} ${masterSensor.connected_gsm_time}` +// : "No data"; - await Support.findOneAndUpdate( - { supportId: "AWHYSU64" }, - { - $push: { issues: newIssue }, - $set: { updatedAt: new Date() }, - } - ); - } catch (error) { - console.error("Error in raiseATicketLikeLogic:", error); +// const message = `Master ${connected_to} is ${masterSensor.connected_status || "disconnected"}${newSlaveHardwareIds.length > 0 +// ? ` with ${newSlaveHardwareIds.length} disconnected slave(s)` +// : ""}`; + +// const newIssue = { +// type: "GSM or LoRa Disconnected", +// masterHardwareId: normalizedConnectedTo, +// hardwareId: normalizedConnectedTo, +// hardwareIds: newSlaveHardwareIds, +// slaveNames: newSlaveNames, +// message, +// disconnectedAt: lastDataTime, +// lastTicketRaisedAt: formattedNow, +// resolved: false, +// movedToCategory: false, +// createdAt: formattedNow, +// }; + +// await Support.findOneAndUpdate( +// { supportId: "AWHYSU64" }, +// { +// $push: { issues: newIssue }, +// $set: { updatedAt: new Date() }, +// } +// ); +// } catch (error) { +// console.error("Error in raiseATicketLikeLogic:", error); +// } +// }; + + +const raiseATicketLikeLogic = async (supportRecord, masterHardwareId, slaveData = []) => { + const now = new Date(); + const formattedNow = new Date(now.getTime() + 19800000) // +05:30 offset in ms + .toISOString() + .replace("T", " ") + .substring(0, 19); + + // Check if already categorized + const alreadyCategorized = supportRecord.categorizedIssues.some( + (catIssue) => catIssue.hardwareId === masterHardwareId + ); + + // Check if already raised and unresolved & not categorized + const alreadyRaisedUnresolved = supportRecord.issues.some( + (issue) => + issue.hardwareId === masterHardwareId && + issue.resolved === false && + issue.movedToCategory === false + ); + + if (alreadyCategorized) { + console.log(`⛔ Ticket for ${masterHardwareId} already categorized. Skipping.`); + return; } -}; + if (alreadyRaisedUnresolved) { + console.log(`⛔ Unresolved ticket already exists for ${masterHardwareId}. Skipping.`); + return; + } + const slaveHardwareIds = slaveData.map((slave) => slave.hardwareId); + const slaveNames = slaveData.map((slave) => slave.sensorName || slave.tankName || ""); + + const newIssue = { + type: "GSM or LoRa Disconnected", + masterHardwareId, + hardwareId: masterHardwareId, + hardwareIds: slaveHardwareIds, + slaveNames: slaveNames, + resolved: false, + movedToCategory: false, + lastTicketRaisedAt: formattedNow, + createdAt: formattedNow, + }; + + supportRecord.issues.push(newIssue); + supportRecord.lastTicketRaisedAt = formattedNow; + + await supportRecord.save(); + console.log(`✅ New ticket raised for ${masterHardwareId}`); +}; @@ -4160,47 +4211,91 @@ const raiseATicketLikeLogic = async (customerId, connected_to) => { // } // }); +// cron.schedule("*/1 * * * *", async () => { +// try { +// console.log("🔁 Running auto-disconnect ticket check..."); + +// // Find all master sensors +// const allMasters = await Insensors.find({ type: "master" }).lean(); + +// for (const master of allMasters) { +// const customerId = master.customerId; +// const hardwareId = master.hardwareId; + +// if (!customerId || !hardwareId) continue; + +// // Find slaves connected to this master +// const connectedSlaves = await Insensors.find({ +// connected_to: hardwareId, +// type: "slave" +// }).lean(); + +// // Filter disconnected slaves +// const disconnectedSlaves = connectedSlaves.filter( +// (s) => s.connected_status === "disconnected" +// ); + +// const masterIsDisconnected = master.connected_status === "disconnected"; + +// // Only raise ticket if master is disconnected or has disconnected slaves +// if (masterIsDisconnected || disconnectedSlaves.length > 0) { +// await raiseATicketLikeLogic(customerId, hardwareId); +// } +// } + +// console.log("✅ Auto ticket check completed."); +// } catch (err) { +// console.error("Cron error:", err); +// } +// }); + cron.schedule("*/1 * * * *", async () => { try { console.log("🔁 Running auto-disconnect ticket check..."); - // Find all master sensors - const allMasters = await Insensors.find({ type: "master" }).lean(); + // Step 1: Get all support profiles + const allSupportProfiles = await Support.find({}).lean(); - for (const master of allMasters) { - const customerId = master.customerId; - const hardwareId = master.hardwareId; + for (const supportRecord of allSupportProfiles) { + const supportId = supportRecord.supportId; + if (!supportId) continue; - if (!customerId || !hardwareId) continue; + // Step 2: Find all master sensors (you can filter by zone, supportId etc. if required) + const allMasters = await Insensors.find({ type: "master" }).lean(); - // Find slaves connected to this master - const connectedSlaves = await Insensors.find({ - connected_to: hardwareId, - type: "slave" - }).lean(); + for (const master of allMasters) { + const customerId = master.customerId; + const hardwareId = master.hardwareId; - // Filter disconnected slaves - const disconnectedSlaves = connectedSlaves.filter( - (s) => s.connected_status === "disconnected" - ); + if (!customerId || !hardwareId) continue; - const masterIsDisconnected = master.connected_status === "disconnected"; + // Step 3: Find connected slaves for this master + const connectedSlaves = await Insensors.find({ + connected_to: hardwareId, + type: "slave" + }).lean(); - // Only raise ticket if master is disconnected or has disconnected slaves - if (masterIsDisconnected || disconnectedSlaves.length > 0) { - await raiseATicketLikeLogic(customerId, hardwareId); + // Step 4: Check if master or any slave is disconnected + const disconnectedSlaves = connectedSlaves.filter( + (s) => s.connected_status === "disconnected" + ); + + const masterIsDisconnected = master.connected_status === "disconnected"; + + // Step 5: Raise a ticket if needed + if (masterIsDisconnected || disconnectedSlaves.length > 0) { + await raiseATicketLikeLogic(supportRecord, hardwareId, disconnectedSlaves); + } } } console.log("✅ Auto ticket check completed."); } catch (err) { - console.error("Cron error:", err); + console.error("❌ Cron error:", err); } }); - - exports.raiseATicketBuildingDetails = async (req, reply) => { try { const { customerId, connected_to, installationId } = req.params;