disconnect issues for support

master^2
Bhaskar 5 months ago
parent 9d0b634c89
commit 7904e44942

@ -3467,6 +3467,157 @@ exports.raiseATicketSlave = async (req, reply) => {
// disconnectedIssues: finalResponse // 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) { // } catch (error) {
// console.error("Error fetching disconnected issues:", error); // console.error("Error fetching disconnected issues:", error);
// return reply.code(500).send({ error: "Internal server error" }); // return reply.code(500).send({ error: "Internal server error" });
@ -3476,7 +3627,6 @@ exports.raiseATicketSlave = async (req, reply) => {
exports.getDisconnectedIssuesBySupportId = async (req, reply) => { exports.getDisconnectedIssuesBySupportId = async (req, reply) => {
try { try {
const { supportId } = req.params; const { supportId } = req.params;
if (!supportId) { if (!supportId) {
return reply.code(400).send({ error: "supportId is required" }); return reply.code(400).send({ error: "supportId is required" });
} }
@ -3489,164 +3639,108 @@ exports.getDisconnectedIssuesBySupportId = async (req, reply) => {
const allIssues = supportRecord.issues || []; const allIssues = supportRecord.issues || [];
const hardwareSet = new Set(); const hardwareSet = new Set();
// Collect hardwareId and masterHardwareId
for (const issue of allIssues) { for (const issue of allIssues) {
if (issue.hardwareId) hardwareSet.add(issue.hardwareId); 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); if (issue.masterHardwareId) hardwareSet.add(issue.masterHardwareId);
} }
const hardwareIds = [...hardwareSet]; const hardwareIds = [...hardwareSet];
const sensors = await Insensors.find({ const sensors = await Insensors.find({
$or: [ $or: [
{ hardwareId: { $in: hardwareIds } }, { hardwareId: { $in: hardwareIds } },
{ tankhardwareId: { $in: hardwareIds } } { tankhardwareId: { $in: hardwareIds } }
] ]
}).lean(); }).lean();
const sensorMap = {}; const sensorMap = {};
for (const sensor of sensors) { for (const sensor of sensors) {
if (sensor.hardwareId) sensorMap[sensor.hardwareId] = sensor; if (sensor.hardwareId) sensorMap[sensor.hardwareId] = sensor;
if (sensor.tankhardwareId) sensorMap[sensor.tankhardwareId] = sensor; if (sensor.tankhardwareId) sensorMap[sensor.tankhardwareId] = sensor;
} }
const customerId = sensors.length > 0 ? sensors[0].customerId : null; const customerId = supportRecord.customerId;
const orders = await Order.find({ customerId }).lean();
const orders = customerId ? await Order.find({ customerId }).lean() : [];
const orderMap = {}; const orderMap = {};
for (const order of orders) { for (const order of orders) {
if (Array.isArray(order.master_connections)) { (order.master_connections || []).forEach(conn => {
order.master_connections.forEach(conn => { if (conn.hardwareId) {
if (conn.hardwareId) { orderMap[conn.hardwareId] = {
orderMap[conn.hardwareId] = { masterName: conn.master_name || null,
masterName: conn.master_name || null, location: conn.location || null
location: conn.location || null };
}; }
} });
});
}
} }
const masterMap = {}; const masterMap = {};
const assignedSlaves = new Set();
for (const issue of allIssues) { for (const issue of allIssues) {
if (issue.type === "GSM or LoRa Disconnected" && issue.hardwareId) { const masterId = issue.masterHardwareId || issue.hardwareId;
const sensor = sensorMap[issue.hardwareId]; const masterSensor = sensorMap[masterId];
if (sensor && sensor.type === "master") { if (!masterSensor || masterSensor.type !== "master") continue;
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;
// If master not already added
if (!masterMap[masterSensor.hardwareId]) {
const enriched = orderMap[masterSensor.hardwareId] || {}; const enriched = orderMap[masterSensor.hardwareId] || {};
if (!masterMap[masterSensor.hardwareId]) { masterMap[masterSensor.hardwareId] = {
masterMap[masterSensor.hardwareId] = { hardwareId: masterSensor.hardwareId,
hardwareId: masterSensor.hardwareId, masterName: enriched.masterName || masterSensor.masterName || "",
masterName: masterSensor.masterName || enriched.masterName || "", location: enriched.location || masterSensor.location || "",
location: masterSensor.location || enriched.location || "", type: "master",
type: "master", connected_status: masterSensor.connected_status,
connected_status: masterSensor.connected_status, gsm_last_check_time: masterSensor.gsm_last_check_time,
gsm_last_check_time: masterSensor.gsm_last_check_time, gsm_last_disconnect_time: masterSensor.gsm_last_disconnect_time,
gsm_last_disconnect_time: masterSensor.gsm_last_disconnect_time, connected_gsm_date: masterSensor.connected_gsm_date,
connected_gsm_date: masterSensor.connected_gsm_date, connected_gsm_time: masterSensor.connected_gsm_time,
connected_gsm_time: masterSensor.connected_gsm_time, connected_lora_date: masterSensor.connected_lora_date,
connected_lora_date: masterSensor.connected_lora_date, connected_lora_time: masterSensor.connected_lora_time,
connected_lora_time: masterSensor.connected_lora_time, support_gsm_last_check_time: masterSensor.support_gsm_last_check_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_slave_count: 0,
connected_slaves: [] 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);
let typeOfWater = ""; const master = masterMap[masterSensor.hardwareId];
if (customerId && slaveSensor.tankhardwareId) { // ✅ Always fetch slaves using connected_to
const tankDetails = await Tank.findOne({ const connectedSlaves = await Insensors.find({
customerId, connected_to: masterSensor.hardwareId,
tankhardwareId: slaveSensor.tankhardwareId type: "slave"
}).lean(); }).lean();
if (tankDetails?.typeOfWater) { for (const slave of connectedSlaves) {
typeOfWater = tankDetails.typeOfWater; // Only include disconnected slaves
} if (slave.connected_status !== "disconnected") continue;
}
master.connected_slaves.push({ master.connected_slaves.push({
hardwareId: slaveSensor.tankhardwareId, hardwareId: slave.tankhardwareId || slave.hardwareId,
tankName: slaveSensor.tankName || "", tankName: slave.tankName || "",
location: slaveSensor.location || "", location: slave.location || "",
connected_status: slaveSensor.connected_status, connected_status: slave.connected_status,
connected_lora_time: slaveSensor.connected_lora_time, connected_lora_time: slave.connected_lora_time,
connected_lora_date: slaveSensor.connected_lora_date, connected_lora_date: slave.connected_lora_date,
lora_last_check_time: slaveSensor.lora_last_check_time, lora_last_check_time: slave.lora_last_check_time,
lora_last_disconnect_time: slaveSensor.lora_last_disconnect_time, lora_last_disconnect_time: slave.lora_last_disconnect_time,
connected_to: slaveSensor.connected_to, connected_to: slave.connected_to,
masterName: master.masterName, masterName: master.masterName,
type: "slave", type: "slave",
typeOfWater, typeOfWater: slave.typeOfWater || "",
tankHeight: slaveSensor.tankHeight, tankHeight: slave.tankHeight,
support_lora_last_check_time: slaveSensor.support_lora_last_check_time 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({ return reply.send({
status_code: 200, status_code: 200,
supportId, supportId,
totalMasters: finalResponse.length, totalMasters: Object.keys(masterMap).length,
disconnectedIssues: finalResponse disconnectedIssues: Object.values(masterMap)
}); });
} catch (error) { } catch (error) {

Loading…
Cancel
Save