From 84b32d72aaf2f5f36a5709c4e074b0b36d099b3c Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Thu, 26 Mar 2026 19:42:24 +0100 Subject: [PATCH] Update production worth calculation in SQL and documentation: Refined the worth formula to focus on regional revenue per time unit, removing knowledge factors and old cost penalties. Enhanced documentation to clarify the new sorting criteria and its implications for production management. --- docs/FALUKANT_DIRECTOR_PRODUCTION_COST.md | 8 ++++++-- src/worker/sql.rs | 5 ++++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/docs/FALUKANT_DIRECTOR_PRODUCTION_COST.md b/docs/FALUKANT_DIRECTOR_PRODUCTION_COST.md index 4cdc497..eb702ff 100644 --- a/docs/FALUKANT_DIRECTOR_PRODUCTION_COST.md +++ b/docs/FALUKANT_DIRECTOR_PRODUCTION_COST.md @@ -21,9 +21,13 @@ effektiv = raw × (1 − discount) | `PRODUCTION_HEADROOM_DISCOUNT_PER_STEP` | `0.035` | Rabatt pro Headroom-Stufe | | `PRODUCTION_HEADROOM_DISCOUNT_CAP` | `0.14` | maximaler Gesamtrabatt | -## Worth in SQL +## Worth in SQL (`QUERY_GET_BEST_PRODUCTION`) -`QUERY_GET_BEST_PRODUCTION` sortiert nach einer Worth-Zeile (u. a. `- 6 * ftp.category`). Bei größeren Formeländerungen Worth **mit** anpassen, damit der Director weiterhin sinnvoll sortiert. +Sortierung nach **regionalem Erlös pro Zeiteinheit**: + +`(sell_cost * worth_percent/100) / production_time` + +Damit entspricht die Auswahl in etwa **„Erlös pro Minute“** (Listenpreis × Markt in der Region ÷ Dauer einer Produktionscharge). **Wissen** fließt hier **nicht** in die Reihenfolge ein (Wissen wirkt bei euch auf Qualität/Preis beim Verkauf, nicht auf die Produktwahl). Die **Stückkosten** kommen nur aus der Rust-Formel beim Abbuchen. ## Parallelproduktionen diff --git a/src/worker/sql.rs b/src/worker/sql.rs index f7cc075..c957cb7 100644 --- a/src/worker/sql.rs +++ b/src/worker/sql.rs @@ -78,7 +78,10 @@ SELECT fdu.id falukant_user_id, CAST(fdu.money AS text) AS money, fdu.certificat 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, -(ftp.sell_cost * (fdtpw.worth_percent + (fdk_character.knowledge * 2 + fdk_director.knowledge) / 3) / 100 - 6 * ftp.category) / (300.0 * ftp.production_time) AS worth, +-- 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, 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