From 7904e4494255813b31a78f665d34710dee492848 Mon Sep 17 00:00:00 2001 From: Bhaskar Date: Wed, 21 May 2025 18:01:45 +0530 Subject: [PATCH] disconnect issues for support --- src/controllers/installationController.js | 334 ++++++++++++++-------- 1 file changed, 214 insertions(+), 120 deletions(-) diff --git a/src/controllers/installationController.js b/src/controllers/installationController.js index a5b12e9f..a51356d1 100644 --- a/src/controllers/installationController.js +++ b/src/controllers/installationController.js @@ -3467,6 +3467,157 @@ exports.raiseATicketSlave = async (req, reply) => { // disconnectedIssues: finalResponse // }); +// } catch (error) { +// console.error("Error fetching disconnected issues:", error); +// return reply.code(500).send({ error: "Internal server error" }); +// } +// }; +// exports.getDisconnectedIssuesBySupportId = async (req, reply) => { +// try { +// const { supportId } = req.params; + +// if (!supportId) { +// return reply.code(400).send({ error: "supportId is required" }); +// } + +// const supportRecord = await Support.findOne({ supportId }).lean(); +// if (!supportRecord) { +// return reply.code(404).send({ message: "No support record found for this supportId" }); +// } + +// const allIssues = [...(supportRecord.issues || []), ...(supportRecord.categorizedIssues || [])]; +// const hardwareSet = new Set(); + +// for (const issue of allIssues) { +// if (issue.hardwareId) hardwareSet.add(issue.hardwareId); +// if (Array.isArray(issue.hardwareIds)) { +// issue.hardwareIds.forEach(id => hardwareSet.add(id)); +// } +// if (issue.masterHardwareId) hardwareSet.add(issue.masterHardwareId); +// } + +// const hardwareIds = [...hardwareSet]; + +// const sensors = await Insensors.find({ +// $or: [ +// { hardwareId: { $in: hardwareIds } }, +// { tankhardwareId: { $in: hardwareIds } } +// ] +// }).lean(); + +// const sensorMap = {}; +// for (const sensor of sensors) { +// if (sensor.hardwareId) sensorMap[sensor.hardwareId] = sensor; +// if (sensor.tankhardwareId) sensorMap[sensor.tankhardwareId] = sensor; +// } + +// const customerId = sensors.length > 0 ? sensors[0].customerId : null; +// const orders = customerId ? await Order.find({ customerId }).lean() : []; + +// const orderMap = {}; +// for (const order of orders) { +// if (Array.isArray(order.master_connections)) { +// for (const conn of order.master_connections) { +// if (conn.hardwareId) { +// orderMap[conn.hardwareId] = { +// masterName: conn.master_name || null, +// location: conn.location || null +// }; +// } +// } +// } +// } + +// const masterMap = {}; +// const assignedSlaves = new Set(); + +// // ✅ Step 1: Get all unique master hardware IDs involved in the issues +// const masterHardwareIds = new Set(); + +// for (const issue of allIssues) { +// const masterId = issue.masterHardwareId || issue.hardwareId; +// const sensor = sensorMap[masterId]; +// if (sensor?.type === "master") { +// masterHardwareIds.add(sensor.hardwareId); +// } +// } + +// // ✅ Step 2: Process each unique master once +// for (const masterId of masterHardwareIds) { +// const masterSensor = sensorMap[masterId]; +// if (!masterSensor) continue; + +// const enriched = orderMap[masterSensor.hardwareId] || {}; +// if (!masterMap[masterSensor.hardwareId]) { +// masterMap[masterSensor.hardwareId] = { +// hardwareId: masterSensor.hardwareId, +// masterName: masterSensor.masterName || enriched.masterName || "", +// location: masterSensor.location || enriched.location || "", +// type: "master", +// connected_status: masterSensor.connected_status, +// gsm_last_check_time: masterSensor.gsm_last_check_time, +// gsm_last_disconnect_time: masterSensor.gsm_last_disconnect_time, +// connected_gsm_date: masterSensor.connected_gsm_date, +// connected_gsm_time: masterSensor.connected_gsm_time, +// connected_lora_date: masterSensor.connected_lora_date, +// connected_lora_time: masterSensor.connected_lora_time, +// support_gsm_last_check_time: masterSensor.support_gsm_last_check_time, +// connected_slave_count: 0, +// connected_slaves: [] +// }; +// } + +// const master = masterMap[masterSensor.hardwareId]; + +// const fallbackSlaves = await Insensors.find({ +// connected_to: masterSensor.hardwareId, +// type: "slave" +// }).lean(); + +// for (const slaveSensor of fallbackSlaves) { +// const slaveKey = slaveSensor.tankhardwareId || slaveSensor.hardwareId; +// if (!slaveKey || assignedSlaves.has(slaveKey)) continue; +// if (slaveSensor.connected_status !== "disconnected") continue; + +// assignedSlaves.add(slaveKey); + +// let typeOfWater = ""; +// if (customerId && slaveSensor.tankhardwareId) { +// const tank = await Tank.findOne({ +// customerId, +// tankhardwareId: slaveSensor.tankhardwareId +// }).lean(); +// if (tank?.typeOfWater) typeOfWater = tank.typeOfWater; +// } + +// master.connected_slaves.push({ +// hardwareId: slaveSensor.tankhardwareId || slaveSensor.hardwareId, +// tankName: slaveSensor.tankName || "", +// location: slaveSensor.location || "", +// connected_status: slaveSensor.connected_status, +// connected_lora_time: slaveSensor.connected_lora_time, +// connected_lora_date: slaveSensor.connected_lora_date, +// lora_last_check_time: slaveSensor.lora_last_check_time, +// lora_last_disconnect_time: slaveSensor.lora_last_disconnect_time, +// connected_to: slaveSensor.connected_to, +// masterName: master.masterName, +// type: "slave", +// typeOfWater, +// tankHeight: slaveSensor.tankHeight, +// support_lora_last_check_time: slaveSensor.support_lora_last_check_time +// }); + +// master.connected_slave_count++; +// } +// } + +// return reply.send({ +// status_code: 200, +// supportId, +// totalMasters: Object.keys(masterMap).length, +// disconnectedIssues: Object.values(masterMap) +// }); + // } catch (error) { // console.error("Error fetching disconnected issues:", error); // return reply.code(500).send({ error: "Internal server error" }); @@ -3476,7 +3627,6 @@ exports.raiseATicketSlave = async (req, reply) => { exports.getDisconnectedIssuesBySupportId = async (req, reply) => { try { const { supportId } = req.params; - if (!supportId) { return reply.code(400).send({ error: "supportId is required" }); } @@ -3489,164 +3639,108 @@ exports.getDisconnectedIssuesBySupportId = async (req, reply) => { const allIssues = supportRecord.issues || []; const hardwareSet = new Set(); + // Collect hardwareId and masterHardwareId for (const issue of allIssues) { if (issue.hardwareId) hardwareSet.add(issue.hardwareId); - if (Array.isArray(issue.hardwareIds)) { - issue.hardwareIds.forEach(id => hardwareSet.add(id)); - } if (issue.masterHardwareId) hardwareSet.add(issue.masterHardwareId); } const hardwareIds = [...hardwareSet]; - const sensors = await Insensors.find({ $or: [ { hardwareId: { $in: hardwareIds } }, { tankhardwareId: { $in: hardwareIds } } ] }).lean(); + const sensorMap = {}; for (const sensor of sensors) { if (sensor.hardwareId) sensorMap[sensor.hardwareId] = sensor; if (sensor.tankhardwareId) sensorMap[sensor.tankhardwareId] = sensor; } - const customerId = sensors.length > 0 ? sensors[0].customerId : null; - - const orders = customerId ? await Order.find({ customerId }).lean() : []; + const customerId = supportRecord.customerId; + const orders = await Order.find({ customerId }).lean(); const orderMap = {}; for (const order of orders) { - if (Array.isArray(order.master_connections)) { - order.master_connections.forEach(conn => { - if (conn.hardwareId) { - orderMap[conn.hardwareId] = { - masterName: conn.master_name || null, - location: conn.location || null - }; - } - }); - } + (order.master_connections || []).forEach(conn => { + if (conn.hardwareId) { + orderMap[conn.hardwareId] = { + masterName: conn.master_name || null, + location: conn.location || null + }; + } + }); } const masterMap = {}; - const assignedSlaves = new Set(); for (const issue of allIssues) { - if (issue.type === "GSM or LoRa Disconnected" && issue.hardwareId) { - const sensor = sensorMap[issue.hardwareId]; - if (sensor && sensor.type === "master") { - const enriched = orderMap[sensor.hardwareId] || {}; - masterMap[sensor.hardwareId] = { - hardwareId: sensor.hardwareId, - masterName: sensor.masterName || enriched.masterName || "", - location: sensor.location || enriched.location || "", - type: "master", - connected_status: sensor.connected_status, - gsm_last_check_time: sensor.gsm_last_check_time, - gsm_last_disconnect_time: sensor.gsm_last_disconnect_time, - connected_gsm_date: sensor.connected_gsm_date, - connected_gsm_time: sensor.connected_gsm_time, - connected_lora_date: sensor.connected_lora_date, - connected_lora_time: sensor.connected_lora_time, - support_gsm_last_check_time: sensor.support_gsm_last_check_time, - connected_slave_count: 0, - connected_slaves: [] - }; - } - } - - if (issue.type === "GSM or LoRa Disconnected" && issue.masterHardwareId) { - const masterSensor = sensorMap[issue.masterHardwareId]; - if (!masterSensor || masterSensor.type !== "master") continue; + const masterId = issue.masterHardwareId || issue.hardwareId; + const masterSensor = sensorMap[masterId]; + if (!masterSensor || masterSensor.type !== "master") continue; + // If master not already added + if (!masterMap[masterSensor.hardwareId]) { const enriched = orderMap[masterSensor.hardwareId] || {}; - if (!masterMap[masterSensor.hardwareId]) { - masterMap[masterSensor.hardwareId] = { - hardwareId: masterSensor.hardwareId, - masterName: masterSensor.masterName || enriched.masterName || "", - location: masterSensor.location || enriched.location || "", - type: "master", - connected_status: masterSensor.connected_status, - gsm_last_check_time: masterSensor.gsm_last_check_time, - gsm_last_disconnect_time: masterSensor.gsm_last_disconnect_time, - connected_gsm_date: masterSensor.connected_gsm_date, - connected_gsm_time: masterSensor.connected_gsm_time, - connected_lora_date: masterSensor.connected_lora_date, - connected_lora_time: masterSensor.connected_lora_time, - support_gsm_last_check_time: masterSensor.support_gsm_last_check_time, - connected_slave_count: 0, - connected_slaves: [] - }; - } - - const master = masterMap[masterSensor.hardwareId]; - let slaveIds = Array.isArray(issue.hardwareIds) ? issue.hardwareIds : []; - let fallbackSlaves = []; - - if (slaveIds.length > 0) { - fallbackSlaves = await Insensors.find({ - $or: [ - { hardwareId: { $in: slaveIds } }, - { tankhardwareId: { $in: slaveIds } } - ], - type: "slave" - }).lean(); - } else { - fallbackSlaves = await Insensors.find({ - connected_to: issue.masterHardwareId, - type: "slave" - }).lean(); - } - - for (const slaveSensor of fallbackSlaves) { - const slaveKey = slaveSensor.tankhardwareId || slaveSensor.hardwareId; - if (!slaveKey || assignedSlaves.has(slaveKey)) continue; - - assignedSlaves.add(slaveKey); + masterMap[masterSensor.hardwareId] = { + hardwareId: masterSensor.hardwareId, + masterName: enriched.masterName || masterSensor.masterName || "", + location: enriched.location || masterSensor.location || "", + type: "master", + connected_status: masterSensor.connected_status, + gsm_last_check_time: masterSensor.gsm_last_check_time, + gsm_last_disconnect_time: masterSensor.gsm_last_disconnect_time, + connected_gsm_date: masterSensor.connected_gsm_date, + connected_gsm_time: masterSensor.connected_gsm_time, + connected_lora_date: masterSensor.connected_lora_date, + connected_lora_time: masterSensor.connected_lora_time, + support_gsm_last_check_time: masterSensor.support_gsm_last_check_time, + support_lora_last_check_time: masterSensor.support_lora_last_check_time, + connected_slave_count: 0, + connected_slaves: [] + }; + } - let typeOfWater = ""; + const master = masterMap[masterSensor.hardwareId]; - if (customerId && slaveSensor.tankhardwareId) { - const tankDetails = await Tank.findOne({ - customerId, - tankhardwareId: slaveSensor.tankhardwareId - }).lean(); + // ✅ Always fetch slaves using connected_to + const connectedSlaves = await Insensors.find({ + connected_to: masterSensor.hardwareId, + type: "slave" + }).lean(); - if (tankDetails?.typeOfWater) { - typeOfWater = tankDetails.typeOfWater; - } - } + for (const slave of connectedSlaves) { + // Only include disconnected slaves + if (slave.connected_status !== "disconnected") continue; - master.connected_slaves.push({ - hardwareId: slaveSensor.tankhardwareId, - tankName: slaveSensor.tankName || "", - location: slaveSensor.location || "", - connected_status: slaveSensor.connected_status, - connected_lora_time: slaveSensor.connected_lora_time, - connected_lora_date: slaveSensor.connected_lora_date, - lora_last_check_time: slaveSensor.lora_last_check_time, - lora_last_disconnect_time: slaveSensor.lora_last_disconnect_time, - connected_to: slaveSensor.connected_to, - masterName: master.masterName, - type: "slave", - typeOfWater, - tankHeight: slaveSensor.tankHeight, - support_lora_last_check_time: slaveSensor.support_lora_last_check_time - }); + master.connected_slaves.push({ + hardwareId: slave.tankhardwareId || slave.hardwareId, + tankName: slave.tankName || "", + location: slave.location || "", + connected_status: slave.connected_status, + connected_lora_time: slave.connected_lora_time, + connected_lora_date: slave.connected_lora_date, + lora_last_check_time: slave.lora_last_check_time, + lora_last_disconnect_time: slave.lora_last_disconnect_time, + connected_to: slave.connected_to, + masterName: master.masterName, + type: "slave", + typeOfWater: slave.typeOfWater || "", + tankHeight: slave.tankHeight, + support_lora_last_check_time: slave.support_lora_last_check_time + }); - master.connected_slave_count++; - } + master.connected_slave_count++; } } - const finalResponse = Object.values(masterMap); - return reply.send({ status_code: 200, supportId, - totalMasters: finalResponse.length, - disconnectedIssues: finalResponse + totalMasters: Object.keys(masterMap).length, + disconnectedIssues: Object.values(masterMap) }); } catch (error) {