From 7d56f51ec95df993f14b6a507fd87703da5fd044 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Thu, 9 Apr 2026 08:48:51 +0200 Subject: [PATCH] Refactor SQL query for best production calculation: Updated the `QUERY_GET_BEST_PRODUCTION` to incorporate vehicle presence checks for users, adjusting the worth calculation based on regional market data. Enhanced the query structure for improved clarity and performance, ensuring accurate production worth assessment across different regions. Added documentation to clarify the new logic and its implications for product evaluation. --- src/worker/sql.rs | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/src/worker/sql.rs b/src/worker/sql.rs index cb887b8..1165c83 100644 --- a/src/worker/sql.rs +++ b/src/worker/sql.rs @@ -73,15 +73,24 @@ JOIN falukant_data.branch b ON b.region_id = c.region_id AND b.falukant_user_id WHERE current_time BETWEEN '08:00:00' AND '17:00:00'; "#; +/// Bester Produktstart: Mit **mindestens einem** `falukant_data.vehicle` pro User — bester `worth_percent` +/// je Produkt über alle Filialregionen; **ohne** Fahrzeug nur noch **lokaler** Markt (Region der Direktor-Filiale), +/// sonst wäre der beste Fern-Preis nicht erreichbar. pub const QUERY_GET_BEST_PRODUCTION: &str = r#" SELECT fdu.id falukant_user_id, CAST(fdu.money AS text) AS money, fdu.certificate, ftp.id product_id, ftp.label_tr, COALESCE(ftp.category, 1)::int AS product_category, fdb.region_id, (SELECT SUM(quantity) FROM falukant_data.stock fds WHERE fds.branch_id = fdb.id) AS stock_size, COALESCE((SELECT SUM(COALESCE(fdi.quantity, 0)) FROM falukant_data.stock fds JOIN falukant_data.inventory fdi ON fdi.stock_id = fds.id WHERE fds.branch_id = fdb.id), 0) AS used_in_stock, --- Ranking = regionaler Erlös pro Zeiteinheit (wie „Erlös/Minute“ in der Oberfläche): --- Listenpreis * regionaler Marktanteil / Produktionsdauer — ohne Wissens-Additiv und ohne alte Kostenstrafe --- im Zähler (die echte Stückkosten berechnet der Director in Rust). -( (ftp.sell_cost * (fdtpw.worth_percent / 100.0)) / NULLIF(ftp.production_time::float8, 0.0) ) AS worth, +( (ftp.sell_cost * ( + CASE + WHEN EXISTS ( + SELECT 1 FROM falukant_data.vehicle v + WHERE v.falukant_user_id = fdu.id + ) + THEN bw.max_worth_pct + ELSE COALESCE(fdtpw_local.worth_percent::float8, 0.0) + END / 100.0 + )) / NULLIF(ftp.production_time::float8, 0.0) ) AS worth, fdb.id AS branch_id, (SELECT COUNT(id) FROM falukant_data.production WHERE branch_id = fdb.id) AS running_productions, COALESCE((SELECT SUM(COALESCE(fdp.quantity, 0)) quantity FROM falukant_data.production fdp WHERE fdp.branch_id = fdb.id), 0) AS running_productions_quantity FROM falukant_data.director fdd @@ -89,10 +98,23 @@ JOIN falukant_data.character fdc ON fdc.id = fdd.director_character_id JOIN falukant_data.falukant_user fdu ON fdd.employer_user_id = fdu.id JOIN falukant_data.character user_character ON user_character.user_id = fdu.id JOIN falukant_data.branch fdb ON fdb.falukant_user_id = fdu.id AND fdb.region_id = fdc.region_id -JOIN falukant_data.town_product_worth fdtpw ON fdtpw.region_id = fdb.region_id -JOIN falukant_data.knowledge fdk_character ON fdk_character.product_id = fdtpw.product_id AND fdk_character.character_id = user_character.id -JOIN falukant_data.knowledge fdk_director ON fdk_director.product_id = fdtpw.product_id AND fdk_director.character_id = fdd.director_character_id -JOIN falukant_type.product ftp ON ftp.id = fdtpw.product_id AND ftp.category <= fdu.certificate +JOIN ( + SELECT tpw.product_id, + MAX(tpw.worth_percent)::float8 AS max_worth_pct + FROM falukant_data.town_product_worth tpw + WHERE tpw.region_id IN ( + SELECT DISTINCT br.region_id + FROM falukant_data.branch br + WHERE br.falukant_user_id = (SELECT d0.employer_user_id FROM falukant_data.director d0 WHERE d0.id = $1::int) + ) + GROUP BY tpw.product_id +) bw ON TRUE +JOIN falukant_type.product ftp ON ftp.id = bw.product_id AND ftp.category <= fdu.certificate +LEFT JOIN falukant_data.town_product_worth fdtpw_local + ON fdtpw_local.region_id = fdb.region_id + AND fdtpw_local.product_id = ftp.id +JOIN falukant_data.knowledge fdk_character ON fdk_character.product_id = ftp.id AND fdk_character.character_id = user_character.id +JOIN falukant_data.knowledge fdk_director ON fdk_director.product_id = ftp.id AND fdk_director.character_id = fdd.director_character_id WHERE fdd.id = $1 AND fdb.id = $2 ORDER BY worth DESC LIMIT 1; "#;