fix
This commit is contained in:
parent
f752e46457
commit
2a4d567549
12
Task15.md
12
Task15.md
@ -5,10 +5,10 @@
|
||||
Описание предметной области.
|
||||
|
||||
БД создается для информационного обслуживания сотрудников компании. Компания предоставляет услуги по доставке грузов воздушным, речным, морским путем, по железной дороге или автомобилем по различным маршрутам.
|
||||
Готовые запросы:
|
||||
Выдавать список маршрутов, обслуживаемых компанией и цену на них;
|
||||
Выдавать список транспорта, занятого на данном маршруте;
|
||||
Выдавать список вариантов проезда по данному маршруту (морской и т.д.);
|
||||
Рассчитывать стоимость услуг, оказанных по перевозке данного груза. Постоянным клиентам предоставляется скидка.
|
||||
Показывать грузооборот по данному маршруту.
|
||||
## Готовые запросы:
|
||||
- Выдавать список маршрутов, обслуживаемых компанией и цену на них;
|
||||
- Выдавать список транспорта, занятого на данном маршруте;
|
||||
- Выдавать список вариантов проезда по данному маршруту (морской и т.д.);
|
||||
- Рассчитывать стоимость услуг, оказанных по перевозке данного груза. Постоянным клиентам предоставляется скидка.
|
||||
- Показывать грузооборот по данному маршруту.
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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); -- Скидка для постоянного клиента
|
||||
|
36
internal/domain/routes/routes.go
Normal file
36
internal/domain/routes/routes.go
Normal 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
|
||||
}
|
Loading…
Reference in New Issue
Block a user