From 2a4d5675495d107de7b4bcdb3f72b097b0fb3e61 Mon Sep 17 00:00:00 2001 From: Dmitriy Bondarenko Date: Thu, 27 Mar 2025 19:45:30 +0000 Subject: [PATCH] fix --- Task15.md | 12 ++--- database/init/00init.sql | 76 +++++++++++++++----------------- database/init/01insert.sql | 60 +++++++++++++++++-------- internal/domain/routes/routes.go | 36 +++++++++++++++ 4 files changed, 119 insertions(+), 65 deletions(-) create mode 100644 internal/domain/routes/routes.go diff --git a/Task15.md b/Task15.md index 0dc1ee7..ad7f482 100644 --- a/Task15.md +++ b/Task15.md @@ -5,10 +5,10 @@ Описание предметной области. БД создается для информационного обслуживания сотрудников компании. Компания предоставляет услуги по доставке грузов воздушным, речным, морским путем, по железной дороге или автомобилем по различным маршрутам. -Готовые запросы: -Выдавать список маршрутов, обслуживаемых компанией и цену на них; -Выдавать список транспорта, занятого на данном маршруте; -Выдавать список вариантов проезда по данному маршруту (морской и т.д.); -Рассчитывать стоимость услуг, оказанных по перевозке данного груза. Постоянным клиентам предоставляется скидка. -Показывать грузооборот по данному маршруту. +## Готовые запросы: +- Выдавать список маршрутов, обслуживаемых компанией и цену на них; +- Выдавать список транспорта, занятого на данном маршруте; +- Выдавать список вариантов проезда по данному маршруту (морской и т.д.); +- Рассчитывать стоимость услуг, оказанных по перевозке данного груза. Постоянным клиентам предоставляется скидка. +- Показывать грузооборот по данному маршруту. diff --git a/database/init/00init.sql b/database/init/00init.sql index 211141d..b7aa535 100644 --- a/database/init/00init.sql +++ b/database/init/00init.sql @@ -1,49 +1,43 @@ --- -- Сначала создадим базу данных --- DROP DATABASE transport_company; --- CREATE DATABASE transport_company; +CREATE TABLE transport_type ( + id BIGSERIAL PRIMARY KEY, + name TEXT NOT NULL UNIQUE +); --- Переключаемся на базу данных -\c transport_company; -CREATE TABLE Clients ( - id SERIAL PRIMARY KEY, - name VARCHAR(100) NOT NULL, - email VARCHAR(100) UNIQUE NOT NULL, +CREATE TABLE transport ( + id BIGSERIAL PRIMARY KEY, + model TEXT NOT NULL, + capacity INTEGER NOT NULL CHECK (capacity > 0), + type_id BIGINT NOT NULL REFERENCES transport_type(id) ON DELETE CASCADE +); + +CREATE TABLE route ( + id BIGSERIAL PRIMARY KEY, + name TEXT NOT NULL UNIQUE, + price NUMERIC(10,2) NOT NULL CHECK (price >= 0) +); + +CREATE TABLE client ( + id BIGSERIAL PRIMARY KEY, + name TEXT NOT NULL, is_regular BOOLEAN DEFAULT FALSE ); -CREATE TABLE Routes ( - id SERIAL PRIMARY KEY, - name VARCHAR(100) NOT NULL, - start_point VARCHAR(100) NOT NULL, - end_point VARCHAR(100) NOT NULL, - price DECIMAL(10, 2) NOT NULL +CREATE TABLE cargo ( + id BIGSERIAL PRIMARY KEY, + description TEXT NOT NULL, + weight NUMERIC(10,2) NOT NULL CHECK (weight > 0) ); -CREATE TABLE Transport ( - id SERIAL PRIMARY KEY, - type VARCHAR(50) NOT NULL, - capacity DECIMAL(10, 2) NOT NULL, - status VARCHAR(50) DEFAULT 'free' +CREATE TABLE shipment ( + id BIGSERIAL PRIMARY KEY, + route_id BIGINT NOT NULL REFERENCES route(id) ON DELETE CASCADE, + transport_id BIGINT NOT NULL REFERENCES transport(id) ON DELETE CASCADE, + cargo_id BIGINT NOT NULL REFERENCES cargo(id) ON DELETE CASCADE, + client_id BIGINT NOT NULL REFERENCES client(id) ON DELETE CASCADE, + cost NUMERIC(10,2) NOT NULL CHECK (cost >= 0) ); -CREATE TABLE RouteTransport ( - route_id INT REFERENCES Routes(id), - transport_id INT REFERENCES Transport(id), - departure_time TIMESTAMP, - arrival_time TIMESTAMP, - PRIMARY KEY (route_id, transport_id) -); - -CREATE TABLE Cargo ( - id SERIAL PRIMARY KEY, - name VARCHAR(100) NOT NULL, - weight DECIMAL(10, 2) NOT NULL, - route_id INT REFERENCES Routes(id) -); - -CREATE TABLE Orders ( - id SERIAL PRIMARY KEY, - client_id INT REFERENCES Clients(id), - cargo_id INT REFERENCES Cargo(id), - total_cost DECIMAL(10, 2) NOT NULL -); \ No newline at end of file +-- Индексы для оптимизации +CREATE INDEX idx_shipment_route ON shipment(route_id); +CREATE INDEX idx_shipment_transport ON shipment(transport_id); +CREATE INDEX idx_shipment_client ON shipment(client_id); diff --git a/database/init/01insert.sql b/database/init/01insert.sql index 710dd1f..72b31ab 100644 --- a/database/init/01insert.sql +++ b/database/init/01insert.sql @@ -1,23 +1,47 @@ -INSERT INTO Clients (name, email, is_regular) VALUES -('Иван Иванов', 'ivan@example.com', TRUE), -('Петр Петров', 'petr@example.com', FALSE); +-- Типы транспорта +INSERT INTO transport_type (name) VALUES +('Автомобильный'), +('Железнодорожный'), +('Воздушный'), +('Морской'), +('Речной'); -INSERT INTO Routes (name, start_point, end_point, price) VALUES -('Москва - Санкт-Петербург', 'Москва', 'Санкт-Петербург', 5000.00), -('Новосибирск - Владивосток', 'Новосибирск', 'Владивосток', 10000.00); +-- Транспорт +INSERT INTO transport (model, capacity, type_id) VALUES +('Volvo FH16', 20, 1), +('Siemens Vectron', 100, 2), +('Boeing 747', 50, 3), +('Maersk Triple-E', 200, 4), +('Речной баркас', 30, 5); -INSERT INTO Transport (type, capacity, status) VALUES -('Воздушный', 1000.00, 'free'), -('Морской', 5000.00, 'free'); +-- Маршруты +INSERT INTO route (name, price) VALUES +('Москва - Санкт-Петербург', 5000.00), +('Владивосток - Москва', 15000.00), +('Калининград - Новороссийск', 12000.00), +('Сочи - Санкт-Петербург', 8000.00), +('Казань - Екатеринбург', 6000.00); -INSERT INTO RouteTransport (route_id, transport_id, departure_time, arrival_time) VALUES -(1, 1, '2023-10-01 10:00:00', '2023-10-01 12:00:00'), -(2, 2, '2023-10-02 08:00:00', '2023-10-02 20:00:00'); +-- Клиенты +INSERT INTO client (name, is_regular) VALUES +('ООО "Грузоперевозки"', TRUE), +('ЗАО "Быстрая логистика"', FALSE), +('ИП Иванов', TRUE), +('АО "Транспорт-Сервис"', FALSE), +('Физлицо Петров', TRUE); -INSERT INTO Cargo (name, weight, route_id) VALUES -('Электроника', 200.00, 1), -('Мебель', 1000.00, 2); +-- Грузы +INSERT INTO cargo (description, weight) VALUES +('Стройматериалы', 5000.00), +('Продукты питания', 2000.00), +('Одежда и обувь', 1500.00), +('Электроника', 1000.00), +('Автозапчасти', 3000.00); -INSERT INTO Orders (client_id, cargo_id, total_cost) VALUES -(1, 1, 5000.00), -(2, 2, 10000.00); \ No newline at end of file +-- Перевозки (Пример: один маршрут, один транспорт, один груз, один клиент) +INSERT INTO shipment (route_id, transport_id, cargo_id, client_id, cost) VALUES +(1, 1, 1, 1, 4800.00), -- Скидка для постоянного клиента +(2, 2, 2, 2, 15000.00), +(3, 3, 3, 3, 11400.00), -- Скидка для постоянного клиента +(4, 4, 4, 4, 8000.00), +(5, 5, 5, 5, 5700.00); -- Скидка для постоянного клиента diff --git a/internal/domain/routes/routes.go b/internal/domain/routes/routes.go new file mode 100644 index 0000000..89b9529 --- /dev/null +++ b/internal/domain/routes/routes.go @@ -0,0 +1,36 @@ +package domain + +import ( + "time" +) + +// Aggregate Root +type Route struct { + ID int + Name string + StartPoint string + EndPoint string + Price float64 + Transports []TransportAssignment + CreatedAt time.Time + UpdatedAt time.Time +} + +type TransportAssignment struct { + ID int + DepartureTime time.Time + ArrivalTime time.Time +} + +type RouteTransport struct { + ID int + TransportID int +} + +// Repository Interface +type RouteRepository interface { + FindByID(id int) (*Route, error) + FindAll() ([]*Route, error) + Save(route *Route) error + AddTransport(routeID int, assignment TransportAssignment) error +}