diff --git a/src/controllers/installationController.js b/src/controllers/installationController.js index 457eed80..deac953e 100644 --- a/src/controllers/installationController.js +++ b/src/controllers/installationController.js @@ -1724,6 +1724,7 @@ exports.mastrerList = async (req, reply) => { // }; + exports.getMasterSlaveSummary = async (req, reply) => { try { const { customerId } = req.params; @@ -1742,7 +1743,7 @@ exports.getMasterSlaveSummary = async (req, reply) => { order.master_connections.forEach(connection => { orderMap[connection.hardwareId] = { masterName: connection.master_name || null, - location: connection.location || null + location: connection.location || null, }; }); }); @@ -1752,11 +1753,11 @@ exports.getMasterSlaveSummary = async (req, reply) => { for (const master of masters) { const orderInfo = orderMap[master.hardwareId] || {}; - // Use Insensors values first, fallback to orders + // Prefer Insensors info, fallback to order info const masterName = master.masterName || orderInfo.masterName || null; const location = master.location || orderInfo.location || null; - // ➤ Fetch the latest GSM data for the master device + // Fetch the latest GSM data for the master device const latestGsmData = await IotData.findOne({ hardwareId: master.hardwareId }) .sort({ date: -1, time: -1 }) .lean(); @@ -1768,9 +1769,15 @@ exports.getMasterSlaveSummary = async (req, reply) => { let gsmLastDisconnect = master.gsm_last_disconnect_time || null; if (latestGsmData?.date && latestGsmData?.time) { - const indiaTime = moment.tz(`${latestGsmData.date} ${latestGsmData.time}`, "Asia/Kolkata"); + // Combine date + time and parse as Asia/Kolkata timezone + const indiaTime = moment.tz( + `${moment(latestGsmData.date).format("YYYY-MM-DD")} ${latestGsmData.time}`, + "YYYY-MM-DD HH:mm:ss", + "Asia/Kolkata" + ); + connectedGsmDate = indiaTime.format("DD-MM-YYYY"); - connectedGsmTime = latestGsmData.time; + connectedGsmTime = indiaTime.format("HH:mm:ss"); const now = moment.tz("Asia/Kolkata"); const diffInMinutes = now.diff(indiaTime, "minutes"); @@ -1778,12 +1785,12 @@ exports.getMasterSlaveSummary = async (req, reply) => { gsmStatus = diffInMinutes <= 1 ? "connected" : "disconnected"; gsmLastCheckTime = now.format("DD-MM-YYYY HH:mm:ss"); - // If disconnected and no previous disconnect time, set it - if (gsmStatus === "disconnected" && !gsmLastDisconnect) { + if (gsmStatus === "disconnected") { + // Update disconnect time with latest disconnect timestamp gsmLastDisconnect = `${connectedGsmDate} ${connectedGsmTime}`; } - // Update master record with latest GSM info + // Update master device with latest GSM info await Insensors.updateOne( { hardwareId: master.hardwareId }, { @@ -1792,80 +1799,87 @@ exports.getMasterSlaveSummary = async (req, reply) => { connected_gsm_date: connectedGsmDate, connected_gsm_time: connectedGsmTime, gsm_last_check_time: gsmLastCheckTime, - gsm_last_disconnect_time: gsmLastDisconnect - } + gsm_last_disconnect_time: gsmLastDisconnect, + }, } ); } - // Save GSM disconnect time if disconnected - if (gsmStatus === "disconnected" && gsmLastDisconnect) { - await Insensors.updateOne( - { hardwareId: master.hardwareId }, - { $set: { gsm_last_disconnect_time: gsmLastDisconnect } } - ); - } - - // Handle slaves + // Process connected slave devices for the master const connectedSlaves = []; const slaves = await Insensors.find({ connected_to: master.hardwareId, type: "slave" }).lean(); + console.log("slaves",slaves) + for (const slave of slaves) { - const slaveIot = await IotData.findOne({ hardwareId: slave.hardwareId }) + const slaveIot = await IotData.findOne({ hardwareId: slave.connected_to }) .sort({ date: -1, time: -1 }) .lean(); - + console.log("slaveIot",slaveIot) let connectedLoraDate = null; let connectedLoraTime = null; - let loraStatus = "unknown"; - let loraLastCheckTime = null; + + // if (slaveIot?.date && slaveIot?.time) { + // const indiaTime = moment.tz(`${slaveIot.date} ${slaveIot.time}`, "Asia/Kolkata"); + // connectedLoraDate = indiaTime.format("DD-MM-YYYY"); + // connectedLoraTime = indiaTime.format("HH:mm:ss"); + // } + + // const tankHeight = await getTankHeight(slave.tankhardwareId); + // let loraStatus = (tankHeight === null || tankHeight === 0) ? "disconnected" : "connected"; + + // const loraLastDisconnect = loraStatus === "disconnected" && connectedLoraDate && connectedLoraTime + // ? `${connectedLoraDate} ${connectedLoraTime}` + // : slave.lora_last_disconnect_time || null; + let loraStatus = "disconnected"; let loraLastDisconnect = slave.lora_last_disconnect_time || null; - - if (slaveIot?.date && slaveIot?.time) { - const indiaTime = moment.tz(`${slaveIot.date} ${slaveIot.time}`, "Asia/Kolkata"); - connectedLoraDate = indiaTime.format("DD-MM-YYYY"); - connectedLoraTime = slaveIot.time; - - const now = moment.tz("Asia/Kolkata"); - const diff = now.diff(indiaTime, "minutes"); - - loraStatus = diff <= 1 ? "connected" : "disconnected"; - loraLastCheckTime = now.format("DD-MM-YYYY HH:mm:ss"); - - await Insensors.updateOne( - { hardwareId: slave.hardwareId }, - { - $set: { - connected_status: loraStatus, - connected_lora_date: connectedLoraDate, - connected_lora_time: connectedLoraTime, - lora_last_check_time: loraLastCheckTime - } - } + let tankHeight = null; + + if (slaveIot?.tanks?.length && slave.tankhardwareId) { + const matchedTank = slaveIot.tanks.find( + t => t.tankhardwareId === slave.tankhardwareId ); - - if (loraStatus === "disconnected") { - const disconnectTime = `${connectedLoraDate} ${connectedLoraTime}`; - await Insensors.updateOne( - { hardwareId: slave.hardwareId }, - { $set: { lora_last_disconnect_time: disconnectTime } } + + if (matchedTank) { + tankHeight = parseFloat(matchedTank.tankHeight) || 0; + + const indiaTime = moment.tz( + `${moment(matchedTank.date).format("YYYY-MM-DD")} ${matchedTank.time}`, + "YYYY-MM-DD HH:mm:ss", + "Asia/Kolkata" ); - loraLastDisconnect = disconnectTime; - } - } else { - loraStatus = "disconnected"; - loraLastDisconnect = loraLastDisconnect || null; - await Insensors.updateOne( - { hardwareId: slave.hardwareId }, - { - $set: { - connected_status: loraStatus, - lora_last_disconnect_time: loraLastDisconnect + + + connectedLoraDate = indiaTime.format("DD-MM-YYYY"); + connectedLoraTime = indiaTime.format("HH:mm:ss"); + + loraStatus = tankHeight > 0 ? "connected" : "disconnected"; + + // if (loraStatus === "disconnected") { + // loraLastDisconnect = `${connectedLoraDate} ${connectedLoraTime}`; + // } + if (loraStatus === "disconnected") { + if (connectedLoraDate && connectedLoraTime) { + loraLastDisconnect = `${connectedLoraDate} ${connectedLoraTime}`; + } else { + loraLastDisconnect = slave.lora_last_disconnect_time || null; } } - ); + } } - + // Update in DB + await Insensors.updateOne( + { hardwareId: slave.hardwareId }, + { + $set: { + connected_status: loraStatus, + connected_lora_date: connectedLoraDate, + connected_lora_time: connectedLoraTime, + lora_last_disconnect_time: loraLastDisconnect + } + } + ); + connectedSlaves.push({ hardwareId: slave.hardwareId, tankhardwareId: slave.tankhardwareId || null, @@ -1876,10 +1890,10 @@ exports.getMasterSlaveSummary = async (req, reply) => { connected_lora_time: connectedLoraTime, lora_last_disconnect_time: loraLastDisconnect, type: slave.type || "slave", - connected_to: slave.connected_to || null // <-- Added connected_to here + connected_to: slave.connected_to || null }); } - + result.push({ hardwareId: master.hardwareId, masterName, @@ -1893,14 +1907,14 @@ exports.getMasterSlaveSummary = async (req, reply) => { gsm_last_check_time: gsmLastCheckTime, gsm_last_disconnect_time: gsmLastDisconnect, connected_lora_date: master.connected_lora_date || null, - connected_lora_time: master.connected_lora_time || null + connected_lora_time: master.connected_lora_time || null, }); } return reply.send({ status_code: 200, message: "Master-slave summary retrieved successfully", - data: result + data: result, }); } catch (error) { console.error("Error in getMasterSlaveSummary:", error); @@ -1912,18 +1926,17 @@ exports.getMasterSlaveSummary = async (req, reply) => { // 🔍 Helper to get tankHeight from latest IotData record -async function getTankHeight(hardwareId) { - const iotData = await IotData.findOne({ 'tanks.tankhardwareId': hardwareId }) +async function getTankHeight(tankhardwareId) { + const iotData = await IotData.findOne({ 'tanks.tankhardwareId': tankhardwareId }) .sort({ date: -1 }) .lean(); if (!iotData) return null; - const matchedTank = iotData.tanks.find(t => t.tankhardwareId === hardwareId); + const matchedTank = iotData.tanks.find(t => t.tankhardwareId === tankhardwareId); return matchedTank?.tankHeight || null; } - // exports.getIotDataByCustomer = async (req, reply) => { // try { // const { customerId } = req.params;