Update: 2026-06-30 21:12:26

This commit is contained in:
Hamza-Ayed
2026-06-30 21:12:26 +03:00
parent c2eab19045
commit 1ae8acad7a
14 changed files with 90 additions and 55 deletions

View File

@@ -37,7 +37,7 @@ try {
$anomalies = $stmt->fetchAll(PDO::FETCH_ASSOC);
// Fetch some recent competitor prices for context
$sqlPrices = "SELECT * FROM competitor_prices";
$sqlPrices = "SELECT * FROM scraped_competitor_prices";
$paramsPrices = [];
if ($countryCode) {
$sqlPrices .= " WHERE country_code = :country";

View File

@@ -15,7 +15,7 @@ try {
DATE_FORMAT(created_at, '%Y-%m-%d %H:00:00') AS hour_bucket,
AVG(price_per_km) AS avg_price_per_km,
COUNT(*) AS sample_count
FROM competitor_prices
FROM scraped_competitor_prices
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 24 HOUR)";
$compParams = [];
if ($countryCode) {
@@ -33,12 +33,12 @@ try {
// 2. PCI by region — group competitor prices by ~0.02° grid cells
$pciSql = "SELECT
ROUND(from_latitude * 50, 0) / 50 AS lat_group,
ROUND(from_longitude * 50, 0) / 50 AS lng_group,
ROUND(start_lat * 50, 0) / 50 AS lat_group,
ROUND(start_lng * 50, 0) / 50 AS lng_group,
competitor_name,
AVG(price_per_km) AS avg_price_per_km,
COUNT(*) AS samples
FROM competitor_prices
FROM scraped_competitor_prices
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)";
$pciParams = [];
if ($countryCode) {

View File

@@ -35,13 +35,13 @@ try {
// Aggregate competitor data by geographical grid (approx 1.5km x 1.5km)
$sql = "SELECT
ROUND(from_latitude * 74, 0) / 74 AS lat_group,
ROUND(from_longitude * 74, 0) / 74 AS lng_group,
ROUND(start_lat * 74, 0) / 74 AS lat_group,
ROUND(start_lng * 74, 0) / 74 AS lng_group,
AVG(price_per_km) as avg_competitor_price_per_km,
COUNT(*) as trip_count
FROM competitor_prices
FROM scraped_competitor_prices
WHERE country_code = :country
AND distance_km > 0
AND price_per_km > 0
AND created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
GROUP BY lat_group, lng_group
HAVING trip_count >= 3"; // Require at least 3 trips for a reliable heatmap point

View File

@@ -32,8 +32,8 @@ try {
// 1. حساب الـ baseline (آخر 7 أيام، بدون آخر 6 ساعات)
// و current (آخر ساعتين) لكل منافس في كل خلية grid
$sql = "SELECT
ROUND(cp.from_latitude * 74, 0) / 74 AS lat_group,
ROUND(cp.from_longitude * 74, 0) / 74 AS lng_group,
ROUND(cp.start_lat * 74, 0) / 74 AS lat_group,
ROUND(cp.start_lng * 74, 0) / 74 AS lng_group,
cp.competitor_name,
cp.country_code,
AVG(CASE WHEN cp.created_at < DATE_SUB(NOW(), INTERVAL 6 HOUR)
@@ -42,7 +42,7 @@ try {
THEN cp.price_per_km END) AS current_avg,
COUNT(*) AS total_samples,
SUM(CASE WHEN cp.created_at >= DATE_SUB(NOW(), INTERVAL 2 HOUR) THEN 1 ELSE 0 END) AS recent_samples
FROM competitor_prices cp
FROM scraped_competitor_prices cp
WHERE cp.created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
AND cp.price_per_km > 0
$where

View File

@@ -21,9 +21,9 @@ $siroBasePrice = filterRequest('siro_base_price', 'float') ?? 10000.0;
try {
// 3. Fetch recent competitor prices for this region to supply context to Gemini
$sqlPrices = "SELECT competitor_name, total_price, distance_km
FROM competitor_prices
WHERE country_code = :country
$sqlPrices = "SELECT competitor_name, price_amount AS total_price, (price_amount / price_per_km) AS distance_km
FROM scraped_competitor_prices
WHERE country_code = :country AND price_per_km > 0
ORDER BY created_at DESC LIMIT 10";
$stmtPrices = $con->prepare($sqlPrices);
$stmtPrices->execute([':country' => strtoupper($countryCode)]);

View File

@@ -22,10 +22,10 @@ try {
}
// 1. Fetch recent competitor trips (last 7 days, limit 500 for fast simulation)
$sql = "SELECT distance_km, total_price, competitor_name
FROM competitor_prices
$sql = "SELECT (price_amount / price_per_km) AS distance_km, price_amount AS total_price, competitor_name
FROM scraped_competitor_prices
WHERE country_code = :country
AND distance_km > 0
AND price_per_km > 0
AND created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY)
ORDER BY created_at DESC
LIMIT 500";