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