|
|
|
@ -3867,8 +3867,10 @@ const raiseATicketLikeLogic = async (customerId, connected_to) => {
|
|
|
|
|
const orders = await Order.find({ customerId }).lean();
|
|
|
|
|
if (!sensors.length) return;
|
|
|
|
|
|
|
|
|
|
const normalizedConnectedTo = connected_to.trim().toLowerCase();
|
|
|
|
|
|
|
|
|
|
const masterSensor = sensors.find(
|
|
|
|
|
s => s.hardwareId?.trim() === connected_to.trim() && s.type === "master"
|
|
|
|
|
s => s.hardwareId?.trim().toLowerCase() === normalizedConnectedTo && s.type === "master"
|
|
|
|
|
);
|
|
|
|
|
if (!masterSensor) return;
|
|
|
|
|
|
|
|
|
@ -3885,23 +3887,23 @@ const raiseATicketLikeLogic = async (customerId, connected_to) => {
|
|
|
|
|
const now = moment.tz("Asia/Kolkata");
|
|
|
|
|
|
|
|
|
|
const masterConnectedStatus = masterSensor.connected_status || "disconnected";
|
|
|
|
|
const lastDataTime = masterSensor.connected_gsm_date && masterSensor.connected_gsm_time
|
|
|
|
|
const lastDataTime =
|
|
|
|
|
masterSensor.connected_gsm_date && masterSensor.connected_gsm_time
|
|
|
|
|
? `${masterSensor.connected_gsm_date} ${masterSensor.connected_gsm_time}`
|
|
|
|
|
: "No data";
|
|
|
|
|
|
|
|
|
|
// Get all slaves connected to this master
|
|
|
|
|
const connectedSlaves = sensors.filter(
|
|
|
|
|
s => s.connected_to?.trim() === connected_to.trim() && s.type === "slave"
|
|
|
|
|
s => s.connected_to?.trim().toLowerCase() === normalizedConnectedTo && s.type === "slave"
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
const disconnectedSlaves = connectedSlaves.filter(
|
|
|
|
|
s => s.connected_status === "disconnected"
|
|
|
|
|
).map(s => ({
|
|
|
|
|
slaveHardwareId: s.tankhardwareId,
|
|
|
|
|
const disconnectedSlaves = connectedSlaves
|
|
|
|
|
.filter(s => s.connected_status === "disconnected")
|
|
|
|
|
.map(s => ({
|
|
|
|
|
slaveHardwareId: s.tankhardwareId?.trim().toLowerCase(),
|
|
|
|
|
slaveName: s.tankName || "Unknown Slave"
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
// No ticket needed if everything is connected
|
|
|
|
|
if (disconnectedSlaves.length === 0 && masterConnectedStatus === "connected") return;
|
|
|
|
|
|
|
|
|
|
const supportRecord = await Support.findOne({ supportId: "AWHYSU64" });
|
|
|
|
@ -3911,42 +3913,47 @@ const raiseATicketLikeLogic = async (customerId, connected_to) => {
|
|
|
|
|
|
|
|
|
|
const unresolvedMasterIssue = existingIssues.find(
|
|
|
|
|
issue =>
|
|
|
|
|
issue.hardwareId === connected_to &&
|
|
|
|
|
issue.hardwareId?.trim().toLowerCase() === normalizedConnectedTo &&
|
|
|
|
|
issue.type === "GSM or LoRa Disconnected" &&
|
|
|
|
|
issue.resolved === false
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// Skip raising a ticket if unresolved issue already exists
|
|
|
|
|
if (unresolvedMasterIssue) return;
|
|
|
|
|
|
|
|
|
|
const resolvedMasterIssue = existingIssues.find(
|
|
|
|
|
issue =>
|
|
|
|
|
issue.hardwareId === connected_to &&
|
|
|
|
|
issue.type === "GSM or LoRa Disconnected" &&
|
|
|
|
|
issue.resolved === true
|
|
|
|
|
);
|
|
|
|
|
// Check both unresolved and resolved issues for previously reported slaves
|
|
|
|
|
const allSlaveHardwareIdsAlreadyReported = new Set();
|
|
|
|
|
existingIssues
|
|
|
|
|
.filter(issue => issue.hardwareId?.trim().toLowerCase() === normalizedConnectedTo)
|
|
|
|
|
.forEach(issue => {
|
|
|
|
|
(issue.hardwareIds || []).forEach(id => {
|
|
|
|
|
if (typeof id === "string") {
|
|
|
|
|
allSlaveHardwareIdsAlreadyReported.add(id.trim().toLowerCase());
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
const alreadyReportedSlaves = new Set(resolvedMasterIssue?.hardwareIds || []);
|
|
|
|
|
const newSlaveHardwareIds = [];
|
|
|
|
|
const newSlaveNames = [];
|
|
|
|
|
|
|
|
|
|
for (const slave of disconnectedSlaves) {
|
|
|
|
|
if (!alreadyReportedSlaves.has(slave.slaveHardwareId)) {
|
|
|
|
|
if (!allSlaveHardwareIdsAlreadyReported.has(slave.slaveHardwareId)) {
|
|
|
|
|
newSlaveHardwareIds.push(slave.slaveHardwareId);
|
|
|
|
|
newSlaveNames.push(slave.slaveName);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Still raise the issue if master is disconnected, even if no new slaves
|
|
|
|
|
if (newSlaveHardwareIds.length === 0 && masterConnectedStatus === "connected") return;
|
|
|
|
|
|
|
|
|
|
const formattedNow = now.format("YYYY-MM-DD HH:mm:ss");
|
|
|
|
|
|
|
|
|
|
// Raise a new issue
|
|
|
|
|
const newIssue = {
|
|
|
|
|
type: "GSM or LoRa Disconnected",
|
|
|
|
|
masterHardwareId: connected_to,
|
|
|
|
|
hardwareId: connected_to,
|
|
|
|
|
masterHardwareId: normalizedConnectedTo,
|
|
|
|
|
hardwareId: normalizedConnectedTo,
|
|
|
|
|
hardwareIds: newSlaveHardwareIds,
|
|
|
|
|
slaveNames: newSlaveNames,
|
|
|
|
|
message: `Master ${connected_to} is ${masterConnectedStatus} with ${disconnectedSlaves.length} disconnected slave(s)`,
|
|
|
|
|
message: `Master ${connected_to} is ${masterConnectedStatus} with ${newSlaveHardwareIds.length} disconnected slave(s)`,
|
|
|
|
|
disconnectedAt: lastDataTime,
|
|
|
|
|
lastTicketRaisedAt: formattedNow,
|
|
|
|
|
resolved: false
|
|
|
|
@ -3954,13 +3961,17 @@ const raiseATicketLikeLogic = async (customerId, connected_to) => {
|
|
|
|
|
|
|
|
|
|
await Support.findOneAndUpdate(
|
|
|
|
|
{ supportId: "AWHYSU64" },
|
|
|
|
|
{ $push: { issues: newIssue }, $set: { updatedAt: new Date() } }
|
|
|
|
|
{
|
|
|
|
|
$push: { issues: newIssue },
|
|
|
|
|
$set: { updatedAt: new Date() }
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error("Error in raiseATicketLikeLogic:", error);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|