Грузовая накладная сущность и процедуры заполнение
Ответ нейросети
10 ноября 2025 10:06
Ниже представлен полный разбор задачи: "Грузовая накладная: сущность и процедуры заполнения". Мы рассмотрим как структурировать данные в виде сущности базы данных, какие атрибуты нужны, связи между сущностями и шаги заполнения накладной с примерами.
- Что такое грузовая накладная
- Это документ, которым регистрируются все товары, перевозимые вместе на одном грузовом средстве (автомашине, судне, вокзале и т.д.): состав груза, участники перевозки, маршрут, даты, масса, объем и др.
- Цели: учет, таможенная и транспортная регламентация, контроль погрузки/разгрузки, расчеты, оплаты, отслеживание.
- Сущность данных: основная модель
Основные сущности (таблицы) и их ключевые атрибуты
Manifest (грузовая накладная, заголовок накладной)
- ManifestID (первичный ключ)
- VesselID / VehicleID (ссылка на судно или транспортное средство)
- VoyageNumber или Route (маршрут/рейс)
- Origin (пункт отправления)
- Destination (пункт назначения)
- DepartureDate, ArrivalDate
- ShipperID (FK на Party)
- ConsigneeID (FK на Party)
- NotifyPartyID (FK на Party, может быть NULL)
- TotalWeight (итоговая масса)
- TotalVolume (итоговый объем)
- Status (Draft, Finalized, Exported и т.д.)
- CreatedAt, CreatedBy, UpdatedAt, UpdatedBy
CargoItem (позиции груза в накладной)
- CargoItemID (PK)
- ManifestID (FK на Manifest)
- Description (название позиции)
- HSCode (код HS, для таможни)
- Quantity (количество)
- Unit (единица измерения, например шт., кг, л., палета)
- Weight (масса данного элемента)
- Volume (объем данного элемента)
- Packaging (упаковка, тип)
- ContainerNumber (номер контейнера/места, при наличии)
- HazardCode (код опасности, если есть)
- Class (класс опасности, если применимо)
- PalletInfo (при необходимости, количество палет и т.д.)
Party (участник перевозки: грузоотправитель, грузополучатель, уведомляющее лицо)
- PartyID (PK)
- Name
- Address
- Contact
- Role (Shipper, Consignee, Notify)
Container (контейнеры или секции кузова/паллеты)
- ContainerID (PK)
- ManifestID (FK на Manifest)
- ContainerNumber
- SealNumber
- Size (например 20GP, 40HC)
- Type (Container, Pallet, Loose)
Vessel / Vehicle (средство перевозки)
- VesselID (PK)
- Name
- IMO_Number (для судов)
- Operator
Audit/Reference (для контроля и истории)
- CreatedAt, CreatedBy, UpdatedAt, UpdatedBy
- StatusHistory (optional, для отслеживания изменений)
Связи между сущностями
- Manifest 1:N CargoItem
- Manifest 1:N Container
- Manifest N:1 Vessel/Vehicle
- Manifest N:1 Shipper (Party)
- Manifest N:1 Consignee (Party)
- Manifest N:1 NotifyParty (Party, NULL допустим)
- Пример DDL ( SQL ) для базовой реализации
Пример на синтаксисе PostgreSQL (можно адаптировать под MySQL/MS SQL):
- Таблицы Party и Vessel (упрощенная версия) CREATE TABLE Party ( PartyID BIGINT PRIMARY KEY, Name VARCHAR(255) NOT NULL, Address TEXT, Contact VARCHAR(255), Role VARCHAR(50) NOT NULL );
CREATE TABLE Vessel ( VesselID BIGINT PRIMARY KEY, Name VARCHAR(100), IMONumber VARCHAR(50), Operator VARCHAR(100) );
Таблица Manifest CREATE TABLE Manifest ( ManifestID BIGINT PRIMARY KEY, VesselID BIGINT REFERENCES Vessel(VesselID), VoyageNumber VARCHAR(50), Origin VARCHAR(100) NOT NULL, Destination VARCHAR(100) NOT NULL, DepartureDate DATE, ArrivalDate DATE, ShipperID BIGINT REFERENCES Party(PartyID), ConsigneeID BIGINT REFERENCES Party(PartyID), NotifyPartyID BIGINT REFERENCES Party(PartyID), TotalWeight DECIMAL(12,2), TotalVolume DECIMAL(12,2), Status VARCHAR(20) NOT NULL DEFAULT 'Draft', CreatedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP, CreatedBy VARCHAR(100), UpdatedAt TIMESTAMP, UpdatedBy VARCHAR(100) );
Таблица CargoItem CREATE TABLE CargoItem ( CargoItemID BIGINT PRIMARY KEY, ManifestID BIGINT REFERENCES Manifest(ManifestID), Description TEXT NOT NULL, HSCode VARCHAR(20), Quantity DECIMAL(18,2), Unit VARCHAR(20), Weight DECIMAL(12,2), Volume DECIMAL(12,2), Packaging VARCHAR(100), ContainerNumber VARCHAR(100), HazardCode VARCHAR(50), Class VARCHAR(50), PalletInfo VARCHAR(100) );
Таблица Container CREATE TABLE Container ( ContainerID BIGINT PRIMARY KEY, ManifestID BIGINT REFERENCES Manifest(ManifestID), ContainerNumber VARCHAR(100), SealNumber VARCHAR(100), Size VARCHAR(50), Type VARCHAR(50) );
Пример заполнения (практический пример)
Создаем участников и судно
- Shipper: PartyID = 1, Name = "ООО Поставщик", Role = 'Shipper'
- Consignee: PartyID = 2, Name = "ЗАО Получатель", Role = 'Consignee'
- Notify: NULL или PartyID = 3
- Vessel: VesselID = 10, Name = "MV Logistics", IMO_Number = "IMO1234567"
- Создаем накладную (Manifest)
- ManifestID = 1001
- VesselID = 10
- VoyageNumber = "VOY-2025-08"
- Origin = "Санкт-Петербург, Россия"
- Destination = "Гавана, Куба"
- DepartureDate = 2025-11-15
- ArrivalDate = 2025-12-05
- ShipperID = 1
- ConsigneeID = 2
- TotalWeight = 6500.00
- TotalVolume = 32.00
- Status = 'Draft'
- CreatedBy = 'operator_admin'
- Добавляем позиции груза
CargoItemID = 2001 ManifestID = 1001 Description = "Электронные приборы" HSCode = "8517.12" Quantity = 100 Unit = "шт" Weight = 1500.00 Volume = 4.00 Packaging = "Box" ContainerNumber = NULL HazardCode = NULL Class = NULL
CargoItemID = 2002 ManifestID = 1001 Description = "Сталь профилированная 6м" HSCode = "7216.29" Quantity = 20 Unit = "паллет" Weight = 5000.00 Volume = 28.00 Packaging = "Pallet" ContainerNumber = "CONT1234567" HazardCode = NULL Class = NULL
- Обновляем итоги на основе позиций
- TotalWeight = 1500 + 5000 = 6500
- TotalVolume = 4 + 28 = 32
- Присваиваем контейнер/места
- Container: ContainerID = 3001 ManifestID = 1001 ContainerNumber = "CONT1234567" SealNumber = "SEAL987654" Size = "40GP" Type = "Container"
- Валидация
- Проверка, что сумма весов и объемов соответствует позициям
- Проверка соответствия требования к опасным грузам (если есть)
- Проверка заполненности обязательных полей (Origin, Destination, Dates, ShipperID/ConsigneeID)
- Финализация и экспорт
- Изменяем Status на 'Finalized'
- Производим экспорт в ERP/EDI (например, EDIFACT/XML) или генерируем PDF накладной
- Записываем CREATED/UPDATED логи, сохраняем аудиты
- Процедуры заполнения: пошаговый алгоритм
Шаг 1. Подготовка данных
- Собрать данные о грузе: описание позиций, количество, вес и объем, упаковка, HS-коды и классы опасности при наличии.
- Собрать данные участников: отправитель (Shipper), получатель (Consignee), уведомляющее лицо (Notify, если есть).
- Собрать данные по транспорту: судно/автомобиль, номер рейса/маршрута, даты отгрузки/прибытия.
- Установить маршрут и origin/destination.
Шаг 2. Создание накладной (Manifest)
- Создать запись Manifest с базовыми полями: Origin, Destination, Dates, ShipperID, ConsigneeID, VesselID/Route, Status='Draft', CreatedBy.
- При необходимости создать связи с Vessel и Party (Shipper, Consignee, Notify).
Шаг 3. Ввод позиций груза
- Для каждой позиции создать CargoItem:
- Description, HSCode, Quantity, Unit, Weight, Volume, Packaging, HazardCode/Class (если применимо).
- При позиции без контейнера можно оставить ContainerNumber NULL.
- Указать принадлежность к конкретной накладной ManifestID.
Шаг 4. Расчет итогов
- TotalWeight = сумма Weight по всем CargoItem в данной ManifestID.
- TotalVolume = сумма Volume по всем CargoItem в данной ManifestID.
- Обновить Manifest.TotalWeight и Manifest.TotalVolume.
Шаг 5. Назначение контейнеров/мест
- Если груз разделен по контейнерам, создать записи Container для Manifest:
- ContainerNumber, SealNumber, Size, Type.
- Связать контейнеры с CargoItem по возможности (указать ContainerNumber в соответствующей позиции CargoItem).
Шаг 6. Валидация и контроль
- Обязательные поля заполнены: Origin, Destination, Dates, ShipperID, ConsigneeID, ManifestID.
- Вес и объем не отрицательны; количество неотрицательное.
- При наличии опасных грузов проверить соответствие правил перевозки (DG/IMDG/IATA DGR), HSCode и Class.
- Ограничения по вместимости транспортного средства (при интеграции с планировщиком): суммарный вес/объем не превышают допустимые значения.
Шаг 7. Финализация и экспорт
- Установить Manifest.Status = 'Finalized'
- Сформировать документы:
- Накладная (PDF/Print)
- Уведомление для таможни и перевозчика (EDI/JSON)
- Экспортировать данные в ERP/WMS и/или EDI-систему (например, EDIFACT 856/desadv, JSON API)
Шаг 8. Архивирование и аудит
- Зафиксировать версию накладной, дату изменения, пользователя.
- Хранить историю изменений (optional).
- Пример API/скриптов для заполнения (без привязки к конкретной системе)
Пример JSON для создания накладной через REST API: { "manifest": { "vesselId": 10, "voyageNumber": "VOY-2025-08", "origin": "Санкт-Петербург, Россия", "destination": "Гавана, Куба", "departureDate": "2025-11-15", "arrivalDate": "2025-12-05", "shipperId": 1, "consigneeId": 2, "notifyPartyId": null }, "cargoItems": [ { "description": "Электронные приборы", "hsCode": "8517.12", "quantity": 100, "unit": "шт", "weight": 1500, "volume": 4, "packaging": "Box" }, { "description": "Сталь профилированная 6м", "hsCode": "7216.29", "quantity": 20, "unit": "паллет", "weight": 5000, "volume": 28, "packaging": "Pallet", "hazardCode": null, "class": null } ], "containers": [ { "containerNumber": "CONT1234567", "sealNumber": "SEAL987654", "size": "40GP", "type": "Container" } ] }
Пример SQL-транзакции создания накладной и позиций (упрощённо):
START TRANSACTION;
INSERT INTO Manifest (ManifestID, VesselID, VoyageNumber, Origin, Destination, DepartureDate, ArrivalDate, ShipperID, ConsigneeID, TotalWeight, TotalVolume, Status, CreatedBy) VALUES (1001, 10, 'VOY-2025-08', 'Санкт-Петербург, Россия', 'Гавана, Куба', '2025-11-15', '2025-12-05', 1, 2, 0, 0, 'Draft', 'operator_admin');
INSERT INTO CargoItem (CargoItemID, ManifestID, Description, HSCode, Quantity, Unit, Weight, Volume, Packaging) VALUES (2001, 1001, 'Электронные приборы', '8517.12', 100, 'шт', 1500, 4, 'Box'), (2002, 1001, 'Сталь профилированная 6м', '7216.29', 20, 'паллет', 5000, 28, 'Pallet');
UPDATE Manifest SET TotalWeight = (SELECT SUM(Weight) FROM CargoItem WHERE ManifestID = 1001), TotalVolume = (SELECT SUM(Volume) FROM CargoItem WHERE ManifestID = 1001) WHERE ManifestID = 1001;
COMMIT;
- Практические советы и правила
- Обязательные поля: Origin, Destination, Dates, Shipper, Consignee.
- Валидация HSCode: корректный формат кода и соответствие товарной номенклатуре.
- Учет опасных грузов: Class и HazardCode должны соответствовать требованиям DG-перевозки (IMDG/IATA).
- Аудит и версионирование: сохраняйте историю изменений накладной.
- Интеграции: рекомендуется строить экспорт в ERP/WMS и EDI, чтобы избежать ручного ввода на каждом этапе.
- Безопасность: ограничение доступа к созданию/изменению накладной, журнал действий пользователей.
- Что можно дополнительно разработать (опционально)
- ER-диаграмма или UML-диаграмма класса для наглядности.
- Правила проверки бизнес-логики: например, автоматическое предупреждение о несоответствии веса по отношению к вместимости транспорта.
- Валидация местоположения контейнера по схеме разгрузки.
- Поддержка multi-leg маршрутов: раздельные накладные для каждого участка пути, общий отчет.
Если хотите, могу привести более конкретный пример под ваш контекст (например, под конкретный СУБД, использовать другие названия сущностей, добавить таможенные поля HSCode/UN/National Regulations и т. п.), или выдать готовый набор DDL/SQL-скриптов под PostgreSQL, MySQL или MS SQL.
Понравился ответ?
Задай свой вопрос
Напиши любую задачу или вопрос, а нейросеть её решит



