|
|
|
@ -1700,7 +1700,6 @@ exports.masterConnectedSlaveList = async (req, reply) => {
|
|
|
|
|
try {
|
|
|
|
|
const { connectedTo, customerId } = req.params;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (!connectedTo) {
|
|
|
|
|
return reply.status(400).send({ success: false, message: "connectedTo is required" });
|
|
|
|
|
}
|
|
|
|
@ -1709,37 +1708,30 @@ exports.masterConnectedSlaveList = async (req, reply) => {
|
|
|
|
|
return reply.status(400).send({ success: false, message: "customerId is required" });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Step 1: Get master device details (only for this customer)
|
|
|
|
|
// Step 1: Get master device
|
|
|
|
|
const master = await Insensors.findOne({ hardwareId: connectedTo, type: 'master', customerId }).lean();
|
|
|
|
|
if (!master) {
|
|
|
|
|
return reply.status(404).send({
|
|
|
|
|
success: false,
|
|
|
|
|
message: "Master device not found"
|
|
|
|
|
});
|
|
|
|
|
return reply.status(404).send({ success: false, message: "Master device not found" });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Step 2: Get tank metadata for master
|
|
|
|
|
const masterHardwareId = master.hardwareId;
|
|
|
|
|
console.log("masterHardwareId",masterHardwareId)
|
|
|
|
|
// Step 2: Get tank metadata
|
|
|
|
|
const tankDetails = await Tank.findOne(
|
|
|
|
|
{ hardwareId: connectedTo },
|
|
|
|
|
{
|
|
|
|
|
tankLocation: 1,
|
|
|
|
|
typeOfWater: 1,
|
|
|
|
|
height: 1,
|
|
|
|
|
length: 1,
|
|
|
|
|
width: 1
|
|
|
|
|
}
|
|
|
|
|
{ tankLocation: 1, typeOfWater: 1, height: 1, length: 1, width: 1 }
|
|
|
|
|
).lean();
|
|
|
|
|
|
|
|
|
|
const masterTypeOfWater = tankDetails?.typeOfWater || null;
|
|
|
|
|
console.log("masterTypeOfWater",masterTypeOfWater)
|
|
|
|
|
// Step 3: Get slave tanks connected to master and belonging to this customer
|
|
|
|
|
|
|
|
|
|
// Step 3: Get slave devices
|
|
|
|
|
const slaveTanks = await Insensors.find({ connected_to: connectedTo, type: 'slave', customerId }).lean();
|
|
|
|
|
const slaveCount = slaveTanks.length;
|
|
|
|
|
|
|
|
|
|
// Step 4: Get latest IotData for master
|
|
|
|
|
// Step 4: Latest IoT data
|
|
|
|
|
const latestIotData = await IotData.findOne({ hardwareId: connectedTo }).sort({ date: -1 }).lean();
|
|
|
|
|
|
|
|
|
|
// Step 5: Fetch order to get masterName, location, etc.
|
|
|
|
|
// Step 5: Order info
|
|
|
|
|
const order = await Order.findOne({ "master_connections.hardwareId": connectedTo }).lean();
|
|
|
|
|
|
|
|
|
|
let masterOrderInfo = {};
|
|
|
|
@ -1768,9 +1760,15 @@ exports.masterConnectedSlaveList = async (req, reply) => {
|
|
|
|
|
electricals = order.electricals || [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Step 6: Build master response object
|
|
|
|
|
// Step 6: Build master response **without** hardwareId
|
|
|
|
|
const {
|
|
|
|
|
hardwareId, // exclude this
|
|
|
|
|
...restMasterFields
|
|
|
|
|
} = master;
|
|
|
|
|
|
|
|
|
|
const masterResponse = {
|
|
|
|
|
...master,
|
|
|
|
|
...restMasterFields,
|
|
|
|
|
masterHardwareId: masterHardwareId, // new field
|
|
|
|
|
isMaster: true,
|
|
|
|
|
tankLocation: tankDetails?.tankLocation || null,
|
|
|
|
|
product_status: master.product_status || 'pending',
|
|
|
|
@ -1786,133 +1784,39 @@ exports.masterConnectedSlaveList = async (req, reply) => {
|
|
|
|
|
width: tankDetails?.width || null
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Step 7: Process each slave
|
|
|
|
|
// const processedSlaves = await Promise.all(slaveTanks.map(async slave => {
|
|
|
|
|
// const originalHardwareId = slave.connected_to;
|
|
|
|
|
// const tankHardwareId = slave.tankhardwareId;
|
|
|
|
|
// console.log("originalHardwareId",originalHardwareId)
|
|
|
|
|
// console.log("tankHardwareId",tankHardwareId)
|
|
|
|
|
|
|
|
|
|
// const finalHardwareId = tankHardwareId || originalHardwareId;
|
|
|
|
|
|
|
|
|
|
// const matchingTankData = latestIotData?.tanks?.find(t =>
|
|
|
|
|
// t.tankhardwareId === finalHardwareId || t.hardwareId === finalHardwareId
|
|
|
|
|
// );
|
|
|
|
|
|
|
|
|
|
// // Fetch slave's tank metadata
|
|
|
|
|
// const slaveTankMeta = await Tank.findOne(
|
|
|
|
|
// // { hardwareId: slave.connected_to },
|
|
|
|
|
// {
|
|
|
|
|
// $or: [
|
|
|
|
|
// { hardwareId: slave.connected_to },
|
|
|
|
|
// { hardwareId: slave.tankhardwareId } // assuming tankhardwareId is saved as hardwareId in Tank collection
|
|
|
|
|
// ]
|
|
|
|
|
// },
|
|
|
|
|
// { height: 1, length: 1, width: 1 }
|
|
|
|
|
// ).lean();
|
|
|
|
|
// console.log("slaveTankMeta",slaveTankMeta)
|
|
|
|
|
// return {
|
|
|
|
|
// ...slave,
|
|
|
|
|
// isMaster: false,
|
|
|
|
|
// hardwareId: finalHardwareId,
|
|
|
|
|
// tankHeight: matchingTankData?.tankHeight ?? null,
|
|
|
|
|
// typeOfWater: masterTypeOfWater === 'bore' ? 'bore' : (slave.typeOfWater || null),
|
|
|
|
|
// height: slaveTankMeta?.height || null,
|
|
|
|
|
// length: slaveTankMeta?.length || null,
|
|
|
|
|
// width: slaveTankMeta?.width || null
|
|
|
|
|
// };
|
|
|
|
|
// }));
|
|
|
|
|
|
|
|
|
|
// Step 7: Process slaves
|
|
|
|
|
const processedSlaves = await Promise.all(slaveTanks.map(async slave => {
|
|
|
|
|
// const finalHardwareId = slave.tankhardwareId || slave.connected_to;
|
|
|
|
|
// console.log("finalHardwareId",finalHardwareId)
|
|
|
|
|
// // Find matching tank meta by hardwareId in Tank collection
|
|
|
|
|
// const slaveTankMeta = await Tank.findOne(
|
|
|
|
|
// { hardwareId: finalHardwareId },
|
|
|
|
|
// { height: 1, length: 1, width: 1 }
|
|
|
|
|
// ).lean();
|
|
|
|
|
// const finalHardwareId = slave.tankhardwareId || slave.connected_to;
|
|
|
|
|
|
|
|
|
|
// // Try match by tankhardwareId first
|
|
|
|
|
// let slaveTankMeta = await Tank.findOne(
|
|
|
|
|
// { tankhardwareId: slave.tankhardwareId },
|
|
|
|
|
// { height: 1, length: 1, width: 1 }
|
|
|
|
|
// ).lean();
|
|
|
|
|
|
|
|
|
|
// // If not found, fallback to match by hardwareId
|
|
|
|
|
// if (!slaveTankMeta && slave.connected_to) {
|
|
|
|
|
// slaveTankMeta = await Tank.findOne(
|
|
|
|
|
// { hardwareId: slave.connected_to },
|
|
|
|
|
// { height: 1, length: 1, width: 1 }
|
|
|
|
|
// ).lean();
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
// console.log("slaveTankMeta",slaveTankMeta)
|
|
|
|
|
|
|
|
|
|
// // Find matching IoT tank data (for tankHeight)
|
|
|
|
|
// const matchingTankData = latestIotData?.tanks?.find(t =>
|
|
|
|
|
// t.tankhardwareId === finalHardwareId || t.connected_to === finalHardwareId
|
|
|
|
|
// );
|
|
|
|
|
// console.log("matchingTankData",matchingTankData)
|
|
|
|
|
|
|
|
|
|
// return {
|
|
|
|
|
// ...slave,
|
|
|
|
|
// isMaster: false,
|
|
|
|
|
// hardwareId: finalHardwareId,
|
|
|
|
|
// tankHeight: matchingTankData?.tankHeight ?? null,
|
|
|
|
|
// typeOfWater: masterTypeOfWater === 'bore' ? 'bore' : (slave.typeOfWater || null),
|
|
|
|
|
// height: slaveTankMeta?.height || null,
|
|
|
|
|
// length: slaveTankMeta?.length || null,
|
|
|
|
|
// width: slaveTankMeta?.width || null
|
|
|
|
|
// };
|
|
|
|
|
const finalHardwareId = slave.tankhardwareId || slave.connected_to;
|
|
|
|
|
|
|
|
|
|
// Try match by tankhardwareId first, filtered by customerId
|
|
|
|
|
let slaveTankMeta = await Tank.findOne(
|
|
|
|
|
{
|
|
|
|
|
tankhardwareId: slave.tankhardwareId,
|
|
|
|
|
customerId: customerId
|
|
|
|
|
},
|
|
|
|
|
{ height: 1, length: 1, width: 1 }
|
|
|
|
|
).lean();
|
|
|
|
|
|
|
|
|
|
// If not found, fallback to match by hardwareId + customerId
|
|
|
|
|
if (!slaveTankMeta && slave.connected_to) {
|
|
|
|
|
slaveTankMeta = await Tank.findOne(
|
|
|
|
|
{
|
|
|
|
|
hardwareId: slave.connected_to,
|
|
|
|
|
customerId: customerId
|
|
|
|
|
},
|
|
|
|
|
{ height: 1, length: 1, width: 1 }
|
|
|
|
|
).lean();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
console.log("slaveTankMeta", slaveTankMeta);
|
|
|
|
|
|
|
|
|
|
// Find matching IoT tank data (for tankHeight)
|
|
|
|
|
const matchingTankData = latestIotData?.tanks?.find(t =>
|
|
|
|
|
t.tankHardwareId === finalHardwareId || t.connected_to === finalHardwareId
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
console.log("matchingTankData",matchingTankData)
|
|
|
|
|
return {
|
|
|
|
|
...slave,
|
|
|
|
|
isMaster: false,
|
|
|
|
|
// hardwareId: finalHardwareId,
|
|
|
|
|
product_status: slave.product_status || 'pending',
|
|
|
|
|
tankHeight: matchingTankData?.tankHeight ?? null,
|
|
|
|
|
typeOfWater: masterTypeOfWater === 'bore' ? 'bore' : (slave.typeOfWater || null),
|
|
|
|
|
height: slaveTankMeta?.height || null,
|
|
|
|
|
length: slaveTankMeta?.length || null,
|
|
|
|
|
width: slaveTankMeta?.width || null
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}));
|
|
|
|
|
const finalHardwareId = slave.tankhardwareId || slave.connected_to;
|
|
|
|
|
|
|
|
|
|
let slaveTankMeta = await Tank.findOne(
|
|
|
|
|
{ tankhardwareId: slave.tankhardwareId, customerId },
|
|
|
|
|
{ height: 1, length: 1, width: 1 }
|
|
|
|
|
).lean();
|
|
|
|
|
|
|
|
|
|
if (!slaveTankMeta && slave.connected_to) {
|
|
|
|
|
slaveTankMeta = await Tank.findOne(
|
|
|
|
|
{ hardwareId: slave.connected_to, customerId },
|
|
|
|
|
{ height: 1, length: 1, width: 1 }
|
|
|
|
|
).lean();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const matchingTankData = latestIotData?.tanks?.find(t =>
|
|
|
|
|
t.tankHardwareId === finalHardwareId || t.connected_to === finalHardwareId
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
// Step 8: Combine into one array
|
|
|
|
|
const combinedData = [masterResponse, ...processedSlaves];
|
|
|
|
|
return {
|
|
|
|
|
...slave,
|
|
|
|
|
isMaster: false,
|
|
|
|
|
product_status: slave.product_status || 'pending',
|
|
|
|
|
tankHeight: matchingTankData?.tankHeight ?? null,
|
|
|
|
|
typeOfWater: masterTypeOfWater === 'bore' ? 'bore' : (slave.typeOfWater || null),
|
|
|
|
|
height: slaveTankMeta?.height || null,
|
|
|
|
|
length: slaveTankMeta?.length || null,
|
|
|
|
|
width: slaveTankMeta?.width || null
|
|
|
|
|
};
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
// Step 8: Send response
|
|
|
|
|
return reply.send({
|
|
|
|
|
success: true,
|
|
|
|
|
tankLocation: tankDetails?.tankLocation || null,
|
|
|
|
@ -1923,19 +1827,18 @@ return {
|
|
|
|
|
sensors: sensorsCount,
|
|
|
|
|
motor_switches: motorSwitches,
|
|
|
|
|
electricals: electricals,
|
|
|
|
|
data: combinedData
|
|
|
|
|
data: [masterResponse, ...processedSlaves]
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
} catch (error) {
|
|
|
|
|
console.error("Error fetching master connected slave data:", error);
|
|
|
|
|
return reply.status(500).send({
|
|
|
|
|
success: false,
|
|
|
|
|
message: "Internal Server Error"
|
|
|
|
|
});
|
|
|
|
|
return reply.status(500).send({ success: false, message: "Internal Server Error" });
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
exports.updateWorkStatusAndProductStatus = async (req, reply) => {
|
|
|
|
|
try {
|
|
|
|
|
const { connectedTo, teamMemberId, customerId } = req.params;
|
|
|
|
|