raise a ticket for support

master^2
Bhaskar 5 months ago
parent 3993e623d8
commit 41406d2090

@ -2845,185 +2845,6 @@ exports.getIotDataByCustomerAndHardwareId = async (req, reply) => {
//const moment = require("moment-timezone"); //const moment = require("moment-timezone");
exports.raiseATicket = async (req, reply) => {
try {
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 }).lean();
const orders = await Order.find({ customerId }).lean();
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() && s.type === "master");
if (!masterSensor) {
return reply.code(404).send({ message: "Master hardwareId not found." });
}
const orderMap = {};
orders.forEach(order => {
order.master_connections.forEach(conn => {
orderMap[conn.hardwareId] = {
masterName: conn.master_name || null,
location: conn.location || null
};
});
});
const now = moment.tz("Asia/Kolkata");
function getDisconnectDuration(timeStr) {
if (!timeStr) return null;
const time = moment.tz(timeStr, "DD-MM-YYYY HH:mm:ss", "Asia/Kolkata");
return time.isValid() ? now.diff(time, "minutes") : null;
}
const latestMasterRecord = await IotData.findOne({ hardwareId: connected_to }).sort({ date: -1 }).lean();
let masterConnectedStatus = "disconnected";
let lastDataTime = "No data";
let diffInMinutes = null;
if (latestMasterRecord?.date) {
const indiaTime = moment.tz(latestMasterRecord.date, "Asia/Kolkata");
diffInMinutes = now.diff(indiaTime, "minutes");
lastDataTime = indiaTime.format("DD-MM-YYYY HH:mm:ss");
if (diffInMinutes <= 1) masterConnectedStatus = "connected";
}
const connectedSlaves = sensors.filter(
s => s.connected_to?.trim() === connected_to.trim() && s.type === "slave"
);
const formattedSlaves = [];
const disconnectedSlaves = [];
for (const slave of connectedSlaves) {
const slaveData = latestMasterRecord?.tanks.find(t => t.tankhardwareId === slave.tankhardwareId);
let slaveStatus = "disconnected";
let lastSlaveDataTime = "No data";
let slaveDiff = null;
if (slaveData?.date) {
const slaveTime = moment.tz(slaveData.date, "Asia/Kolkata");
slaveDiff = now.diff(slaveTime, "minutes");
lastSlaveDataTime = slaveTime.format("DD-MM-YYYY HH:mm:ss");
if (slaveDiff <= 1) slaveStatus = "connected";
}
if (slaveStatus === "disconnected") {
disconnectedSlaves.push({
slaveHardwareId: slave.tankhardwareId,
slaveName: slave.tankName || "Unknown Slave"
});
}
formattedSlaves.push({
hardwareId: slave.hardwareId,
slaveName: slave.tankName || null,
location: slave.tankLocation || null,
type: "slave",
connected_status: slaveStatus,
last_data_time: lastSlaveDataTime,
diff_in_minutes: slaveDiff
});
}
const issuesToAdd = [];
// ✅ Only raise a ticket if master is disconnected
// if (masterConnectedStatus === "disconnected") {
// const existingMasterTicket = await Support.findOne({
// "issues.hardwareId": connected_to,
// "issues.type": "GSM or LoRa Disconnected"
// });
// if (!existingMasterTicket) {
// const slaveHardwareIds = disconnectedSlaves.map(s => s.slaveHardwareId);
// const slaveNames = disconnectedSlaves.map(s => s.slaveName);
// issuesToAdd.push({
// type: "GSM or LoRa Disconnected",
// masterHardwareId: connected_to,
// hardwareId: connected_to, // Master hardwareId
// hardwareIds: slaveHardwareIds, // Slave tankHardwareIds
// slaveNames,
// message: `Master ${connected_to} is disconnected along with ${slaveHardwareIds.length} slave(s)`
// });
// }
// }
if (masterConnectedStatus === "disconnected") {
const existingMasterTicket = await Support.findOne({
"issues.hardwareId": connected_to,
"issues.type": "GSM or LoRa Disconnected"
});
if (!existingMasterTicket) {
const slaveHardwareIds = disconnectedSlaves.map(s => s.slaveHardwareId);
const slaveNames = disconnectedSlaves.map(s => s.slaveName);
// Check if disconnection is at least 15 minutes old
if (diffInMinutes >= 15) {
issuesToAdd.push({
type: "GSM or LoRa Disconnected",
masterHardwareId: connected_to,
hardwareId: connected_to,
hardwareIds: slaveHardwareIds,
slaveNames,
message: `Master ${connected_to} is disconnected along with ${slaveHardwareIds.length} slave(s)`,
disconnectedAt: lastDataTime // optional: for future tracking
});
}
}
}
if (issuesToAdd.length > 0) {
const supportRecord = await Support.findOne({ supportId: "AWHYSU64" });
if (supportRecord) {
await Support.findOneAndUpdate(
{ supportId: "AWHYSU64" },
{
$push: { issues: { $each: issuesToAdd } },
$set: { updatedAt: new Date(), lastTicketRaisedAt: moment().tz("Asia/Kolkata").format("YYYY-MM-DD HH:mm:ss") }
}
);
}
}
const masterDetails = {
hardwareId: connected_to,
masterName: masterSensor.masterName || orderMap[connected_to]?.masterName || null,
location: masterSensor.location || orderMap[connected_to]?.location || null,
type: "master",
connected_status: masterConnectedStatus,
last_data_time: lastDataTime,
diff_in_minutes: diffInMinutes
};
return reply.send({
status_code: 200,
message: "Checked connection and raised ticket if needed.",
master: masterDetails,
connected_slaves: formattedSlaves
});
} catch (error) {
console.error("Error raising ticket:", error);
return reply.code(500).send({ error: "Internal server error" });
}
};
// exports.raiseATicket = async (req, reply) => { // exports.raiseATicket = async (req, reply) => {
// try { // try {
// const { customerId, connected_to } = req.params; // const { customerId, connected_to } = req.params;
@ -3032,142 +2853,166 @@ exports.raiseATicket = async (req, reply) => {
// return reply.code(400).send({ error: "customerId and connected_to are required" }); // return reply.code(400).send({ error: "customerId and connected_to are required" });
// } // }
// const sensors = await Insensors.find({ customerId }); // const sensors = await Insensors.find({ customerId }).lean();
// const orders = await Order.find({ customerId }).lean();
// if (!sensors.length) { // if (!sensors.length) {
// return reply.code(404).send({ message: "No sensors found for this customer." }); // return reply.code(404).send({ message: "No sensors found for this customer." });
// } // }
// const masterSensor = sensors.find(s => s.hardwareId?.trim() === connected_to.trim() && s.type === "master"); // const masterSensor = sensors.find(s => s.hardwareId?.trim() === connected_to.trim() && s.type === "master");
// if (!masterSensor) { // if (!masterSensor) {
// return reply.code(404).send({ message: "Master hardwareId not found." }); // return reply.code(404).send({ message: "Master hardwareId not found." });
// } // }
// const latestMasterRecord = await IotData.findOne({ hardwareId: connected_to }).sort({ date: -1 }).lean(); // const orderMap = {};
// orders.forEach(order => {
// order.master_connections.forEach(conn => {
// orderMap[conn.hardwareId] = {
// masterName: conn.master_name || null,
// location: conn.location || null
// };
// });
// });
// const now = moment.tz("Asia/Kolkata");
// if (!latestMasterRecord) { // function getDisconnectDuration(timeStr) {
// return reply.code(404).send({ message: "No IoT data found for this hardwareId." }); // if (!timeStr) return null;
// const time = moment.tz(timeStr, "DD-MM-YYYY HH:mm:ss", "Asia/Kolkata");
// return time.isValid() ? now.diff(time, "minutes") : null;
// } // }
// const now = moment.tz("Asia/Kolkata"); // const latestMasterRecord = await IotData.findOne({ hardwareId: connected_to }).sort({ date: -1 }).lean();
// let masterConnectedStatus = "disconnected";
// let lastDataTime = "No data";
// let diffInMinutes = null;
// if (latestMasterRecord?.date) {
// const indiaTime = moment.tz(latestMasterRecord.date, "Asia/Kolkata"); // const indiaTime = moment.tz(latestMasterRecord.date, "Asia/Kolkata");
// const diffInMinutesMaster = now.diff(indiaTime, "minutes"); // diffInMinutes = now.diff(indiaTime, "minutes");
// lastDataTime = indiaTime.format("DD-MM-YYYY HH:mm:ss");
// if (diffInMinutes <= 1) masterConnectedStatus = "connected";
// }
// const masterDisconnected = diffInMinutesMaster > 1 ? [{ // const connectedSlaves = sensors.filter(
// hardwareId: connected_to, // s => s.connected_to?.trim() === connected_to.trim() && s.type === "slave"
// masterName: masterSensor.tankName || "Unknown Master",
// connected_status: "disconnected",
// last_seen_minutes_ago: diffInMinutesMaster
// }] : [];
// const connectedSlaves = sensors.filter(sensor =>
// sensor.connected_to?.trim() === connected_to.trim() &&
// sensor.type === "slave"
// ); // );
// const formattedSlaves = [];
// const disconnectedSlaves = []; // const disconnectedSlaves = [];
// const slaveStatusList = [];
// for (const slave of connectedSlaves) { // for (const slave of connectedSlaves) {
// const slaveId = slave.hardwareId?.trim(); // const slaveData = latestMasterRecord?.tanks.find(t => t.tankhardwareId === slave.tankhardwareId);
// const matchedTank = latestMasterRecord.tanks.find(tank => tank.tankhardwareId === slaveId); // let slaveStatus = "disconnected";
// let lastSlaveDataTime = "No data";
// let isDisconnected = true; // let slaveDiff = null;
// let loraDiffInMinutes = null;
// if (slaveData?.date) {
// if (matchedTank && matchedTank.date) { // const slaveTime = moment.tz(slaveData.date, "Asia/Kolkata");
// const tankTime = moment.tz(matchedTank.date, "Asia/Kolkata"); // slaveDiff = now.diff(slaveTime, "minutes");
// loraDiffInMinutes = now.diff(tankTime, "minutes"); // lastSlaveDataTime = slaveTime.format("DD-MM-YYYY HH:mm:ss");
// if (slaveDiff <= 1) slaveStatus = "connected";
// if (loraDiffInMinutes <= 1) { // }
// isDisconnected = false;
// } // if (slaveStatus === "disconnected") {
// disconnectedSlaves.push({
// slaveHardwareId: slave.tankhardwareId,
// slaveName: slave.tankName || "Unknown Slave"
// });
// } // }
// const slaveInfo = { // formattedSlaves.push({
// hardwareId: connected_to, // hardwareId: slave.hardwareId,
// slaveHardwareId: slaveId, // slaveName: slave.tankName || null,
// slaveName: slave.tankName || "Unknown Slave", // location: slave.tankLocation || null,
// connected_status: isDisconnected ? "disconnected" : "connected", // type: "slave",
// last_seen_minutes_ago: loraDiffInMinutes // connected_status: slaveStatus,
// }; // last_data_time: lastSlaveDataTime,
// diff_in_minutes: slaveDiff
// slaveStatusList.push(slaveInfo); // });
// if (isDisconnected) {
// disconnectedSlaves.push(slaveInfo);
// }
// } // }
// const issuesToAdd = []; // const issuesToAdd = [];
// if (masterDisconnected.length > 0) { // // ✅ Only raise a ticket if master is disconnected
// const existingGsmIssue = await Support.findOne({ // // if (masterConnectedStatus === "disconnected") {
// // const existingMasterTicket = await Support.findOne({
// // "issues.hardwareId": connected_to,
// // "issues.type": "GSM or LoRa Disconnected"
// // });
// // if (!existingMasterTicket) {
// // const slaveHardwareIds = disconnectedSlaves.map(s => s.slaveHardwareId);
// // const slaveNames = disconnectedSlaves.map(s => s.slaveName);
// // issuesToAdd.push({
// // type: "GSM or LoRa Disconnected",
// // masterHardwareId: connected_to,
// // hardwareId: connected_to, // Master hardwareId
// // hardwareIds: slaveHardwareIds, // Slave tankHardwareIds
// // slaveNames,
// // message: `Master ${connected_to} is disconnected along with ${slaveHardwareIds.length} slave(s)`
// // });
// // }
// // }
// if (masterConnectedStatus === "disconnected") {
// const existingMasterTicket = await Support.findOne({
// "issues.hardwareId": connected_to, // "issues.hardwareId": connected_to,
// "issues.type": "GSM Disconnected" // "issues.type": "GSM or LoRa Disconnected"
// }); // });
// if (!existingGsmIssue) { // if (!existingMasterTicket) {
// const slaveHardwareIds = disconnectedSlaves.map(s => s.slaveHardwareId);
// const slaveNames = disconnectedSlaves.map(s => s.slaveName);
// // Check if disconnection is at least 15 minutes old
// if (diffInMinutes >= 15) {
// issuesToAdd.push({ // issuesToAdd.push({
// type: "GSM Disconnected", // type: "GSM or LoRa Disconnected",
// masterHardwareId: connected_to,
// hardwareId: connected_to, // hardwareId: connected_to,
// message: `Master GSM disconnected - ${connected_to}` // hardwareIds: slaveHardwareIds,
// slaveNames,
// message: `Master ${connected_to} is disconnected along with ${slaveHardwareIds.length} slave(s)`,
// disconnectedAt: lastDataTime // optional: for future tracking
// }); // });
// } // }
// } // }
// const newHardwareIds = [];
// const newSlaveNames = [];
// for (const slave of disconnectedSlaves) {
// const existingSlaveIssue = await Support.findOne({
// "issues.hardwareIds": slave.slaveHardwareId,
// "issues.masterHardwareId": connected_to,
// "issues.type": "LoRa Disconnected"
// });
// if (!existingSlaveIssue) {
// newHardwareIds.push(slave.slaveHardwareId);
// newSlaveNames.push(slave.slaveName);
// }
// } // }
// if (newHardwareIds.length > 0) {
// issuesToAdd.push({
// type: "LoRa Disconnected",
// masterHardwareId: connected_to,
// hardwareIds: newHardwareIds,
// slaveNames: newSlaveNames,
// message: `Slaves LoRa disconnected under master ${connected_to}`
// });
// }
// if (issuesToAdd.length > 0) { // if (issuesToAdd.length > 0) {
// const supportRecord = await Support.findOne({ supportId: "AWHYSU64" }); // const supportRecord = await Support.findOne({ supportId: "AWHYSU64" });
// if (supportRecord) { // if (supportRecord) {
// await Support.findOneAndUpdate( // await Support.findOneAndUpdate(
// { _id: supportRecord._id }, // { supportId: "AWHYSU64" },
// { // {
// $push: { // $push: { issues: { $each: issuesToAdd } },
// issues: { $each: issuesToAdd } // $set: { updatedAt: new Date(), lastTicketRaisedAt: moment().tz("Asia/Kolkata").format("YYYY-MM-DD HH:mm:ss") }
// }, // }
// updatedAt: new Date()
// },
// { new: true }
// ); // );
// } else {
// console.error("Support record not found for supportId AWHYSU64");
// } // }
// } // }
// const masterDetails = {
// hardwareId: connected_to,
// masterName: masterSensor.masterName || orderMap[connected_to]?.masterName || null,
// location: masterSensor.location || orderMap[connected_to]?.location || null,
// type: "master",
// connected_status: masterConnectedStatus,
// last_data_time: lastDataTime,
// diff_in_minutes: diffInMinutes
// };
// return reply.send({ // return reply.send({
// status_code: 200, // status_code: 200,
// message: "Checked connection and updated support if needed.", // message: "Checked connection and raised ticket if needed.",
// masterDisconnected, // master: masterDetails,
// disconnectedSlaves, // connected_slaves: formattedSlaves
// connectedSlaves: slaveStatusList
// }); // });
// } catch (error) { // } catch (error) {
@ -3178,6 +3023,161 @@ exports.raiseATicket = async (req, reply) => {
exports.raiseATicket = async (req, reply) => {
try {
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() && s.type === "master");
if (!masterSensor) {
return reply.code(404).send({ message: "Master hardwareId not found." });
}
const latestMasterRecord = await IotData.findOne({ hardwareId: connected_to }).sort({ date: -1 }).lean();
if (!latestMasterRecord) {
return reply.code(404).send({ message: "No IoT data found for this hardwareId." });
}
const now = moment.tz("Asia/Kolkata");
const indiaTime = moment.tz(latestMasterRecord.date, "Asia/Kolkata");
const diffInMinutesMaster = now.diff(indiaTime, "minutes");
const masterDisconnected = diffInMinutesMaster > 1 ? [{
hardwareId: connected_to,
masterName: masterSensor.tankName || "Unknown Master",
connected_status: "disconnected",
last_seen_minutes_ago: diffInMinutesMaster
}] : [];
const connectedSlaves = sensors.filter(sensor =>
sensor.connected_to?.trim() === connected_to.trim() &&
sensor.type === "slave"
);
const disconnectedSlaves = [];
const slaveStatusList = [];
for (const slave of connectedSlaves) {
const slaveId = slave.tankhardwareId?.trim();
const matchedTank = latestMasterRecord.tanks.find(tank => tank.tankhardwareId === slaveId);
let isDisconnected = true;
let loraDiffInMinutes = null;
if (matchedTank && matchedTank.date) {
const tankTime = moment.tz(matchedTank.date, "Asia/Kolkata");
loraDiffInMinutes = now.diff(tankTime, "minutes");
if (loraDiffInMinutes <= 1) {
isDisconnected = false;
}
}
const slaveInfo = {
hardwareId: connected_to,
slaveHardwareId: slaveId,
slaveName: slave.tankName || "Unknown Slave",
connected_status: isDisconnected ? "disconnected" : "connected",
last_seen_minutes_ago: loraDiffInMinutes
};
slaveStatusList.push(slaveInfo);
if (isDisconnected) {
disconnectedSlaves.push(slaveInfo);
}
}
const issuesToAdd = [];
if (masterDisconnected.length > 0) {
const existingGsmIssue = await Support.findOne({
"issues.hardwareId": connected_to,
"issues.type": "GSM Disconnected"
});
if (!existingGsmIssue) {
issuesToAdd.push({
type: "GSM Disconnected",
hardwareId: connected_to,
message: `Master GSM disconnected - ${connected_to}`
});
}
}
const newHardwareIds = [];
const newSlaveNames = [];
for (const slave of disconnectedSlaves) {
const existingSlaveIssue = await Support.findOne({
"issues.hardwareIds": slave.slaveHardwareId,
"issues.masterHardwareId": connected_to,
"issues.type": "LoRa Disconnected"
});
if (!existingSlaveIssue) {
newHardwareIds.push(slave.slaveHardwareId);
newSlaveNames.push(slave.slaveName);
}
}
if (newHardwareIds.length > 0) {
issuesToAdd.push({
type: "LoRa Disconnected",
masterHardwareId: connected_to,
hardwareIds: newHardwareIds,
slaveNames: newSlaveNames,
message: `Slaves LoRa disconnected under master ${connected_to}`
});
}
if (issuesToAdd.length > 0) {
const supportRecord = await Support.findOne({ supportId: "AWHYSU64" });
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");
}
}
return reply.send({
status_code: 200,
message: "Checked connection and updated support if needed.",
masterDisconnected,
disconnectedSlaves,
connectedSlaves: slaveStatusList
});
} catch (error) {
console.error("Error raising ticket:", error);
return reply.code(500).send({ error: "Internal server error" });
}
};
exports.raiseATicketBuildingDetails = async (req, reply) => { exports.raiseATicketBuildingDetails = async (req, reply) => {
try { try {
const { customerId, connected_to, installationId } = req.params; const { customerId, connected_to, installationId } = req.params;

Loading…
Cancel
Save