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 @@
-- -- Сначала создадим базу данных
-- 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
);
-- Индексы для оптимизации
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);

View File

@ -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);
-- Перевозки (Пример: один маршрут, один транспорт, один груз, один клиент)
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); -- Скидка для постоянного клиента

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
}