raise a ticket for support

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

@ -2845,185 +2845,6 @@ exports.getIotDataByCustomerAndHardwareId = async (req, reply) => {
//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) => {
// try {
// 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" });
// }
// const sensors = await Insensors.find({ customerId });
// 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 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) {
// return reply.code(404).send({ message: "No IoT data found for this hardwareId." });
// 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 now = moment.tz("Asia/Kolkata");
// const indiaTime = moment.tz(latestMasterRecord.date, "Asia/Kolkata");
// const diffInMinutesMaster = now.diff(indiaTime, "minutes");
// 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 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 connectedSlaves = sensors.filter(
// s => s.connected_to?.trim() === connected_to.trim() && s.type === "slave"
// );
// const formattedSlaves = [];
// const disconnectedSlaves = [];
// const slaveStatusList = [];
// for (const slave of connectedSlaves) {
// const slaveId = slave.hardwareId?.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 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";
// }
// 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);
// if (slaveStatus === "disconnected") {
// disconnectedSlaves.push({
// slaveHardwareId: slave.tankhardwareId,
// slaveName: slave.tankName || "Unknown Slave"
// });
// }
// }
// const issuesToAdd = [];
// if (masterDisconnected.length > 0) {
// const existingGsmIssue = await Support.findOne({
// "issues.hardwareId": connected_to,
// "issues.type": "GSM Disconnected"
// 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
// });
// if (!existingGsmIssue) {
// issuesToAdd.push({
// type: "GSM Disconnected",
// hardwareId: connected_to,
// message: `Master GSM disconnected - ${connected_to}`
// });
// }
// }
// const newHardwareIds = [];
// const newSlaveNames = [];
// const issuesToAdd = [];
// for (const slave of disconnectedSlaves) {
// const existingSlaveIssue = await Support.findOne({
// "issues.hardwareIds": slave.slaveHardwareId,
// "issues.masterHardwareId": connected_to,
// "issues.type": "LoRa Disconnected"
// // ✅ 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 (!existingSlaveIssue) {
// newHardwareIds.push(slave.slaveHardwareId);
// newSlaveNames.push(slave.slaveName);
// 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 (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 },
// { supportId: "AWHYSU64" },
// {
// $push: {
// issues: { $each: issuesToAdd }
// },
// updatedAt: new Date()
// },
// { new: true }
// $push: { issues: { $each: issuesToAdd } },
// $set: { updatedAt: new Date(), lastTicketRaisedAt: moment().tz("Asia/Kolkata").format("YYYY-MM-DD HH:mm:ss") }
// }
// );
// } 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({
// status_code: 200,
// message: "Checked connection and updated support if needed.",
// masterDisconnected,
// disconnectedSlaves,
// connectedSlaves: slaveStatusList
// message: "Checked connection and raised ticket if needed.",
// master: masterDetails,
// connected_slaves: formattedSlaves
// });
// } 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) => {
try {
const { customerId, connected_to, installationId } = req.params;

Loading…
Cancel
Save