
- •Задание на работу
- •1.1. Разработать проект каркаса для работы со спецификациями изделий
- •1.2. Содержание работы
- •1.3. Исходные данные для задачи
- •1.4. Рекомендуемые инструменты
- •1.5. Рекомендуемые источники
- •Аннотация
- •1. Анализ исходных данных
- •2. Разработка функциональных требований к подсистеме
- •3. Разработка проектной модели классов
- •4. Разработка модели хранения
- •5. Реализация
- •Процедура, создающая запись в таблице «func»:
- •Процедура, создающая запись в таблице «prod_spec»:
- •Процедура, создающая запись в таблице «predicate»:
- •Процедура, создающая запись в таблице «func_body»:
- •Процедура, вычисляющая допустимость данного варианта исполнения согласно спецификациями заданным для его типового изделия с конфигуратором:
- •Вспомогательная процедура(проверяет спецификацию для продукции конкретного экземпляра) для процедуры check_spec_obj_variant(obj_id_val: int)
- •6. Тестирование
Процедура, создающая запись в таблице «func»:
def create_func(new_name: str, new_class_id: int) -> int:
try:
# Проверка на существование записи с таким именем
cursor.execute("SELECT COUNT(*) FROM func WHERE name = ?", (new_name,))
is_already_exist = cursor.fetchone()
print(f'is_already_exist - {is_already_exist}')
if is_already_exist and is_already_exist[0] != 0:
raise ValueError(f'Функция с именем \"{new_name}\" уже существует в таблице func')
# Проверка, существует ли class_id в таблице terminal_classifier
cursor.execute("SELECT COUNT(*) FROM terminal_classifier WHERE id = ?", (new_class_id,))
if cursor.fetchone()[0] == 0:
raise ValueError(f'Класса с id={new_class_id} не существует в таблице terminal_classifier')
# Вставка новой записи
cursor.execute(
"INSERT INTO func(name, class_id) VALUES (?, ?)",
(new_name, new_class_id)
)
conn.commit()
# Получение id последней вставленной записи
cursor.execute("SELECT last_insert_rowid();")
new_id = cursor.fetchone()[0]
print(f'создана новая функция с именем=\"{new_name}\" для класса с id=\"{new_class_id}\"')
return new_id
except (sqlite3.Error, ValueError) as e:
print(f'Ошибка при создании функции в create_func: {e}')
Процедура, создающая запись в таблице «prod_spec»:
def create_obj_spec(new_obj_id: int, new_func_id: int) -> int:
try:
cursor.execute("SELECT COUNT(*) FROM prod_spec WHERE prod_id = ? AND func_id = ?", (new_obj_id, new_func_id))
is_already_exist = cursor.fetchone()
if is_already_exist:
is_already_exist = is_already_exist[0]
if is_already_exist:
raise ValueError(f'ошибка! запись с prod_id={new_obj_id} и func_id={new_func_id} уже существует в таблице prod_spec')
cursor.execute("SELECT configurable_type FROM product WHERE id = ?;", (new_obj_id,))
result = cursor.fetchone()
if not result or result[0] != 1:
raise ValueError(f"Object with id {new_obj_id} is not a configurable type.")
cursor.execute("INSERT INTO prod_spec (prod_id, func_id) VALUES (?, ?)", (new_obj_id, new_func_id))
conn.commit()
print(f'в таблицу prod_spec успешно добавлена новая запись с prod_id={new_obj_id} и func_id={new_func_id}')
return cursor.rowcount
except (sqlite3.Error, ValueError) as e:
print(f'Ошибка при создании спецификации объекта в create_obj_spec: {e}')
conn.rollback()
return 0
Процедура, создающая запись в таблице «predicate»:
def create_predicate(new_op_id: int, new_param_id: int, new_enum_pos_id: int) -> int:
try:
cursor.execute('SELECT id FROM terminal_classifier WHERE terminal_classifier_name = ?', (ENUM_OPERATORS_CLASS_NAME,))
op_enum_class_id = cursor.fetchone()
if op_enum_class_id:
op_enum_class_id = op_enum_class_id[0]
else:
raise ValueError(f'не найдено id класса перечисления \"{ENUM_OPERATORS_CLASS_NAME}\". проверьте существование класса перечисления \"{ENUM_OPERATORS_CLASS_NAME}\" ')
cursor.execute('SELECT COUNT(*) from predicate WHERE operator_id=? AND param_id=? AND enum_pos_id=?', (new_op_id, new_param_id, new_enum_pos_id,))
is_already_exist = cursor.fetchone()
if is_already_exist:
is_already_exist = is_already_exist[0]
if is_already_exist:
raise ValueError(f'ошибка! запись в таблице predicate с такими параметрами: \nid=\"{new_op_id}\", param_id=\"{new_param_id}\", enum_pos_id=\"{new_enum_pos_id}\" уже существует.')
# enum_id - класс_id перечисления (плохой нейминг, но лень фиксить)
cursor.execute("SELECT enum_id FROM enum WHERE id = ?;", (new_op_id,))
if cursor.fetchone()[0] != op_enum_class_id:
raise ValueError(f"Оператор не принадлежит перечислению операторов {op_enum_class_id}.")
cursor.execute(
"INSERT INTO predicate(operator_id, param_id, enum_pos_id) VALUES (?, ?, ?)",
(new_op_id, new_param_id, new_enum_pos_id)
)
conn.commit()
cursor.execute("SELECT last_insert_rowid();")
new_id = cursor.fetchone()[0]
print(f'создан новый предикат с id=\"{new_op_id}\", param_id=\"{new_param_id}\", enum_pos_id=\"{new_enum_pos_id}\"')
return new_id
except (sqlite3.Error, ValueError) as e:
print(f'Ошибка при создании предиката в create_predicate: {e}')