|
|
|
@ -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,36 +3639,32 @@ 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 => {
|
|
|
|
|
(order.master_connections || []).forEach(conn => {
|
|
|
|
|
if (conn.hardwareId) {
|
|
|
|
|
orderMap[conn.hardwareId] = {
|
|
|
|
|
masterName: conn.master_name || null,
|
|
|
|
@ -3527,45 +3673,21 @@ exports.getDisconnectedIssuesBySupportId = async (req, reply) => {
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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];
|
|
|
|
|
const masterId = issue.masterHardwareId || issue.hardwareId;
|
|
|
|
|
const masterSensor = sensorMap[masterId];
|
|
|
|
|
if (!masterSensor || masterSensor.type !== "master") continue;
|
|
|
|
|
|
|
|
|
|
const enriched = orderMap[masterSensor.hardwareId] || {};
|
|
|
|
|
// If master not already added
|
|
|
|
|
if (!masterMap[masterSensor.hardwareId]) {
|
|
|
|
|
const enriched = orderMap[masterSensor.hardwareId] || {};
|
|
|
|
|
masterMap[masterSensor.hardwareId] = {
|
|
|
|
|
hardwareId: masterSensor.hardwareId,
|
|
|
|
|
masterName: masterSensor.masterName || enriched.masterName || "",
|
|
|
|
|
location: masterSensor.location || enriched.location || "",
|
|
|
|
|
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,
|
|
|
|
@ -3575,78 +3697,50 @@ exports.getDisconnectedIssuesBySupportId = async (req, reply) => {
|
|
|
|
|
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: []
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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,
|
|
|
|
|
// ✅ Always fetch slaves using connected_to
|
|
|
|
|
const connectedSlaves = 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;
|
|
|
|
|
|
|
|
|
|
assignedSlaves.add(slaveKey);
|
|
|
|
|
|
|
|
|
|
let typeOfWater = "";
|
|
|
|
|
|
|
|
|
|
if (customerId && slaveSensor.tankhardwareId) {
|
|
|
|
|
const tankDetails = await Tank.findOne({
|
|
|
|
|
customerId,
|
|
|
|
|
tankhardwareId: slaveSensor.tankhardwareId
|
|
|
|
|
}).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,
|
|
|
|
|
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,
|
|
|
|
|
tankHeight: slaveSensor.tankHeight,
|
|
|
|
|
support_lora_last_check_time: slaveSensor.support_lora_last_check_time
|
|
|
|
|
typeOfWater: slave.typeOfWater || "",
|
|
|
|
|
tankHeight: slave.tankHeight,
|
|
|
|
|
support_lora_last_check_time: slave.support_lora_last_check_time
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
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) {
|
|
|
|
|