This commit is contained in:
Dmitriy Bondarenko 2025-03-27 19:45:30 +00:00
parent f752e46457
commit 2a4d567549
4 changed files with 119 additions and 65 deletions

View File

@ -5,10 +5,10 @@
Описание предметной области. Описание предметной области.
БД создается для информационного обслуживания сотрудников компании. Компания предоставляет услуги по доставке грузов воздушным, речным, морским путем, по железной дороге или автомобилем по различным маршрутам. БД создается для информационного обслуживания сотрудников компании. Компания предоставляет услуги по доставке грузов воздушным, речным, морским путем, по железной дороге или автомобилем по различным маршрутам.
Готовые запросы: ## Готовые запросы:
Выдавать список маршрутов, обслуживаемых компанией и цену на них; - Выдавать список маршрутов, обслуживаемых компанией и цену на них;
Выдавать список транспорта, занятого на данном маршруте; - Выдавать список транспорта, занятого на данном маршруте;
Выдавать список вариантов проезда по данному маршруту (морской и т.д.); - Выдавать список вариантов проезда по данному маршруту (морской и т.д.);
Рассчитывать стоимость услуг, оказанных по перевозке данного груза. Постоянным клиентам предоставляется скидка. - Рассчитывать стоимость услуг, оказанных по перевозке данного груза. Постоянным клиентам предоставляется скидка.
Показывать грузооборот по данному маршруту. - Показывать грузооборот по данному маршруту.

View File

@ -1,49 +1,43 @@
-- -- Сначала создадим базу данных CREATE TABLE transport_type (
-- DROP DATABASE transport_company; id BIGSERIAL PRIMARY KEY,
-- CREATE DATABASE transport_company; name TEXT NOT NULL UNIQUE
);
-- Переключаемся на базу данных CREATE TABLE transport (
\c transport_company; id BIGSERIAL PRIMARY KEY,
CREATE TABLE Clients ( model TEXT NOT NULL,
id SERIAL PRIMARY KEY, capacity INTEGER NOT NULL CHECK (capacity > 0),
name VARCHAR(100) NOT NULL, type_id BIGINT NOT NULL REFERENCES transport_type(id) ON DELETE CASCADE
email VARCHAR(100) UNIQUE NOT NULL, );
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 is_regular BOOLEAN DEFAULT FALSE
); );
CREATE TABLE Routes ( CREATE TABLE cargo (
id SERIAL PRIMARY KEY, id BIGSERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL, description TEXT NOT NULL,
start_point VARCHAR(100) NOT NULL, weight NUMERIC(10,2) NOT NULL CHECK (weight > 0)
end_point VARCHAR(100) NOT NULL,
price DECIMAL(10, 2) NOT NULL
); );
CREATE TABLE Transport ( CREATE TABLE shipment (
id SERIAL PRIMARY KEY, id BIGSERIAL PRIMARY KEY,
type VARCHAR(50) NOT NULL, route_id BIGINT NOT NULL REFERENCES route(id) ON DELETE CASCADE,
capacity DECIMAL(10, 2) NOT NULL, transport_id BIGINT NOT NULL REFERENCES transport(id) ON DELETE CASCADE,
status VARCHAR(50) DEFAULT 'free' 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), CREATE INDEX idx_shipment_route ON shipment(route_id);
transport_id INT REFERENCES Transport(id), CREATE INDEX idx_shipment_transport ON shipment(transport_id);
departure_time TIMESTAMP, CREATE INDEX idx_shipment_client ON shipment(client_id);
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
);

View File

@ -1,23 +1,47 @@
INSERT INTO Clients (name, email, is_regular) VALUES -- Типы транспорта
('Иван Иванов', 'ivan@example.com', TRUE), INSERT INTO transport_type (name) VALUES
('Петр Петров', 'petr@example.com', FALSE); ('Автомобильный'),
('Железнодорожный'),
('Воздушный'),
('Морской'),
('Речной');
INSERT INTO Routes (name, start_point, end_point, price) VALUES -- Транспорт
('Москва - Санкт-Петербург', 'Москва', 'Санкт-Петербург', 5000.00), INSERT INTO transport (model, capacity, type_id) VALUES
('Новосибирск - Владивосток', 'Новосибирск', 'Владивосток', 10000.00); ('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'), INSERT INTO route (name, price) VALUES
('Морской', 5000.00, 'free'); ('Москва - Санкт-Петербург', 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'), INSERT INTO client (name, is_regular) VALUES
(2, 2, '2023-10-02 08:00:00', '2023-10-02 20:00:00'); ('ООО "Грузоперевозки"', TRUE),
('ЗАО "Быстрая логистика"', FALSE),
('ИП Иванов', TRUE),
('АО "Транспорт-Сервис"', FALSE),
('Физлицо Петров', TRUE);
INSERT INTO Cargo (name, weight, route_id) VALUES -- Грузы
('Электроника', 200.00, 1), INSERT INTO cargo (description, weight) VALUES
('Мебель', 1000.00, 2); ('Стройматериалы', 5000.00),
('Продукты питания', 2000.00),
('Одежда и обувь', 1500.00),
('Электроника', 1000.00),
('Автозапчасти', 3000.00);
INSERT INTO Orders (client_id, cargo_id, total_cost) VALUES -- Перевозки (Пример: один маршрут, один транспорт, один груз, один клиент)
(1, 1, 5000.00), INSERT INTO shipment (route_id, transport_id, cargo_id, client_id, cost) VALUES
(2, 2, 10000.00); (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); -- Скидка для постоянного клиента

View File

@ -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
}