130 lines
3.4 KiB
PHP
130 lines
3.4 KiB
PHP
<?php
|
|
/**
|
|
* Mill Projected Total - MSSQL Version (60 minute window)
|
|
*
|
|
* Uses SQL Server archive table (row-based storage) instead of MySQL
|
|
*
|
|
* Tags:
|
|
* - WTOTGROUND (ID: 342) - West Mill Total Ground
|
|
* - CANETOT (ID: 218) - East Mill Total Ground
|
|
* - TotalGround (ID: 230) - Total Ground Since 5 AM
|
|
*/
|
|
|
|
$servername = "192.168.0.13\\SQLEXPRESS";
|
|
$username = "opce";
|
|
$password = "opcelasuca";
|
|
$dbname = "history";
|
|
|
|
try {
|
|
$pdo = new PDO(
|
|
"sqlsrv:Server=$servername;Database=$dbname",
|
|
$username,
|
|
$password,
|
|
[
|
|
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
|
|
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
|
|
]
|
|
);
|
|
} catch (PDOException $e) {
|
|
echo "0";
|
|
return;
|
|
}
|
|
|
|
// Tag IDs
|
|
$eastId = 218; // CANETOT
|
|
$westId = 342; // WTOTGROUND
|
|
$totalId = 230; // TotalGround
|
|
|
|
$query = "
|
|
DECLARE @now DATETIME = GETDATE();
|
|
DECLARE @oneHourAgo DATETIME = DATEADD(HOUR, -1, @now);
|
|
|
|
-- Calculate hours remaining until 5 AM
|
|
-- If before 5 AM, time until 5 AM today
|
|
-- If after 5 AM, time until 5 AM tomorrow
|
|
DECLARE @hoursRemaining FLOAT;
|
|
DECLARE @targetTime DATETIME;
|
|
|
|
IF CAST(@now AS TIME) < '05:00:00'
|
|
SET @targetTime = CAST(CAST(@now AS DATE) AS DATETIME) + CAST('05:00:00' AS DATETIME)
|
|
ELSE
|
|
SET @targetTime = CAST(DATEADD(DAY, 1, CAST(@now AS DATE)) AS DATETIME) + CAST('05:00:00' AS DATETIME)
|
|
|
|
SET @hoursRemaining = DATEDIFF(SECOND, @now, @targetTime) / 3600.0;
|
|
|
|
-- Get latest East value
|
|
DECLARE @eastLatest FLOAT = (
|
|
SELECT TOP 1 Value
|
|
FROM dbo.archive
|
|
WHERE ID = :eastId
|
|
ORDER BY TimeStamp DESC
|
|
);
|
|
|
|
-- Get East value from ~60 minutes ago
|
|
DECLARE @eastOld FLOAT = (
|
|
SELECT TOP 1 Value
|
|
FROM dbo.archive
|
|
WHERE ID = :eastId2 AND TimeStamp <= @oneHourAgo
|
|
ORDER BY TimeStamp DESC
|
|
);
|
|
|
|
-- Get latest West value
|
|
DECLARE @westLatest FLOAT = (
|
|
SELECT TOP 1 Value
|
|
FROM dbo.archive
|
|
WHERE ID = :westId
|
|
ORDER BY TimeStamp DESC
|
|
);
|
|
|
|
-- Get West value from ~60 minutes ago
|
|
DECLARE @westOld FLOAT = (
|
|
SELECT TOP 1 Value
|
|
FROM dbo.archive
|
|
WHERE ID = :westId2 AND TimeStamp <= @oneHourAgo
|
|
ORDER BY TimeStamp DESC
|
|
);
|
|
|
|
-- Get current total ground
|
|
DECLARE @totalGround FLOAT = (
|
|
SELECT TOP 1 Value
|
|
FROM dbo.archive
|
|
WHERE ID = :totalId
|
|
ORDER BY TimeStamp DESC
|
|
);
|
|
|
|
-- Calculate rates (tons per hour)
|
|
DECLARE @eastRate FLOAT = COALESCE(@eastLatest, 0) - COALESCE(@eastOld, 0);
|
|
DECLARE @westRate FLOAT = COALESCE(@westLatest, 0) - COALESCE(@westOld, 0);
|
|
|
|
-- Handle negative rates (mill reset or bad data)
|
|
IF @eastRate < 0 SET @eastRate = 0;
|
|
IF @westRate < 0 SET @westRate = 0;
|
|
|
|
-- Calculate projection
|
|
SELECT ROUND(
|
|
((@eastRate + @westRate) * @hoursRemaining) + COALESCE(@totalGround, 0),
|
|
0
|
|
) AS millprojected;
|
|
";
|
|
|
|
try {
|
|
$stmt = $pdo->prepare($query);
|
|
$stmt->execute([
|
|
':eastId' => $eastId,
|
|
':eastId2' => $eastId,
|
|
':westId' => $westId,
|
|
':westId2' => $westId,
|
|
':totalId' => $totalId,
|
|
]);
|
|
|
|
$result = $stmt->fetch();
|
|
$projected = $result ? round($result['millprojected']) : 0;
|
|
|
|
} catch (PDOException $e) {
|
|
$projected = 0;
|
|
}
|
|
|
|
$pdo = null;
|
|
?>
|
|
<?php echo $projected; ?>
|