Практическое закрепление темы 4 (§2.2 с.7–8 учебной программы): проектирование компоновки экранных форм ввода данных в реляционную СУБД, маппинг элементов управления (Masked Input, Combobox/Select, RadioGroup, Checkbox, DatePicker, Master-Detail Grid) на атрибуты таблиц, обеспечение эргономики UI и транзакционной целостности данных.
Контекст предметной области: В корпоративной CRM оптовой компании менеджер оформляет заказ клиента. Документ строится по иерархическому шаблону Master-Detail:
CREATE TABLE wholesale_orders (
order_id BIGSERIAL PRIMARY KEY,
order_number VARCHAR(30) NOT NULL UNIQUE,
client_id INT NOT NULL REFERENCES clients(id),
warehouse_id INT NOT NULL REFERENCES warehouses(id),
order_date DATE NOT NULL,
total_amount NUMERIC(14,2) NOT NULL DEFAULT 0,
status VARCHAR(20) NOT NULL DEFAULT 'draft' CHECK (status IN ('draft', 'confirmed', 'shipped', 'cancelled'))
);
CREATE TABLE wholesale_order_items (
item_id BIGSERIAL PRIMARY KEY,
order_id BIGINT NOT NULL REFERENCES wholesale_orders(order_id) ON DELETE CASCADE,
product_id INT NOT NULL REFERENCES products(id),
quantity NUMERIC(10,3) NOT NULL CHECK (quantity > 0),
unit_price NUMERIC(12,2) NOT NULL CHECK (unit_price >= 0),
discount_percent NUMERIC(5,2) NOT NULL DEFAULT 0 CHECK (discount_percent BETWEEN 0 AND 100),
line_total NUMERIC(14,2) NOT NULL CHECK (line_total >= 0)
);
Опишите логическую структуру формы, взаимное расположение шапки (Master) и спецификации (Detail), порядок обхода фокуса (Tab Order) и действия кнопок управления.
Для каждого элемента формы укажите: тип контрола UI, привязку к колонке таблицы, разделение Display Member / Value Member (для внешних ключей) и правила валидации.
Приведите пример JSON-пакета (DTO), отправляемого формой при клике «Сохранить», и транзакционный SQL-скрипт (BEGIN ... COMMIT), гарантирующий неделимость сохранения шапки и всех позиций.
1. Почему сохранение каждой строки заказа отдельным AJAX-запросом без транзакции недопустимо?
2. Как в выпадающем списке клиентов отделить видимое наименование компании от ID внешнего ключа?
Контекст предметной области: Диспетчер автотранспортного предприятия (АТП) оформляет путевой лист грузового автомобиля перед выездом на рейс и регистрирует показания при возвращении в автопарк:
CREATE TABLE waybills (
waybill_id BIGSERIAL PRIMARY KEY,
waybill_code VARCHAR(25) NOT NULL UNIQUE, -- Маска: ПЛ-9999-9999
vehicle_id INT NOT NULL REFERENCES vehicles(id),
driver_id INT NOT NULL REFERENCES drivers(id),
route_id INT NOT NULL REFERENCES routes(id),
departure_time TIMESTAMP WITH TIME ZONE NOT NULL,
return_time TIMESTAMP WITH TIME ZONE,
odometer_start INT NOT NULL CHECK (odometer_start >= 0),
odometer_end INT CHECK (odometer_end >= odometer_start),
medical_check_passed BOOLEAN NOT NULL DEFAULT FALSE,
technical_check_passed BOOLEAN NOT NULL DEFAULT FALSE,
status VARCHAR(15) NOT NULL DEFAULT 'open' CHECK (status IN ('open', 'completed', 'cancelled')),
CONSTRAINT chk_time CHECK (return_time IS NULL OR return_time > departure_time)
);
Опишите размещение блоков «Транспортное средство и водитель», «Хронометраж рейса», «Показания одометра и допуски». Укажите логику блокировки полей до закрытия смены.
Составьте матрицу привязки контролов UI к колонкам waybills. Опишите маску ввода номера путевого листа, сопряжение DateTimePicker и чекбоксов допуска.
Опишите двухуровневую валидацию: как UI в реальном времени подсвечивает ошибку, если одометр возврата меньше одометра выезда, и какое ограничение СУБД гарантирует целостность на сервере.
1. В каком формате компонент выбора даты обязан передавать значение на бэкенд, чтобы избежать ошибок региональных стандартов?
2. Почему при выборе автомобиля в Combobox необходимо отображать госномер вместе с гаражным номером?
Контекст предметной области: В медицинской информационной системе (МИС) дежурный регистратор оформляет электронную историю болезни при экстренной или плановой госпитализации пациента:
CREATE TABLE hospitalizations (
hospitalization_id BIGSERIAL PRIMARY KEY,
history_number VARCHAR(30) NOT NULL UNIQUE, -- Номер истории болезни
patient_id BIGINT NOT NULL REFERENCES patients(id),
department_id INT NOT NULL REFERENCES departments(id),
attending_doctor_id INT NOT NULL REFERENCES staff(id),
admission_type VARCHAR(15) NOT NULL CHECK (admission_type IN ('emergency', 'planned')),
icd10_code VARCHAR(10) NOT NULL REFERENCES icd10_catalog(code), -- Код МКБ-10
admission_date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
ward_number VARCHAR(10),
consent_signed BOOLEAN NOT NULL DEFAULT FALSE CHECK (consent_signed = TRUE),
status VARCHAR(20) NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'discharged', 'transferred'))
);
Опишите компоновку формы: группировка карточки пациента, параметров отделения и диагноза. Укажите правила автофокуса и подсветку обязательных полей (* NOT NULL).
Сформируйте матрицу соответствия контролов колонкам таблицы. Опишите архитектуру Autocomplete для 14 000 записей МКБ-10 (почему обычный <select> неприменим).
Опишите логику работы зависимых элементов: как выбор значения в выпадающем списке «Отделение» динамически фильтрует список врачей в выпадающем списке «Лечащий врач».
1. Почему сохранение текстового названия диагноза вместо кода МКБ-10 нарушает требования нормализации базы данных?
2. Каким образом маска ввода для СНИЛС защищает базу данных от некорректных значений?
Контекст предметной области: Корпоративный портал технической поддержки (Service Desk). Сотрудник организации отправляет электронный инцидент при возникновении сбоя ПО, оргтехники или сети:
CREATE TABLE service_desk_tickets (
ticket_id BIGSERIAL PRIMARY KEY,
ticket_code VARCHAR(30) NOT NULL UNIQUE, -- Например: INC-2026-00412
requester_id INT NOT NULL REFERENCES employees(id),
category_id INT NOT NULL REFERENCES ticket_categories(id),
priority VARCHAR(15) NOT NULL DEFAULT 'medium'
CHECK (priority IN ('low', 'medium', 'high', 'critical')),
subject VARCHAR(150) NOT NULL,
description TEXT NOT NULL,
room_number VARCHAR(20) NOT NULL,
contact_phone VARCHAR(20) NOT NULL,
status VARCHAR(20) NOT NULL DEFAULT 'new'
CHECK (status IN ('new', 'in_progress', 'resolved', 'closed')),
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
CREATE TABLE ticket_attachments (
attachment_id BIGSERIAL PRIMARY KEY,
ticket_id BIGINT NOT NULL REFERENCES service_desk_tickets(ticket_id) ON DELETE CASCADE,
file_name VARCHAR(255) NOT NULL,
file_size_bytes INT NOT NULL CHECK (file_size_bytes <= 10485760), -- до 10 МБ
mime_type VARCHAR(100) NOT NULL,
storage_path VARCHAR(500) NOT NULL
);
Опишите структуру формы создания заявки. Обоснуйте использование RadioGroup для приоритета вместо обычного выпадающего списка (с точки зрения эргономики UI и скорости оценки инцидента).
Составьте матрицу привязки контролов к таблицам service_desk_tickets и ticket_attachments. Укажите типы данных, ограничения NOT NULL и правила проверки файлов.
Опишите, как в UI реализуется счетчик символов для description, и каким образом файлы загружаются на сервер (сохранение пути storage_path в реляционную таблицу вместо хранения бинарных данных BLOB в основной строке).
1. Почему при создании инцидента поле приоритета обязано иметь значение по умолчанию (DEFAULT)?
2. Какая опасность возникает, если форма не блокирует кнопку «Отправить заявку» после первого нажатия?