master^2
Bhaskar 5 months ago
parent e8a1ce5f66
commit 8a318c49ff

@ -1724,6 +1724,7 @@ exports.mastrerList = async (req, reply) => {
// };
exports.getMasterSlaveSummary = async (req, reply) => {
try {
const { customerId } = req.params;
@ -1742,7 +1743,7 @@ exports.getMasterSlaveSummary = async (req, reply) => {
order.master_connections.forEach(connection => {
orderMap[connection.hardwareId] = {
masterName: connection.master_name || null,
location: connection.location || null
location: connection.location || null,
};
});
});
@ -1752,11 +1753,11 @@ exports.getMasterSlaveSummary = async (req, reply) => {
for (const master of masters) {
const orderInfo = orderMap[master.hardwareId] || {};
// Use Insensors values first, fallback to orders
// Prefer Insensors info, fallback to order info
const masterName = master.masterName || orderInfo.masterName || null;
const location = master.location || orderInfo.location || null;
// Fetch the latest GSM data for the master device
// Fetch the latest GSM data for the master device
const latestGsmData = await IotData.findOne({ hardwareId: master.hardwareId })
.sort({ date: -1, time: -1 })
.lean();
@ -1768,9 +1769,15 @@ exports.getMasterSlaveSummary = async (req, reply) => {
let gsmLastDisconnect = master.gsm_last_disconnect_time || null;
if (latestGsmData?.date && latestGsmData?.time) {
const indiaTime = moment.tz(`${latestGsmData.date} ${latestGsmData.time}`, "Asia/Kolkata");
// Combine date + time and parse as Asia/Kolkata timezone
const indiaTime = moment.tz(
`${moment(latestGsmData.date).format("YYYY-MM-DD")} ${latestGsmData.time}`,
"YYYY-MM-DD HH:mm:ss",
"Asia/Kolkata"
);
connectedGsmDate = indiaTime.format("DD-MM-YYYY");
connectedGsmTime = latestGsmData.time;
connectedGsmTime = indiaTime.format("HH:mm:ss");
const now = moment.tz("Asia/Kolkata");
const diffInMinutes = now.diff(indiaTime, "minutes");
@ -1778,12 +1785,12 @@ exports.getMasterSlaveSummary = async (req, reply) => {
gsmStatus = diffInMinutes <= 1 ? "connected" : "disconnected";
gsmLastCheckTime = now.format("DD-MM-YYYY HH:mm:ss");
// If disconnected and no previous disconnect time, set it
if (gsmStatus === "disconnected" && !gsmLastDisconnect) {
if (gsmStatus === "disconnected") {
// Update disconnect time with latest disconnect timestamp
gsmLastDisconnect = `${connectedGsmDate} ${connectedGsmTime}`;
}
// Update master record with latest GSM info
// Update master device with latest GSM info
await Insensors.updateOne(
{ hardwareId: master.hardwareId },
{
@ -1792,80 +1799,87 @@ exports.getMasterSlaveSummary = async (req, reply) => {
connected_gsm_date: connectedGsmDate,
connected_gsm_time: connectedGsmTime,
gsm_last_check_time: gsmLastCheckTime,
gsm_last_disconnect_time: gsmLastDisconnect
}
gsm_last_disconnect_time: gsmLastDisconnect,
},
}
);
}
// Save GSM disconnect time if disconnected
if (gsmStatus === "disconnected" && gsmLastDisconnect) {
await Insensors.updateOne(
{ hardwareId: master.hardwareId },
{ $set: { gsm_last_disconnect_time: gsmLastDisconnect } }
);
}
// Handle slaves
// Process connected slave devices for the master
const connectedSlaves = [];
const slaves = await Insensors.find({ connected_to: master.hardwareId, type: "slave" }).lean();
console.log("slaves",slaves)
for (const slave of slaves) {
const slaveIot = await IotData.findOne({ hardwareId: slave.hardwareId })
const slaveIot = await IotData.findOne({ hardwareId: slave.connected_to })
.sort({ date: -1, time: -1 })
.lean();
console.log("slaveIot",slaveIot)
let connectedLoraDate = null;
let connectedLoraTime = null;
let loraStatus = "unknown";
let loraLastCheckTime = null;
// if (slaveIot?.date && slaveIot?.time) {
// const indiaTime = moment.tz(`${slaveIot.date} ${slaveIot.time}`, "Asia/Kolkata");
// connectedLoraDate = indiaTime.format("DD-MM-YYYY");
// connectedLoraTime = indiaTime.format("HH:mm:ss");
// }
// const tankHeight = await getTankHeight(slave.tankhardwareId);
// let loraStatus = (tankHeight === null || tankHeight === 0) ? "disconnected" : "connected";
// const loraLastDisconnect = loraStatus === "disconnected" && connectedLoraDate && connectedLoraTime
// ? `${connectedLoraDate} ${connectedLoraTime}`
// : slave.lora_last_disconnect_time || null;
let loraStatus = "disconnected";
let loraLastDisconnect = slave.lora_last_disconnect_time || null;
if (slaveIot?.date && slaveIot?.time) {
const indiaTime = moment.tz(`${slaveIot.date} ${slaveIot.time}`, "Asia/Kolkata");
connectedLoraDate = indiaTime.format("DD-MM-YYYY");
connectedLoraTime = slaveIot.time;
const now = moment.tz("Asia/Kolkata");
const diff = now.diff(indiaTime, "minutes");
loraStatus = diff <= 1 ? "connected" : "disconnected";
loraLastCheckTime = now.format("DD-MM-YYYY HH:mm:ss");
await Insensors.updateOne(
{ hardwareId: slave.hardwareId },
{
$set: {
connected_status: loraStatus,
connected_lora_date: connectedLoraDate,
connected_lora_time: connectedLoraTime,
lora_last_check_time: loraLastCheckTime
}
}
let tankHeight = null;
if (slaveIot?.tanks?.length && slave.tankhardwareId) {
const matchedTank = slaveIot.tanks.find(
t => t.tankhardwareId === slave.tankhardwareId
);
if (loraStatus === "disconnected") {
const disconnectTime = `${connectedLoraDate} ${connectedLoraTime}`;
await Insensors.updateOne(
{ hardwareId: slave.hardwareId },
{ $set: { lora_last_disconnect_time: disconnectTime } }
if (matchedTank) {
tankHeight = parseFloat(matchedTank.tankHeight) || 0;
const indiaTime = moment.tz(
`${moment(matchedTank.date).format("YYYY-MM-DD")} ${matchedTank.time}`,
"YYYY-MM-DD HH:mm:ss",
"Asia/Kolkata"
);
loraLastDisconnect = disconnectTime;
}
} else {
loraStatus = "disconnected";
loraLastDisconnect = loraLastDisconnect || null;
await Insensors.updateOne(
{ hardwareId: slave.hardwareId },
{
$set: {
connected_status: loraStatus,
lora_last_disconnect_time: loraLastDisconnect
connectedLoraDate = indiaTime.format("DD-MM-YYYY");
connectedLoraTime = indiaTime.format("HH:mm:ss");
loraStatus = tankHeight > 0 ? "connected" : "disconnected";
// if (loraStatus === "disconnected") {
// loraLastDisconnect = `${connectedLoraDate} ${connectedLoraTime}`;
// }
if (loraStatus === "disconnected") {
if (connectedLoraDate && connectedLoraTime) {
loraLastDisconnect = `${connectedLoraDate} ${connectedLoraTime}`;
} else {
loraLastDisconnect = slave.lora_last_disconnect_time || null;
}
}
);
}
}
// Update in DB
await Insensors.updateOne(
{ hardwareId: slave.hardwareId },
{
$set: {
connected_status: loraStatus,
connected_lora_date: connectedLoraDate,
connected_lora_time: connectedLoraTime,
lora_last_disconnect_time: loraLastDisconnect
}
}
);
connectedSlaves.push({
hardwareId: slave.hardwareId,
tankhardwareId: slave.tankhardwareId || null,
@ -1876,10 +1890,10 @@ exports.getMasterSlaveSummary = async (req, reply) => {
connected_lora_time: connectedLoraTime,
lora_last_disconnect_time: loraLastDisconnect,
type: slave.type || "slave",
connected_to: slave.connected_to || null // <-- Added connected_to here
connected_to: slave.connected_to || null
});
}
result.push({
hardwareId: master.hardwareId,
masterName,
@ -1893,14 +1907,14 @@ exports.getMasterSlaveSummary = async (req, reply) => {
gsm_last_check_time: gsmLastCheckTime,
gsm_last_disconnect_time: gsmLastDisconnect,
connected_lora_date: master.connected_lora_date || null,
connected_lora_time: master.connected_lora_time || null
connected_lora_time: master.connected_lora_time || null,
});
}
return reply.send({
status_code: 200,
message: "Master-slave summary retrieved successfully",
data: result
data: result,
});
} catch (error) {
console.error("Error in getMasterSlaveSummary:", error);
@ -1912,18 +1926,17 @@ exports.getMasterSlaveSummary = async (req, reply) => {
// 🔍 Helper to get tankHeight from latest IotData record
async function getTankHeight(hardwareId) {
const iotData = await IotData.findOne({ 'tanks.tankhardwareId': hardwareId })
async function getTankHeight(tankhardwareId) {
const iotData = await IotData.findOne({ 'tanks.tankhardwareId': tankhardwareId })
.sort({ date: -1 })
.lean();
if (!iotData) return null;
const matchedTank = iotData.tanks.find(t => t.tankhardwareId === hardwareId);
const matchedTank = iotData.tanks.find(t => t.tankhardwareId === tankhardwareId);
return matchedTank?.tankHeight || null;
}
// exports.getIotDataByCustomer = async (req, reply) => {
// try {
// const { customerId } = req.params;

Loading…
Cancel
Save