diff --git a/src/controllers/installationController.js b/src/controllers/installationController.js index 04671ee9..c4b64924 100644 --- a/src/controllers/installationController.js +++ b/src/controllers/installationController.js @@ -4304,9 +4304,84 @@ const updateConnectedStatusOnly = async (customerId, hardwareId) => { // } // }); +const generateTicketId = () => { + return "AWTKT" + Date.now(); // Or use UUID or nanoid +}; + + +// const raiseATicketLikeLogic = async (supportRecord, masterHardwareId, slaveData = []) => { +// const now = new Date(); +// const formattedNow = new Date(now.getTime() + 19800000) // +05:30 offset in ms +// .toISOString() +// .replace("T", " ") +// .substring(0, 19); + +// // Check if already categorized +// const alreadyCategorized = supportRecord.categorizedIssues.some( +// (catIssue) => catIssue.hardwareId === masterHardwareId +// ); +// if (alreadyCategorized) { +// console.log(`⛔ Ticket for ${masterHardwareId} already categorized. Skipping.`); +// return; +// } + +// // Prepare slave hardwareIds and names +// const slaveHardwareIds = slaveData.map((slave) => slave.tankhardwareId).sort(); +// const slaveNames = slaveData.map((slave) => slave.sensorName || slave.tankName || "").sort(); + +// // Check for existing unresolved and not moved-to-category issue +// const duplicateExists = supportRecord.issues.some((issue) => { +// const existingSlaveIds = (issue.hardwareIds || []).sort(); +// const existingSlaveNames = (issue.slaveNames || []).sort(); + +// return ( +// issue.hardwareId === masterHardwareId && +// issue.masterHardwareId === masterHardwareId && +// issue.resolved === false && +// issue.movedToCategory === false && +// JSON.stringify(existingSlaveIds) === JSON.stringify(slaveHardwareIds) && +// JSON.stringify(existingSlaveNames) === JSON.stringify(slaveNames) +// ); +// }); + +// if (duplicateExists) { +// console.log(`⛔ Duplicate unresolved issue already exists for ${masterHardwareId}. Skipping.`); +// return; +// } + +// // Create new issue +// const newIssue = { +// ticketId: generateTicketId(), +// type: "GSM or LoRa Disconnected", +// masterHardwareId, +// hardwareId: masterHardwareId, +// hardwareIds: slaveHardwareIds, +// slaveNames: slaveNames, +// resolved: false, +// movedToCategory: false, +// lastTicketRaisedAt: formattedNow, +// createdAt: formattedNow, +// }; +// console.log("newIssue",newIssue) +// supportRecord.issues.push(newIssue); +// supportRecord.lastTicketRaisedAt = formattedNow; +// await Support.findByIdAndUpdate( +// supportRecord._id, +// { +// $push: { issues: newIssue }, +// $set: { lastTicketRaisedAt: formattedNow } +// }, +// { new: true } +// ); + +// console.log("") +// await supportRecord.save(); +// console.log(`✅ New ticket raised for ${masterHardwareId}`); +// }; + const raiseATicketLikeLogic = async (supportRecord, masterHardwareId, slaveData = []) => { const now = new Date(); - const formattedNow = new Date(now.getTime() + 19800000) // +05:30 offset in ms + const formattedNow = new Date(now.getTime() + 19800000) .toISOString() .replace("T", " ") .substring(0, 19); @@ -4346,6 +4421,7 @@ const raiseATicketLikeLogic = async (supportRecord, masterHardwareId, slaveData // Create new issue const newIssue = { + ticketId: generateTicketId(), type: "GSM or LoRa Disconnected", masterHardwareId, hardwareId: masterHardwareId, @@ -4357,14 +4433,21 @@ const raiseATicketLikeLogic = async (supportRecord, masterHardwareId, slaveData createdAt: formattedNow, }; - supportRecord.issues.push(newIssue); - supportRecord.lastTicketRaisedAt = formattedNow; + console.log("newIssue", newIssue); + + // ✅ Atomic update + await Support.findByIdAndUpdate( + supportRecord._id, + { + $push: { issues: newIssue }, + $set: { lastTicketRaisedAt: formattedNow } + }, + { new: true } + ); - await supportRecord.save(); console.log(`✅ New ticket raised for ${masterHardwareId}`); }; - cron.schedule("*/1 * * * *", async () => { try { console.log("🔁 Running auto-disconnect ticket check..."); @@ -5936,6 +6019,13 @@ exports.getDisconnectedIssuesBySupportId = async (req, reply) => { const masterSensor = sensorMap[masterId]; if (!masterSensor || masterSensor.type !== "master") continue; + const stillUnresolved = allIssues.some(i => + (i.hardwareId === masterSensor.hardwareId || i.masterHardwareId === masterSensor.hardwareId) && + !i.resolved && !i.movedToCategory + ); + + if (!stillUnresolved) continue; + const latestMasterData = await IotData.findOne({ hardwareId: masterSensor.hardwareId }).sort({ date: -1 }).lean(); let gsmConnected = false; @@ -6706,15 +6796,23 @@ exports.getDisconnectedCustomerDetails = async (req, reply) => { const allHardwareIds = [...hardwareIdsArray]; + // const disconnectedSensorsRaw = await Insensors.find({ + // connected_status: "disconnected", + // $or: [ + // { connected_to: { $in: allHardwareIds } }, + // { hardwareId: { $in: allHardwareIds } }, + // { tankhardwareId: { $in: allHardwareIds } } + // ] + // }).lean(); + const disconnectedSensorsRaw = await Insensors.find({ - connected_status: "disconnected", $or: [ { connected_to: { $in: allHardwareIds } }, { hardwareId: { $in: allHardwareIds } }, { tankhardwareId: { $in: allHardwareIds } } ] }).lean(); - + const disconnectedSensors = disconnectedSensorsRaw.filter(sensor => { const ids = [ sensor.hardwareId?.trim().toLowerCase(), diff --git a/src/models/store.js b/src/models/store.js index 660013ba..cdd44fbc 100644 --- a/src/models/store.js +++ b/src/models/store.js @@ -206,6 +206,7 @@ const installationschema = new mongoose.Schema({ }); const IssueSchema = new Schema({ + ticketId: { type: String, unique: true }, type: { type: String, enum: ["GSM Disconnected", "LoRa Disconnected", "GSM or LoRa Disconnected"],