
- •Задание на работу
- •0.1. Функциональные требования
- •0.2. Содержание работы
- •1. Разработка функциональных требований к подсистеме
- •2. Разработка проектной модели классов
- •3. Разработка модели хранения
- •4. Разработка физической модели данных и поддерживающих процедур
- •4.1 Процедура, создающая запись в таблице «orders»:
- •4.2 Процедура, добавляющая позицию заказа:
- •4.3 Процедура, изменяющая тип конфигурируемости объекта-изделия:
- •4.4 Процедура, изменяющая конфигурируемость параметра:
- •4.5 Процедура, возвращающая список конфигурируемых параметров данного объекта-изделия:
- •4.6 Процедура, возвращающая список нЕконфигурируемых параметров данного объекта-изделия:
- •4.7 Процедура, возвращающая список всех параметров данного объекта-изделия:
- •4.8 Процедура, возвращающая список вариантов исполнения для данного типового изделия с конфигуратором:
- •4.9 Процедура, создающая вариант исполнения по данному типовому изделию с конфигуратором:
- •4.10 Процедура, создающая типовое изделие с конфигуратором по данному типовому изделию без конфигуратора:
- •4.11 Процедура, выводящая сведения о деталях заказа:
- •4.12 Процедура, связывающая имеющийся параметр с продуктом:
- •4.13 Процедура, задающая значения параметра для продукции:
- •5. Тестирование процедур
4.1 Процедура, создающая запись в таблице «orders»:
функция: create_order - добавление записи в таблицу orders
-- вход:
-- 1. customer_name - название заказчика
-- 2. contact_person_name - контактное лицо
-- 3. order_time - время заказа
-- 4. order_completion_time - время завершения исполнения заказа
-- выход: нет
-- эффекты:
-- 1. создание новой записи в таблице orders
-- требования:
-- 1. передаваемые аргументы должны существовать
def create_order(customer_name, contact_person_name, order_time, order_completion_time):
try:
# Get IDs for customer and contact person
customer_id = get_terminal_classifier_id(customer_name)
contact_person_id = get_product_id(contact_person_name)
# Check if IDs exist
if customer_id is None:
raise ValueError(f"Customer '{customer_name}' does not exist.")
if contact_person_id is None:
raise ValueError(f"Contact person '{contact_person_name}' does not exist.")
# Insert into the orders table
cursor.execute(
"""
INSERT INTO orders (customer, contact_person, order_time, order_completion_time)
VALUES (?, ?, ?, ?)
""",
(customer_id, contact_person_id, order_time, order_completion_time)
)
conn.commit()
print("Заказ успешно создан!")
except sqlite3.Error as e:
print(f"Error creating order: {e}")
except ValueError as ve:
print(f"Validation error: {ve}")
4.2 Процедура, добавляющая позицию заказа:
функция: create_order_pos - добавление записи в таблицу orders_pos
-- вход:
-- 1. order_id_value - id заказа
-- 2. obj_id_value - id продукции на позицию
-- 3. quantity_value - количество продукции в партии в позиции заказа
-- выход: 1 - успех / 0 - иначе
-- эффекты:
-- 1. создание новой записи в таблице orders_pos
-- требования:
-- 1. передаваемые аргументы должны существовать
def create_order_pos(order_id_value, obj_id_value, quantity_value):
try:
# Validate quantity
if quantity_value <= 0:
raise ValueError(f"Кол-во({quantity_value}) должно быть больше 0")
# Check if order exists
cursor.execute('SELECT id FROM orders WHERE id = ?', (order_id_value,))
if cursor.fetchone() is None:
raise ValueError('Заказ должен существовать. Сейчас он не найден.')
# Check if product exists
cursor.execute('SELECT id, configurable_type FROM product WHERE id = ?', (obj_id_value,))
product = cursor.fetchone()
if product is None:
raise ValueError('Добавляемое в заказ изделие должно существовать. Сейчас оно не найдено.')
obj_configurable_type = product[1]
# Дополнительная проверка: configurable_type == 2
if obj_configurable_type == 2:
cursor.execute("""
SELECT id FROM prod_param
WHERE prod_id = ?
""", (obj_id_value,))
param_exists = cursor.fetchone() # Проверяем, есть ли хоть один параметр
if param_exists is None: # Если нет параметров, выбрасываем исключение
raise ValueError('Вариант исполнения без задания значений параметров не может быть добавлен в позицию заказа. Пожалуйста, добавьте значения параметров или выберите существующий вариант исполнения с указанными параметрами')
# Validate product type
if obj_configurable_type not in (0, 2):
print(f'Добавляемое в заказ изделие должно быть вариантом исполнения или изделием без конфигурации. Указано типовое изделие. Будет создан вариант исполнения')
new_variant_id = create_obj_variant(obj_id_value)
print(f'Был создан вариант исполнения с id={new_variant_id}\nЕсли хотите добавить позицию заказа, вызовите функцию create_order_pos() еще раз, передав в качестве id новое id варианта исполнения, которое равно id={new_variant_id}')
return
# Check if order position already exists
cursor.execute('''
SELECT quantity FROM orders_pos
WHERE order_id = ? AND prod_id = ?
''', (order_id_value, obj_id_value))
existing_order = cursor.fetchone()
if existing_order:
# Update quantity if it exists
new_quantity = existing_order[0] + quantity_value
cursor.execute('''
UPDATE orders_pos
SET quantity = ?
WHERE order_id = ? AND prod_id = ?
''', (new_quantity, order_id_value, obj_id_value))
else:
# Insert new order position
cursor.execute('''
INSERT INTO orders_pos (order_id, prod_id, quantity)
VALUES (?, ?, ?)
''', (order_id_value, obj_id_value, quantity_value))
conn.commit()
return 1 if cursor.rowcount == 1 else 0
except (sqlite3.Error, ValueError) as e:
print(f"Ошибка при добавлении позиции в заказ: {e}")
conn.rollback()
return 0