|
|
|
@ -2760,16 +2760,18 @@ exports.raiseATicket = async (req, reply) => {
|
|
|
|
|
|
|
|
|
|
if (issuesToAdd.length > 0) {
|
|
|
|
|
const supportRecord = await Support.findOne({ supportId: "AWHYSU64" });
|
|
|
|
|
|
|
|
|
|
if (supportRecord) {
|
|
|
|
|
await Support.findOneAndUpdate(
|
|
|
|
|
{ _id: supportRecord._id },
|
|
|
|
|
{ supportId: "AWHYSU64" },
|
|
|
|
|
{
|
|
|
|
|
$push: { issues: { $each: issuesToAdd } },
|
|
|
|
|
updatedAt: new Date()
|
|
|
|
|
$set: { updatedAt: new Date(), lastTicketRaisedAt: moment().tz("Asia/Kolkata").format("YYYY-MM-DD HH:mm:ss") }
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const masterDetails = {
|
|
|
|
|
hardwareId: connected_to,
|
|
|
|
@ -3044,21 +3046,15 @@ exports.raiseATicketBuildingDetails = async (req, reply) => {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exports.raiseATicketSlave = async (req, reply) => {
|
|
|
|
|
try {
|
|
|
|
|
const { customerId, connected_to, tankHardwareId } = req.params;
|
|
|
|
|
const { customerId, connected_to } = req.params;
|
|
|
|
|
|
|
|
|
|
if (!customerId || !connected_to) {
|
|
|
|
|
return reply.code(400).send({ error: "customerId and connected_to are required" });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const sensors = await Insensors.find({ customerId });
|
|
|
|
|
|
|
|
|
|
if (!sensors.length) {
|
|
|
|
|
return reply.code(404).send({ message: "No sensors found for this customer." });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const masterSensor = sensors.find(s => s.hardwareId?.trim() === connected_to.trim());
|
|
|
|
|
|
|
|
|
|
if (!masterSensor) {
|
|
|
|
@ -3071,121 +3067,385 @@ exports.raiseATicketSlave = async (req, reply) => {
|
|
|
|
|
return reply.code(404).send({ message: "No IoT data found for this hardwareId." });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const now = moment.tz("Asia/Kolkata");
|
|
|
|
|
const now = moment().tz("Asia/Kolkata");
|
|
|
|
|
const masterTime = moment.tz(latestMasterRecord.date, "Asia/Kolkata");
|
|
|
|
|
const masterDiff = now.diff(masterTime, "minutes");
|
|
|
|
|
const diff = now.diff(masterTime, "minutes");
|
|
|
|
|
|
|
|
|
|
const masterDisconnected = masterDiff > 1 ? [{
|
|
|
|
|
const gsm_connected_status = diff <= 1 ? "connected" : "disconnected";
|
|
|
|
|
const gsmStatus = gsm_connected_status === "connected" ? "GSM Connected" : "GSM Disconnected";
|
|
|
|
|
|
|
|
|
|
const formattedTime = masterTime.format("HH:mm:ss");
|
|
|
|
|
const formattedDate = masterTime.format("DD-MM-YYYY");
|
|
|
|
|
|
|
|
|
|
const tanks = (latestMasterRecord.tanks || []).map(tank => {
|
|
|
|
|
const tankTime = moment.tz(tank.date, "Asia/Kolkata");
|
|
|
|
|
const timeDiff = now.diff(tankTime, "minutes");
|
|
|
|
|
|
|
|
|
|
return {
|
|
|
|
|
...tank,
|
|
|
|
|
time: tankTime.format("HH:mm:ss"),
|
|
|
|
|
connected_status: timeDiff <= 1 ? "connected" : "disconnected"
|
|
|
|
|
};
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const responseData = {
|
|
|
|
|
hardwareId: connected_to,
|
|
|
|
|
masterName: masterSensor.tankName || "Unknown Master",
|
|
|
|
|
}] : [];
|
|
|
|
|
gsm_connected_status,
|
|
|
|
|
gsmStatus,
|
|
|
|
|
connected_gsm_date: formattedDate,
|
|
|
|
|
connected_gsm_time: formattedTime,
|
|
|
|
|
gsm_last_check_time: now.format("DD-MM-YYYY HH:mm:ss"),
|
|
|
|
|
tanks,
|
|
|
|
|
date: latestMasterRecord.date,
|
|
|
|
|
time: formattedTime
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
let connectedSlaves = sensors.filter(sensor =>
|
|
|
|
|
sensor.connected_to?.trim() === connected_to.trim() &&
|
|
|
|
|
sensor.type === "slave"
|
|
|
|
|
);
|
|
|
|
|
return reply.send({
|
|
|
|
|
status_code: 200,
|
|
|
|
|
message: "Success",
|
|
|
|
|
data: responseData
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (tankHardwareId) {
|
|
|
|
|
connectedSlaves = connectedSlaves.filter(s => s.hardwareId?.trim() === tankHardwareId.trim());
|
|
|
|
|
}
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error("Error in raiseATicketSlave:", error);
|
|
|
|
|
return reply.code(500).send({ error: "Internal server error" });
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
const disconnectedSlaves = [];
|
|
|
|
|
|
|
|
|
|
for (const slave of connectedSlaves) {
|
|
|
|
|
const slaveId = slave.hardwareId?.trim();
|
|
|
|
|
const matchedTank = latestMasterRecord.tanks.find(tank => tank.tankhardwareId === slaveId);
|
|
|
|
|
|
|
|
|
|
if (matchedTank?.date) {
|
|
|
|
|
const tankTime = moment.tz(matchedTank.date, "Asia/Kolkata");
|
|
|
|
|
const loraDiff = now.diff(tankTime, "minutes");
|
|
|
|
|
|
|
|
|
|
if (loraDiff > 1) {
|
|
|
|
|
disconnectedSlaves.push({
|
|
|
|
|
hardwareId: connected_to,
|
|
|
|
|
slaveHardwareId: slaveId,
|
|
|
|
|
slaveName: slave.tankName || "Unknown Slave"
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const issuesToAdd = [];
|
|
|
|
|
|
|
|
|
|
// Check for existing GSM issue
|
|
|
|
|
if (masterDisconnected.length > 0) {
|
|
|
|
|
const existingGsmIssue = await Support.findOne({
|
|
|
|
|
"issues.hardwareId": connected_to,
|
|
|
|
|
"issues.type": "GSM Disconnected"
|
|
|
|
|
});
|
|
|
|
|
// exports.getDisconnectedIssuesBySupportId = async (req, reply) => {
|
|
|
|
|
// try {
|
|
|
|
|
// const { supportId } = req.params;
|
|
|
|
|
|
|
|
|
|
if (!existingGsmIssue) {
|
|
|
|
|
issuesToAdd.push({
|
|
|
|
|
type: "GSM Disconnected",
|
|
|
|
|
hardwareId: connected_to,
|
|
|
|
|
message: `Master GSM disconnected - ${connected_to}`
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// if (!supportId) {
|
|
|
|
|
// return reply.code(400).send({ error: "supportId is required" });
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// Check for new LoRa issues
|
|
|
|
|
const newSlaveHardwareIds = [];
|
|
|
|
|
const newSlaveNames = [];
|
|
|
|
|
// const supportRecord = await Support.findOne({ supportId }).lean();
|
|
|
|
|
// if (!supportRecord) {
|
|
|
|
|
// return reply.code(404).send({ message: "No support record found for this supportId" });
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
for (const slave of disconnectedSlaves) {
|
|
|
|
|
const existingSlaveIssue = await Support.findOne({
|
|
|
|
|
"issues.hardwareIds": slave.slaveHardwareId,
|
|
|
|
|
"issues.masterHardwareId": connected_to,
|
|
|
|
|
"issues.type": "LoRa Disconnected"
|
|
|
|
|
});
|
|
|
|
|
// const allIssues = supportRecord.issues || [];
|
|
|
|
|
// const hardwareSet = new Set();
|
|
|
|
|
|
|
|
|
|
if (!existingSlaveIssue) {
|
|
|
|
|
newSlaveHardwareIds.push(slave.slaveHardwareId);
|
|
|
|
|
newSlaveNames.push(slave.slaveName);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// // Collect all hardware IDs from issues
|
|
|
|
|
// for (const issue of allIssues) {
|
|
|
|
|
// if (issue.hardwareId) hardwareSet.add(issue.hardwareId); // GSM
|
|
|
|
|
// if (Array.isArray(issue.hardwareIds)) {
|
|
|
|
|
// issue.hardwareIds.forEach(id => hardwareSet.add(id)); // LoRa slaves
|
|
|
|
|
// }
|
|
|
|
|
// if (issue.masterHardwareId) hardwareSet.add(issue.masterHardwareId); // LoRa master
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
if (newSlaveHardwareIds.length > 0) {
|
|
|
|
|
issuesToAdd.push({
|
|
|
|
|
type: "LoRa Disconnected",
|
|
|
|
|
masterHardwareId: connected_to,
|
|
|
|
|
hardwareIds: newSlaveHardwareIds,
|
|
|
|
|
slaveNames: newSlaveNames,
|
|
|
|
|
message: `Slaves LoRa disconnected under master ${connected_to}`
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
// const hardwareIds = [...hardwareSet];
|
|
|
|
|
// const sensors = await Insensors.find({ hardwareId: { $in: hardwareIds } }).lean();
|
|
|
|
|
// console.log("sensors",sensors)
|
|
|
|
|
// // Map sensors by hardwareId
|
|
|
|
|
// const sensorMap = {};
|
|
|
|
|
// for (const sensor of sensors) {
|
|
|
|
|
// sensorMap[sensor.hardwareId] = sensor;
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
if (issuesToAdd.length > 0) {
|
|
|
|
|
const supportRecord = await Support.findOne({ supportId: "AWHYSU64" });
|
|
|
|
|
// const masterMap = {};
|
|
|
|
|
|
|
|
|
|
// for (const issue of allIssues) {
|
|
|
|
|
// // GSM Disconnected
|
|
|
|
|
// if (issue.type === "GSM or LoRa Disconnected" && issue.hardwareId) {
|
|
|
|
|
// const sensor = sensorMap[issue.hardwareId];
|
|
|
|
|
// if (sensor && sensor.type === "master") {
|
|
|
|
|
// masterMap[sensor.hardwareId] = {
|
|
|
|
|
// hardwareId: sensor.hardwareId,
|
|
|
|
|
// masterName: sensor.masterName || null,
|
|
|
|
|
// location: sensor.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 (supportRecord) {
|
|
|
|
|
await Support.findOneAndUpdate(
|
|
|
|
|
{ _id: supportRecord._id },
|
|
|
|
|
{
|
|
|
|
|
$push: {
|
|
|
|
|
issues: { $each: issuesToAdd }
|
|
|
|
|
},
|
|
|
|
|
updatedAt: new Date()
|
|
|
|
|
},
|
|
|
|
|
{ new: true }
|
|
|
|
|
);
|
|
|
|
|
} else {
|
|
|
|
|
console.error("Support record not found for supportId AWHYSU64");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// // LoRa Disconnected
|
|
|
|
|
// if (issue.type === "GSM or LoRa Disconnected" && issue.masterHardwareId) {
|
|
|
|
|
// const masterSensor = sensorMap[issue.masterHardwareId];
|
|
|
|
|
// if (!masterSensor || masterSensor.type !== "master") continue;
|
|
|
|
|
|
|
|
|
|
// if (!masterMap[masterSensor.hardwareId]) {
|
|
|
|
|
// masterMap[masterSensor.hardwareId] = {
|
|
|
|
|
// hardwareId: masterSensor.hardwareId,
|
|
|
|
|
// masterName: masterSensor.masterName || null,
|
|
|
|
|
// 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_lora_last_check_time: masterSensor.support_lora_last_check_time,
|
|
|
|
|
// connected_slave_count: 0,
|
|
|
|
|
// connected_slaves: []
|
|
|
|
|
// };
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
return reply.send({
|
|
|
|
|
status_code: 200,
|
|
|
|
|
message: "Checked connection and updated support if needed.",
|
|
|
|
|
masterDisconnected,
|
|
|
|
|
disconnectedSlaves
|
|
|
|
|
});
|
|
|
|
|
// const master = masterMap[masterSensor.hardwareId];
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error("Error raising ticket (slave):", error);
|
|
|
|
|
return reply.code(500).send({ error: "Internal server error" });
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
// // First try from issue.hardwareIds
|
|
|
|
|
// let slaveIds = Array.isArray(issue.hardwareIds) ? issue.hardwareIds : [];
|
|
|
|
|
|
|
|
|
|
// // If empty, fallback to slaves connected to this master
|
|
|
|
|
// // If empty, fallback to slaves connected to this master's tankHardwareId
|
|
|
|
|
// console.log("slaveIds",slaveIds)
|
|
|
|
|
// if (slaveIds.length === 0) {
|
|
|
|
|
// // fallback: find slaves connected to this master hardwareId
|
|
|
|
|
// const fallbackSlaves = await Insensors.find({
|
|
|
|
|
// connected_to: issue.masterHardwareId, // or masterSensor.hardwareId
|
|
|
|
|
// type: "slave"
|
|
|
|
|
// }).lean();
|
|
|
|
|
|
|
|
|
|
// console.log("fallbackSlaves", fallbackSlaves);
|
|
|
|
|
// for (const slaveSensor of fallbackSlaves) {
|
|
|
|
|
// master.connected_slaves.push({
|
|
|
|
|
// hardwareId: 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: slaveSensor.typeOfWater,
|
|
|
|
|
// tankHeight: slaveSensor.tankHeight,
|
|
|
|
|
// support_lora_last_check_time: slaveSensor.support_lora_last_check_time,
|
|
|
|
|
// });
|
|
|
|
|
// master.connected_slave_count++;
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// else {
|
|
|
|
|
// // Populate slaves based on provided hardwareIds
|
|
|
|
|
// for (const slaveId of slaveIds) {
|
|
|
|
|
// const slaveSensor = sensorMap[slaveId];
|
|
|
|
|
// if (slaveSensor && slaveSensor.type === "slave") {
|
|
|
|
|
// master.connected_slaves.push({
|
|
|
|
|
// hardwareId: 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: slaveSensor.typeOfWater,
|
|
|
|
|
// tankHeight: slaveSensor.tankHeight,
|
|
|
|
|
// support_lora_last_check_time: slaveSensor.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
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
// } 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 || [];
|
|
|
|
|
// const hardwareSet = new Set();
|
|
|
|
|
|
|
|
|
|
// // Collect all hardware IDs and tankHardwareIds from issues
|
|
|
|
|
// for (const issue of allIssues) {
|
|
|
|
|
// if (issue.hardwareId) hardwareSet.add(issue.hardwareId); // GSM
|
|
|
|
|
// if (Array.isArray(issue.hardwareIds)) {
|
|
|
|
|
// issue.hardwareIds.forEach(id => hardwareSet.add(id)); // LoRa slaves
|
|
|
|
|
// }
|
|
|
|
|
// if (issue.masterHardwareId) hardwareSet.add(issue.masterHardwareId); // LoRa master
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// const hardwareIds = [...hardwareSet];
|
|
|
|
|
// const sensors = await Insensors.find({
|
|
|
|
|
// $or: [
|
|
|
|
|
// { hardwareId: { $in: hardwareIds } },
|
|
|
|
|
// { tankHardwareId: { $in: hardwareIds } }
|
|
|
|
|
// ]
|
|
|
|
|
// }).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
|
|
|
|
|
// };
|
|
|
|
|
// }
|
|
|
|
|
// });
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
// // Map sensors by both hardwareId and tankHardwareId
|
|
|
|
|
// const sensorMap = {};
|
|
|
|
|
// for (const sensor of sensors) {
|
|
|
|
|
// if (sensor.hardwareId) sensorMap[sensor.hardwareId] = sensor;
|
|
|
|
|
// if (sensor.tankHardwareId) sensorMap[sensor.tankHardwareId] = sensor;
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// const masterMap = {};
|
|
|
|
|
|
|
|
|
|
// for (const issue of allIssues) {
|
|
|
|
|
// // GSM Disconnected
|
|
|
|
|
// 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: enriched.masterName || sensor.masterName || null,
|
|
|
|
|
// location: enriched.location || sensor.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: []
|
|
|
|
|
// };
|
|
|
|
|
// }
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// // LoRa Disconnected
|
|
|
|
|
// if (issue.type === "GSM or LoRa Disconnected" && issue.masterHardwareId) {
|
|
|
|
|
// const masterSensor = sensorMap[issue.masterHardwareId];
|
|
|
|
|
// if (!masterSensor || masterSensor.type !== "master") continue;
|
|
|
|
|
|
|
|
|
|
// if (!masterMap[masterSensor.hardwareId]) {
|
|
|
|
|
// masterMap[masterSensor.hardwareId] = {
|
|
|
|
|
// hardwareId: masterSensor.hardwareId,
|
|
|
|
|
// masterName: masterSensor.masterName || null,
|
|
|
|
|
// 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_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 : [];
|
|
|
|
|
// console.log("slaveIds",slaveIds)
|
|
|
|
|
// let fallbackSlaves = [];
|
|
|
|
|
|
|
|
|
|
// if (slaveIds.length > 0) {
|
|
|
|
|
// // Try to fetch slaves by hardwareId or tankHardwareId
|
|
|
|
|
// fallbackSlaves = await Insensors.find({
|
|
|
|
|
// $or: [
|
|
|
|
|
// { hardwareId: { $in: slaveIds } },
|
|
|
|
|
// { tankhardwareId: { $in: slaveIds } }
|
|
|
|
|
// ],
|
|
|
|
|
// type: "slave"
|
|
|
|
|
// }).lean();
|
|
|
|
|
// } else {
|
|
|
|
|
// // Fallback: find by connected_to field
|
|
|
|
|
// fallbackSlaves = await Insensors.find({
|
|
|
|
|
// connected_to: issue.masterHardwareId,
|
|
|
|
|
// type: "slave"
|
|
|
|
|
// }).lean();
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// for (const slaveSensor of fallbackSlaves) {
|
|
|
|
|
// master.connected_slaves.push({
|
|
|
|
|
// hardwareId: 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: slaveSensor.typeOfWater,
|
|
|
|
|
// tankHeight: slaveSensor.tankHeight,
|
|
|
|
|
// support_lora_last_check_time: slaveSensor.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
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
// } catch (error) {
|
|
|
|
|
// console.error("Error fetching disconnected issues:", error);
|
|
|
|
|
// return reply.code(500).send({ error: "Internal server error" });
|
|
|
|
|
// }
|
|
|
|
|
// };
|
|
|
|
|
|
|
|
|
|
exports.getDisconnectedIssuesBySupportId = async (req, reply) => {
|
|
|
|
|
try {
|
|
|
|
@ -3203,7 +3463,7 @@ exports.getDisconnectedIssuesBySupportId = async (req, reply) => {
|
|
|
|
|
const allIssues = supportRecord.issues || [];
|
|
|
|
|
const hardwareSet = new Set();
|
|
|
|
|
|
|
|
|
|
// Collect all hardware IDs from issues
|
|
|
|
|
// Collect all hardware IDs and tankHardwareIds from issues
|
|
|
|
|
for (const issue of allIssues) {
|
|
|
|
|
if (issue.hardwareId) hardwareSet.add(issue.hardwareId); // GSM
|
|
|
|
|
if (Array.isArray(issue.hardwareIds)) {
|
|
|
|
@ -3213,25 +3473,51 @@ exports.getDisconnectedIssuesBySupportId = async (req, reply) => {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const hardwareIds = [...hardwareSet];
|
|
|
|
|
const sensors = await Insensors.find({ hardwareId: { $in: hardwareIds } }).lean();
|
|
|
|
|
|
|
|
|
|
// Map sensors by hardwareId
|
|
|
|
|
const sensors = await Insensors.find({
|
|
|
|
|
$or: [
|
|
|
|
|
{ hardwareId: { $in: hardwareIds } },
|
|
|
|
|
{ tankHardwareId: { $in: hardwareIds } }
|
|
|
|
|
]
|
|
|
|
|
}).lean();
|
|
|
|
|
|
|
|
|
|
// Map sensors by both hardwareId and tankHardwareId
|
|
|
|
|
const sensorMap = {};
|
|
|
|
|
for (const sensor of sensors) {
|
|
|
|
|
sensorMap[sensor.hardwareId] = sensor;
|
|
|
|
|
if (sensor.hardwareId) sensorMap[sensor.hardwareId] = sensor;
|
|
|
|
|
if (sensor.tankHardwareId) sensorMap[sensor.tankHardwareId] = sensor;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Fetch Orders using customerId and build a map
|
|
|
|
|
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
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const masterMap = {};
|
|
|
|
|
|
|
|
|
|
for (const issue of allIssues) {
|
|
|
|
|
// GSM Disconnected
|
|
|
|
|
if (issue.type === "GSM Disconnected" && issue.hardwareId) {
|
|
|
|
|
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 || null,
|
|
|
|
|
location: sensor.location || "",
|
|
|
|
|
masterName: enriched.masterName || sensor.masterName || null,
|
|
|
|
|
location: enriched.location || sensor.location || "",
|
|
|
|
|
type: "master",
|
|
|
|
|
connected_status: sensor.connected_status,
|
|
|
|
|
gsm_last_check_time: sensor.gsm_last_check_time,
|
|
|
|
@ -3248,15 +3534,16 @@ exports.getDisconnectedIssuesBySupportId = async (req, reply) => {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// LoRa Disconnected
|
|
|
|
|
if (issue.type === "LoRa Disconnected" && issue.masterHardwareId) {
|
|
|
|
|
if (issue.type === "GSM or LoRa Disconnected" && issue.masterHardwareId) {
|
|
|
|
|
const masterSensor = sensorMap[issue.masterHardwareId];
|
|
|
|
|
if (!masterSensor || masterSensor.type !== "master") continue;
|
|
|
|
|
|
|
|
|
|
if (!masterMap[masterSensor.hardwareId]) {
|
|
|
|
|
const enriched = orderMap[masterSensor.hardwareId] || {};
|
|
|
|
|
masterMap[masterSensor.hardwareId] = {
|
|
|
|
|
hardwareId: masterSensor.hardwareId,
|
|
|
|
|
masterName: masterSensor.masterName || null,
|
|
|
|
|
location: masterSensor.location || "",
|
|
|
|
|
masterName: enriched.masterName || masterSensor.masterName || null,
|
|
|
|
|
location: enriched.location || masterSensor.location || "",
|
|
|
|
|
type: "master",
|
|
|
|
|
connected_status: masterSensor.connected_status,
|
|
|
|
|
gsm_last_check_time: masterSensor.gsm_last_check_time,
|
|
|
|
@ -3272,56 +3559,42 @@ exports.getDisconnectedIssuesBySupportId = async (req, reply) => {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const master = masterMap[masterSensor.hardwareId];
|
|
|
|
|
|
|
|
|
|
// First try from issue.hardwareIds
|
|
|
|
|
let slaveIds = Array.isArray(issue.hardwareIds) ? issue.hardwareIds : [];
|
|
|
|
|
|
|
|
|
|
// If empty, fallback to slaves connected to this master
|
|
|
|
|
if (slaveIds.length === 0) {
|
|
|
|
|
const fallbackSlaves = await Insensors.find({ connected_to: masterSensor.hardwareId, type: "slave" }).lean();
|
|
|
|
|
for (const slaveSensor of fallbackSlaves) {
|
|
|
|
|
master.connected_slaves.push({
|
|
|
|
|
hardwareId: 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: slaveSensor.typeOfWater,
|
|
|
|
|
tankHeight: slaveSensor.tankHeight,
|
|
|
|
|
support_lora_last_check_time: slaveSensor.support_lora_last_check_time,
|
|
|
|
|
});
|
|
|
|
|
master.connected_slave_count++;
|
|
|
|
|
}
|
|
|
|
|
let fallbackSlaves = [];
|
|
|
|
|
|
|
|
|
|
if (slaveIds.length > 0) {
|
|
|
|
|
fallbackSlaves = await Insensors.find({
|
|
|
|
|
$or: [
|
|
|
|
|
{ hardwareId: { $in: slaveIds } },
|
|
|
|
|
{ tankhardwareId: { $in: slaveIds } }
|
|
|
|
|
],
|
|
|
|
|
type: "slave"
|
|
|
|
|
}).lean();
|
|
|
|
|
} else {
|
|
|
|
|
// Populate slaves based on provided hardwareIds
|
|
|
|
|
for (const slaveId of slaveIds) {
|
|
|
|
|
const slaveSensor = sensorMap[slaveId];
|
|
|
|
|
if (slaveSensor && slaveSensor.type === "slave") {
|
|
|
|
|
master.connected_slaves.push({
|
|
|
|
|
hardwareId: 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: slaveSensor.typeOfWater,
|
|
|
|
|
tankHeight: slaveSensor.tankHeight,
|
|
|
|
|
support_lora_last_check_time: slaveSensor.support_lora_last_check_time,
|
|
|
|
|
});
|
|
|
|
|
master.connected_slave_count++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
fallbackSlaves = await Insensors.find({
|
|
|
|
|
connected_to: issue.masterHardwareId,
|
|
|
|
|
type: "slave"
|
|
|
|
|
}).lean();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (const slaveSensor of fallbackSlaves) {
|
|
|
|
|
master.connected_slaves.push({
|
|
|
|
|
hardwareId: 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: slaveSensor.typeOfWater,
|
|
|
|
|
tankHeight: slaveSensor.tankHeight,
|
|
|
|
|
support_lora_last_check_time: slaveSensor.support_lora_last_check_time,
|
|
|
|
|
});
|
|
|
|
|
master.connected_slave_count++;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|