diff --git a/src/controllers/installationController.js b/src/controllers/installationController.js index a29c4381..5aa09b83 100644 --- a/src/controllers/installationController.js +++ b/src/controllers/installationController.js @@ -1715,8 +1715,6 @@ exports.mastrerList = async (req, reply) => { // }; - - exports.getMasterSlaveSummary = async (req, reply) => { try { const { customerId } = req.params; @@ -1771,12 +1769,12 @@ exports.getMasterSlaveSummary = async (req, reply) => { gsmStatus = diffInMinutes <= 1 ? "connected" : "disconnected"; gsmLastCheckTime = now.format("DD-MM-YYYY HH:mm:ss"); - // If disconnected, update the disconnect time based on the latest GSM data + // If disconnected and no previous disconnect time, set it if (gsmStatus === "disconnected" && !gsmLastDisconnect) { gsmLastDisconnect = `${connectedGsmDate} ${connectedGsmTime}`; } - // ✅ Update master record with latest GSM info + // Update master record with latest GSM info await Insensors.updateOne( { hardwareId: master.hardwareId }, { @@ -1791,7 +1789,7 @@ exports.getMasterSlaveSummary = async (req, reply) => { ); } - // Save GSM disconnect time if status is disconnected and gsmLastDisconnect is set + // Save GSM disconnect time if disconnected if (gsmStatus === "disconnected" && gsmLastDisconnect) { await Insensors.updateOne( { hardwareId: master.hardwareId }, @@ -1799,7 +1797,7 @@ exports.getMasterSlaveSummary = async (req, reply) => { ); } - // ➤ Now handle slaves + // Handle slaves const connectedSlaves = []; const slaves = await Insensors.find({ connected_to: master.hardwareId, type: "slave" }).lean(); @@ -1861,14 +1859,15 @@ exports.getMasterSlaveSummary = async (req, reply) => { connectedSlaves.push({ hardwareId: slave.hardwareId, - tankhardwareId: slave.tankhardwareId || null, // Added here + tankhardwareId: slave.tankhardwareId || null, tankName: slave.tankName || null, location: slave.tankLocation || null, connected_status: loraStatus, connected_lora_date: connectedLoraDate, connected_lora_time: connectedLoraTime, lora_last_disconnect_time: loraLastDisconnect, - type: slave.type || "slave" + type: slave.type || "slave", + connected_to: slave.connected_to || null // <-- Added connected_to here }); } @@ -2616,6 +2615,7 @@ exports.getIotDataByCustomerAndHardwareId = async (req, reply) => { //const moment = require("moment-timezone"); + exports.raiseATicket = async (req, reply) => { try { const { customerId, connected_to } = req.params; @@ -2646,9 +2646,22 @@ exports.raiseATicket = async (req, reply) => { }); }); - const latestMasterRecord = await IotData.findOne({ hardwareId: connected_to }).sort({ date: -1 }).lean(); const now = moment.tz("Asia/Kolkata"); + // Helper function to calculate disconnect duration in minutes from a timestamp string + function getDisconnectDuration(timeStr) { + if (!timeStr) return null; + const time = moment.tz(timeStr, "DD-MM-YYYY HH:mm:ss", "Asia/Kolkata"); + if (!time.isValid()) return null; + return now.diff(time, "minutes"); + } + + // Check master disconnect durations (both GSM and LoRa) + const masterGsmDisconnectDuration = getDisconnectDuration(masterSensor.gsm_last_disconnect_time); + const masterLoraDisconnectDuration = getDisconnectDuration(masterSensor.lora_last_disconnect_time); + + // Latest master record to check connection status by data date + const latestMasterRecord = await IotData.findOne({ hardwareId: connected_to }).sort({ date: -1 }).lean(); let masterConnectedStatus = "disconnected"; let lastDataTime = "No data"; let diffInMinutes = null; @@ -2660,6 +2673,7 @@ exports.raiseATicket = async (req, reply) => { masterConnectedStatus = diffInMinutes <= 1 ? "connected" : "disconnected"; } + // Filter slaves connected to this master const connectedSlaves = sensors.filter(s => s.connected_to?.trim() === connected_to.trim() && s.type === "slave" ); @@ -2668,6 +2682,11 @@ exports.raiseATicket = async (req, reply) => { const disconnectedSlaves = []; for (const slave of connectedSlaves) { + // Check both GSM and LoRa disconnect durations for slave + const slaveGsmDisconnectDuration = getDisconnectDuration(slave.gsm_last_disconnect_time); + const slaveLoraDisconnectDuration = getDisconnectDuration(slave.lora_last_disconnect_time); + + // Latest slave tank data from master record's tanks array const slaveData = latestMasterRecord?.tanks.find(t => t.tankhardwareId === slave.hardwareId); let slaveStatus = "disconnected"; let lastSlaveDataTime = "No data"; @@ -2683,7 +2702,9 @@ exports.raiseATicket = async (req, reply) => { if (slaveStatus === "disconnected") { disconnectedSlaves.push({ slaveHardwareId: slave.hardwareId, - slaveName: slave.tankName || "Unknown Slave" + slaveName: slave.tankName || "Unknown Slave", + gsmDisconnectedDuration: slaveGsmDisconnectDuration, + loraDisconnectedDuration: slaveLoraDisconnectDuration }); } @@ -2698,19 +2719,24 @@ exports.raiseATicket = async (req, reply) => { }); } - // Raise tickets if needed + // Raise tickets only if disconnected for more than 15 mins in either GSM or LoRa const issuesToAdd = []; - if (masterConnectedStatus === "disconnected") { + // Master ticket condition + if ( + masterConnectedStatus === "disconnected" && + ((masterGsmDisconnectDuration !== null && masterGsmDisconnectDuration > 15) || + (masterLoraDisconnectDuration !== null && masterLoraDisconnectDuration > 15)) + ) { const existing = await Support.findOne({ "issues.hardwareId": connected_to, - "issues.type": "GSM Disconnected" + "issues.type": "GSM or LoRa Disconnected" }); if (!existing) { issuesToAdd.push({ - type: "GSM Disconnected", + type: "GSM or LoRa Disconnected", hardwareId: connected_to, - message: `Master GSM disconnected - ${connected_to}` + message: `Master GSM or LoRa disconnected for more than 15 minutes - ${connected_to}` }); } } @@ -2718,37 +2744,42 @@ exports.raiseATicket = async (req, reply) => { const newHardwareIds = []; const newSlaveNames = []; + // Slave tickets condition for (const s of disconnectedSlaves) { - const existing = await Support.findOne({ - "issues.hardwareIds": s.slaveHardwareId, - "issues.masterHardwareId": connected_to, - "issues.type": "LoRa Disconnected" - }); - if (!existing) { - newHardwareIds.push(s.slaveHardwareId); - newSlaveNames.push(s.slaveName); + const gsmDisconnectedMoreThan15 = s.gsmDisconnectedDuration !== null && s.gsmDisconnectedDuration > 15; + const loraDisconnectedMoreThan15 = s.loraDisconnectedDuration !== null && s.loraDisconnectedDuration > 15; + + if (gsmDisconnectedMoreThan15 || loraDisconnectedMoreThan15) { + const existing = await Support.findOne({ + "issues.hardwareIds": s.slaveHardwareId, + "issues.masterHardwareId": connected_to, + "issues.type": "LoRa or GSM Disconnected" + }); + if (!existing) { + newHardwareIds.push(s.slaveHardwareId); + newSlaveNames.push(s.slaveName); + } } } if (newHardwareIds.length > 0) { issuesToAdd.push({ - type: "LoRa Disconnected", + type: "LoRa or GSM Disconnected", masterHardwareId: connected_to, hardwareIds: newHardwareIds, slaveNames: newSlaveNames, - message: `Slaves LoRa disconnected under master ${connected_to}` + message: `Slaves LoRa or GSM disconnected for more than 15 minutes under master ${connected_to}` }); } + // Update support collection if there are new issues if (issuesToAdd.length > 0) { const supportRecord = await Support.findOne({ supportId: "AWHYSU64" }); if (supportRecord) { await Support.findOneAndUpdate( { _id: supportRecord._id }, { - $push: { - issues: { $each: issuesToAdd } - }, + $push: { issues: { $each: issuesToAdd } }, updatedAt: new Date() } ); @@ -2771,6 +2802,7 @@ exports.raiseATicket = async (req, reply) => { master: masterDetails, connected_slaves: formattedSlaves }); + } catch (error) { console.error("Error raising ticket:", error); return reply.code(500).send({ error: "Internal server error" }); @@ -2778,6 +2810,7 @@ exports.raiseATicket = async (req, reply) => { }; + // exports.raiseATicket = async (req, reply) => { // try { // const { customerId, connected_to } = req.params;