Refactor SQL queries into a dedicated module
- Moved SQL queries from multiple worker files into `src/worker/sql.rs` for better organization and maintainability. - Updated references in `stockage_manager.rs`, `transport.rs`, `underground.rs`, `user_character.rs`, and `value_recalculation.rs` to use the new centralized SQL queries. - Improved code readability by replacing `.get(0)` with `.first()` for better clarity when retrieving the first row from query results. - Cleaned up unnecessary comments and consolidated related SQL queries.
This commit is contained in:
@@ -7,6 +7,14 @@ use std::time::{Duration, Instant};
|
||||
|
||||
use crate::db::ConnectionPool;
|
||||
use super::base::{BaseWorker, Worker, WorkerState};
|
||||
use crate::worker::sql::{
|
||||
QUERY_GET_FINISHED_PRODUCTIONS,
|
||||
QUERY_GET_AVAILABLE_STOCKS,
|
||||
QUERY_DELETE_PRODUCTION,
|
||||
QUERY_INSERT_INVENTORY,
|
||||
QUERY_INSERT_UPDATE_PRODUCTION_LOG,
|
||||
QUERY_ADD_OVERPRODUCTION_NOTIFICATION,
|
||||
};
|
||||
|
||||
/// Abbildet eine abgeschlossene Produktion aus der Datenbank.
|
||||
#[derive(Debug, Clone)]
|
||||
@@ -28,128 +36,6 @@ struct StockInfo {
|
||||
filled: i32,
|
||||
}
|
||||
|
||||
// SQL-Queries analog zur C++-Implementierung
|
||||
// Wichtig: Pro `production.id` darf hier **genau eine Zeile** zurückkommen.
|
||||
// Durch die Joins auf Director/Knowledge/Wetter kann es sonst zu Mehrfachzeilen mit
|
||||
// unterschiedlicher berechneter Qualität kommen. Deshalb wird die Qualität
|
||||
// über MAX() aggregiert und nach `production_id` gruppiert.
|
||||
const QUERY_GET_FINISHED_PRODUCTIONS: &str = r#"
|
||||
SELECT
|
||||
p.id AS production_id,
|
||||
p.branch_id,
|
||||
p.product_id,
|
||||
p.quantity,
|
||||
p.start_timestamp,
|
||||
pr.production_time,
|
||||
-- Aggregierte Qualitätsbewertung pro Produktion inkl. Wettereinfluss
|
||||
MAX(
|
||||
GREATEST(
|
||||
0,
|
||||
LEAST(
|
||||
100,
|
||||
ROUND(
|
||||
(
|
||||
CASE
|
||||
WHEN k2.id IS NOT NULL
|
||||
THEN (k.knowledge * 2 + k2.knowledge) / 3
|
||||
ELSE k.knowledge
|
||||
END
|
||||
)::numeric
|
||||
+ COALESCE(pwe.quality_effect, 0) * 2.5
|
||||
)
|
||||
)
|
||||
)::int
|
||||
) AS quality,
|
||||
br.region_id,
|
||||
br.falukant_user_id AS user_id
|
||||
FROM falukant_data.production p
|
||||
JOIN falukant_type.product pr
|
||||
ON p.product_id = pr.id
|
||||
JOIN falukant_data.branch br
|
||||
ON p.branch_id = br.id
|
||||
JOIN falukant_data.character c
|
||||
ON c.user_id = br.falukant_user_id
|
||||
JOIN falukant_data.knowledge k
|
||||
ON p.product_id = k.product_id
|
||||
AND k.character_id = c.id
|
||||
JOIN falukant_data.stock s
|
||||
ON s.branch_id = br.id
|
||||
-- Optionaler Wettereinfluss: pro (Produkt, Wetter) genau ein Datensatz
|
||||
LEFT JOIN falukant_type.product_weather_effect pwe
|
||||
ON pwe.product_id = p.product_id
|
||||
AND pwe.weather_type_id = p.weather_type_id
|
||||
LEFT JOIN falukant_data.director d
|
||||
ON d.employer_user_id = c.user_id
|
||||
LEFT JOIN falukant_data.knowledge k2
|
||||
ON k2.character_id = d.director_character_id
|
||||
AND k2.product_id = p.product_id
|
||||
WHERE p.start_timestamp + INTERVAL '1 minute' * pr.production_time <= NOW()
|
||||
GROUP BY
|
||||
p.id,
|
||||
p.branch_id,
|
||||
p.product_id,
|
||||
p.quantity,
|
||||
p.start_timestamp,
|
||||
pr.production_time,
|
||||
br.region_id,
|
||||
br.falukant_user_id
|
||||
ORDER BY p.start_timestamp;
|
||||
"#;
|
||||
|
||||
const QUERY_GET_AVAILABLE_STOCKS: &str = r#"
|
||||
SELECT
|
||||
stock.id,
|
||||
stock.quantity AS total_capacity,
|
||||
(
|
||||
SELECT COALESCE(SUM(inventory.quantity), 0)
|
||||
FROM falukant_data.inventory
|
||||
WHERE inventory.stock_id = stock.id
|
||||
) AS filled,
|
||||
stock.branch_id
|
||||
FROM falukant_data.stock stock
|
||||
JOIN falukant_data.branch branch
|
||||
ON stock.branch_id = branch.id
|
||||
WHERE branch.id = $1
|
||||
ORDER BY total_capacity DESC;
|
||||
"#;
|
||||
|
||||
const QUERY_DELETE_PRODUCTION: &str = r#"
|
||||
DELETE FROM falukant_data.production
|
||||
WHERE id = $1;
|
||||
"#;
|
||||
|
||||
const QUERY_INSERT_INVENTORY: &str = r#"
|
||||
INSERT INTO falukant_data.inventory (
|
||||
stock_id,
|
||||
product_id,
|
||||
quantity,
|
||||
quality,
|
||||
produced_at
|
||||
) VALUES ($1, $2, $3, $4, NOW());
|
||||
"#;
|
||||
|
||||
const QUERY_INSERT_UPDATE_PRODUCTION_LOG: &str = r#"
|
||||
INSERT INTO falukant_log.production (
|
||||
region_id,
|
||||
product_id,
|
||||
quantity,
|
||||
producer_id,
|
||||
production_date
|
||||
) VALUES ($1, $2, $3, $4, CURRENT_DATE)
|
||||
ON CONFLICT (producer_id, product_id, region_id, production_date)
|
||||
DO UPDATE
|
||||
SET quantity = falukant_log.production.quantity + EXCLUDED.quantity;
|
||||
"#;
|
||||
|
||||
const QUERY_ADD_OVERPRODUCTION_NOTIFICATION: &str = r#"
|
||||
INSERT INTO falukant_log.notification (
|
||||
user_id,
|
||||
tr,
|
||||
shown,
|
||||
created_at,
|
||||
updated_at
|
||||
) VALUES ($1, $2, FALSE, NOW(), NOW());
|
||||
"#;
|
||||
|
||||
pub struct ProduceWorker {
|
||||
base: BaseWorker,
|
||||
|
||||
Reference in New Issue
Block a user