Add calculate time tracking

This commit is contained in:
2025-02-02 21:22:46 -05:00
parent b926aba9ff
commit 5676e9094d
9 changed files with 382 additions and 48 deletions

View File

@@ -11,6 +11,9 @@ function sanitizeValue(value) {
async function calculateProductMetrics(startTime, totalProducts, processedCount = 0, isCancelled = false) {
const connection = await getConnection();
let success = false;
let processedOrders = 0;
try {
// Skip flags are inherited from the parent scope
const SKIP_PRODUCT_BASE_METRICS = 0;
@@ -32,7 +35,12 @@ async function calculateProductMetrics(startTime, totalProducts, processedCount
elapsed_seconds: Math.round((Date.now() - startTime) / 1000)
}
});
return processedCount;
return {
processedProducts: processedCount,
processedOrders,
processedPurchaseOrders: 0, // This module doesn't process POs
success
};
}
// First ensure all products have a metrics record
@@ -60,6 +68,14 @@ async function calculateProductMetrics(startTime, totalProducts, processedCount
}
});
// Get order count that will be processed
const [orderCount] = await connection.query(`
SELECT COUNT(*) as count
FROM orders o
WHERE o.canceled = false
`);
processedOrders = orderCount[0].count;
// Calculate base metrics
await connection.query(`
UPDATE product_metrics pm
@@ -181,7 +197,12 @@ async function calculateProductMetrics(startTime, totalProducts, processedCount
});
}
if (isCancelled) return processedCount;
if (isCancelled) return {
processedProducts: processedCount,
processedOrders,
processedPurchaseOrders: 0, // This module doesn't process POs
success
};
// Calculate product time aggregates
if (!SKIP_PRODUCT_TIME_AGGREGATES) {
@@ -303,7 +324,12 @@ async function calculateProductMetrics(startTime, totalProducts, processedCount
}
});
if (isCancelled) return processedCount;
if (isCancelled) return {
processedProducts: processedCount,
processedOrders,
processedPurchaseOrders: 0, // This module doesn't process POs
success
};
const [abcConfig] = await connection.query('SELECT a_threshold, b_threshold FROM abc_classification_config WHERE id = 1');
const abcThresholds = abcConfig[0] || { a_threshold: 20, b_threshold: 50 };
@@ -359,7 +385,12 @@ async function calculateProductMetrics(startTime, totalProducts, processedCount
const batchSize = 5000;
while (true) {
if (isCancelled) return processedCount;
if (isCancelled) return {
processedProducts: processedCount,
processedOrders,
processedPurchaseOrders: 0, // This module doesn't process POs
success
};
// Get a batch of PIDs that need updating
const [pids] = await connection.query(`
@@ -426,8 +457,25 @@ async function calculateProductMetrics(startTime, totalProducts, processedCount
`, [pids.map(row => row.pid), pids.map(row => row.pid)]);
}
return processedCount;
// If we get here, everything completed successfully
success = true;
// Update calculate_status
await connection.query(`
INSERT INTO calculate_status (module_name, last_calculation_timestamp)
VALUES ('product_metrics', NOW())
ON DUPLICATE KEY UPDATE last_calculation_timestamp = NOW()
`);
return {
processedProducts: processedCount,
processedOrders,
processedPurchaseOrders: 0, // This module doesn't process POs
success
};
} catch (error) {
success = false;
logError(error, 'Error calculating product metrics');
throw error;
} finally {