Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

МиСПрИС_Задание2_Петрова_Романова_Заболотников_9373

.docx
Скачиваний:
10
Добавлен:
20.06.2023
Размер:
483.9 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

Кафедра информационных систем

отчет

по лабораторной работе №1

по дисциплине «Методы и средства проектирования ИС»

Тема: Моделирование спецификатора изделия

Студентка гр. 9373

Петрова С.В.

Студентка гр. 9373

Романова Е.С.

Студент гр. 9373

Заболотников М.Е.

Преподаватель

Дубенецкий В.А.

Санкт-Петербург

2022

Постановка задачи.

Разработать проект каркаса для работы со спецификациями изделий.

Требования

Разработать проект каркаса для работы со спецификациями изделий.

Обеспечить:

  1. Ведение справочника изделий различных типов, используемых в составе изделий;

  2. Формирование строк спецификаций с указанием норм расхода;

  3. Поиск всех строк спецификации изделия на всю глубину вложенности;

  4. Расчет сводных норм расхода компонентов изделия по ресурсам заданного класса.

Содержание пояснительной записки:

«Введение», «Анализ предметной обрасти», «Разработка объектной модели этапа проектирования», «Разработка модели хранения», «Разработка основных процедур», поддерживающих работы с материальными спецификациями изделий, «Результаты тестирования», «Заключение», «Список использованных источников»)

Предполагаемый объем пояснительной записки:

Не менее 20 страниц.

Дата выдачи задания: 01.09.2022

Дата сдачи отчета:

Дата защиты работы:

Студенты:

Группа

ФИО

Подпись исп.

9373

Заболотников Максим Евгеньевич

9373

Петрова Софья Викторовна

9373

Романова Елизавета Сергеевна

Преподаватель

Дубенецкий В.А.

АННОТАЦИЯ

Приводятся результаты проектирования и фрагменты реализации каркаса, поддерживающего работу с материальными спецификациями изделий. Представлены результаты тестирования разработанных процедур с примерами спецификаций различных изделий.

SUMMARY

The results of the design and fragments of the implementation of the framework supporting work with the material specifications of products are presented. The results of testing the developed procedures with examples of specifications of various products are presented.

Оглавление

Введение………………………………………………………………………

6

Описание выполненной работы……………………………………………..

7

Анализ исходных данных……………………………………………………

7

Разработка функциональных требований к подсистеме…………………..

9

Разработка проектной модели классов……………………………………...

Разработка модели хранения………………………………………………...

Разработка физической модели и процедур поддержки…………………..

Тестирование………………………………………………………….............

Выводы………………………………………………………………………..

Приложение…………………………………………………………………..

Введение

Материальная спецификация изделий является неотъемлемой частью данных об изделии. Эти данные требуются для материального обеспечения изготовления, закупок, хранения. Объем этих данных определяется сложностью изделий и их разнообразием. Материальная спецификация может содержать до нескольких миллионов компонентов, состав компонентов и нормы их расхода непрерывно изменяются при модификации изделий и технологии их изготовления. В этой связи автоматизация процессов работы с материальными спецификациями изделий несомненно актуальна.

Описание выполненной работы

Анализ исходных данных

В качестве исходных данных была взята спецификация сборочной единицы – велосипеда фирмы "Орион".

Ниже представим фрагмент классификатора (см. рис. 1).

Рисунок 1 – Фрагмент классификатора

Пример состава сборки представлен на рис. 2 – 4.

Рисунок 2 – Состав сборки. Часть 1

Рисунок 3 – Состав сборки. Часть 2

Рисунок 4 – Состав сборки. Часть 3

Модель классов этапа анализа представлена на рис. 5.

Рисунок 5 – Модель классов для ведения спецификации материальных ресурсов

Разработка функциональных требований к подсистеме.

Создадим диаграмму вариантов использования с именем Материальная спецификация изделий. Создадим следующие варианты использования. На рис. 6 приведена диаграмма прецедентов Материальная спецификация изделий.

Рисунок 6 – Диаграмма прецедентов Материальная спецификация изделий

Разработка проектной модели классов.

Рисунок 7 – Проектная модель классов для прецедента Управление спецификацией изделия

Разработка модели хранения.

Рисунок 8 – ER-диаграмма для проекта Материальная спецификация изделий

Разработка физической модели и процедур поддержки.

Скрипты метаданных представлены в приложении А.

Тестирование:

Вывод списка всех изделий.

Рисунок 9 – Список всех изделий

Выведем сам спецификатор (состав изделия).

Рисунок 10 – Спецификатор изделий

Вывод.

В данной работе была разработан проект каркаса для работы со спецификациями. Реализация произведена в базе данных PostgreSQL. Проведено тестирование, показывающее корректную работу реализованных функций для работы с данными. Полный код программы можно посмотреть в приложении А.

ПРИЛОЖЕНИЕ А

---НОВАЯ ТАБЛИЦА----

create table Spec_Product --Таблица позиций спецификатора

(

id_variation serial not null primary key,-- id пары главного продукта и используемого

id_mainProduct integer not null, -- id главного продукта

id_useProduct integer not null, --id составного продукта

positionInSP integer not null, -- Номер позиции

countInSP integer not null, -- Количество используемого продукта в главном

flag integer not null,-- Флаг базы

CONSTRAINT id_mainProduct FOREIGN KEY (id_mainProduct)

REFERENCES Product (id_product) MATCH SIMPLE

ON UPDATE NO ACTION

ON DELETE CASCADE

)

create unique index union_MainAndUse on Spec_Product(id_mainProduct, id_useProduct); --Создадим индекс для уникальности пар (главный продукт, составной продукт)

ALTER TABLE Spec_Product ADD CONSTRAINT id_useProduct FOREIGN KEY (id_useProduct)

REFERENCES public.Product (id_product) MATCH SIMPLE

ON UPDATE NO ACTION

ON DELETE cascade

---ФУНКЦИИ-----

-- Добавление элементов в таблицу SP

/*функция: Дообавляет новую позицию в спецификатор и поверяет не создано ли циклов. Если циклы есть, то изменения откатываются

вход: id_mainProductN - ид. продукта главного

id_useProductN - ид. используемого продукта

countInSPN -количество используемого продукта

flagN - флаг базы

эффекты:

1. Если продукта главного или используемого не существует, то будет выведена ошибка.

2. Если при поощи новой позиции был создан цикл, то изменения не будут внесены.

3. Позиция пары будет вычислена автоматически

*/

CREATE OR REPLACE function add_posSP (

id_mainProductN integer,

id_useProductN integer,

countInSPN integer,

flagN integer) RETURNS VOID

as $$

declare ind_mp int default 0;

declare ind_up int default 0;

declare posNew int default 0;

begin

select id_product from product where id_mainProductN = id_product into ind_mp;

select id_product from product where id_useProductN = id_product into ind_up;

if (ind_mp is not null) then

if ind_up is not null then

select max(positioninsp)+1 from spec_product where id_mainProductN = id_mainproduct into posNew;

if posNew is null then

posNew:= 1;

end if;

INSERT INTO spec_product(id_mainproduct, id_useproduct,positioninsp,countinsp,flag) VALUES (id_mainProductN, id_useProductN,posNew,countInSPN,flagN);

if check_loop(id_mainProductN) is not null then

delete from spec_product where id_mainproduct = id_mainProductN and id_useproduct = id_useProductN;

raise exception 'You have created the loop. Db was not updated.';

end if;

else

raise exception 'This using product is not existing. Db was not updated.';

end if;

else

raise exception 'This main product is not existing. Db was not updated.';

end if;

end $$ LANGUAGE plpgsql;

--Удаление Позиции в спецификаторе

/*функция: Удаляет ппозицию в спецификаторе, если заявленный идентификато пары существует

вход: spIdToDelete - id_variation пары, которую нужно удалить

эффекты:

1. Если id пары нет, то будет выведено сообщение об ошибке.

*/

CREATE OR REPLACE function delete_sp (

spIdToDelete integer) RETURNS VOID

as $$

begin

if(select id_variation from spec_product where spIdToDelete = id_variation limit 1) is not null then

DELETE FROM spec_product WHERE spIdToDelete = id_variation;

else

raise exception 'SP with this id does not exist. DB wasnt updated.';

end if;

end $$ LANGUAGE plpgsql;

/*функция: Проверяет наличие циклов и возвращает либо 0, либо число отличное от 0

вход: spIdToCheck - id новой позиции, которая проверяется на создание цикла

выход: id_useproduct - либо id продукта которрый стоит перед заданным в цикле,либо null - если цикла нет

*/

CREATE OR REPLACE function check_loop (

spIdToCheck integer) RETURNS table (id_useproduct int)

LANGUAGE plpgsql as $func$

begin

RETURN QUERY

with recursive graph(id_mainproduct, id_useproduct, path) as (

select sp.id_mainproduct, sp.id_useproduct, CAST (sp.id_useproduct AS TEXT) as PATH

from spec_product as sp where sp.id_mainproduct = spIdToCheck

union all

select spec_product.id_mainproduct, spec_product.id_useproduct, CAST ( graph.PATH ||' = > '|| spec_product.id_useproduct AS TEXT)

from spec_product inner join graph on graph.id_useproduct = spec_product.id_mainproduct

where spec_product.id_mainproduct <> spIdToCheck

)

select graph.id_useproduct from graph where graph.id_useproduct = spIdToCheck limit 1;

end

$func$;

--

/*функция: Выводит все позиции используемых продуктов для заданного и считает количество каждого из них

вход: spIdToCheck - идентификатор того продукта, для которого необходио составить список

выход: Таблица с количеством продукта и его идентификатором

*/

CREATE OR REPLACE function func_count (

spIdToCheck integer) RETURNS table (countProd bigint,id_useproduct int)

LANGUAGE plpgsql as $func$

begin

RETURN QUERY

with recursive graph(id_mainproduct, id_useproduct, path) as (

select sp.id_mainproduct, sp.id_useproduct, CAST (sp.id_useproduct AS TEXT) as PATH

from spec_product as sp where sp.id_mainproduct = spIdToCheck

union all

select spec_product.id_mainproduct, spec_product.id_useproduct, CAST ( graph.PATH ||' = > '|| spec_product.id_useproduct AS TEXT)

from spec_product inner join graph on graph.id_useproduct = spec_product.id_mainproduct

)

select func_price(t1.id, spIdToCheck), id from (select distinct graph.id_useproduct as id from graph) as t1;

end

$func$;

select * from func_price(9,1);

/*функция: Высчитывает количество для заданного продукта

вход: spIdToCheck - идентификатор того продукта, для которого расчитывается количество

выход: Количество продукта

*/

CREATE OR REPLACE function func_price (

spIdToCheck integer, MainIdProd integer) RETURNS table (countprod bigint)

LANGUAGE plpgsql as $func$

begin

RETURN QUERY

with recursive graph(id_mainproductt, id_useproduct, path, countp) as (

select sp.id_mainproduct, sp.id_useproduct, CAST ( sp.id_useproduct|| ' = > ' || sp.id_mainproduct AS TEXT) as path, sp.countinsp

from spec_product as sp where sp.id_useproduct = spIdToCheck

union all

select spec_product.id_mainproduct, spec_product.id_useproduct, CAST ( graph.PATH ||' = > '|| spec_product.id_mainproduct AS TEXT), spec_product.countinsp*graph.countp

from spec_product inner join graph on graph.id_mainproductt = spec_product.id_useproduct

)

select sum (t2.countp) from (select id_mainproductt, countp from graph where id_mainproductt = MainIdProd) as t2;

end

$func$;

/*функция: На основании ранее перечисленных функций объединяет таблицы и выводит позиции для главного продуктав понятном виде

вход: idProd - идентификатор того продукта, для которого выводится список с количеством

выход: Таблица с классом продукта, его названием, количеством и единицой измерения

*/

CREATE OR REPLACE function func_output (

idProd integer) RETURNS table (countProduct bigint, nameProduct text, nameClass text, nameUom text)

LANGUAGE plpgsql as $func$

begin

RETURN QUERY

select t2.countprod, t2.name_product, t2.name_class, uom.name_uom from(

select t1.countprod, t1.name_product, pc.name_class, pc.id_uom from

(select countprod, name_product, id_class from func_count(idProd) as f left join product as p on p.id_product = f.id_useproduct) as t1

left join product_class pc on pc.id_class = t1.id_class) as t2

left join unit_of_measure uom on uom.id_uom = t2.id_uom;

end

$func$;

---------------------------------------------Заполнение таблиц ------------------------------------------------------

select add_class('Велосипед',null,1);

select add_class('Горный',1,1);

select add_class('Спортивный',1,1);

select add_class('Прогулочный',1,1);

select add_class('Колёса', null, 1);

select add_class('БольшиеКолёса', 5, 1);

select add_class('МаленькиеКолёса', 5, 1);

select add_class('СредниеКолёса', 5, 1);

select add_class('Руль', null, 1);

select add_class('ТипА_Р', 9, 1);

select add_class('ТипБ_Р', 9, 1);

select add_class('ТипС_Р', 9, 1);

select add_class('Болты', null, 1);

select add_class('ТипА_Б', 13, 1);

select add_class('ТипБ_Б', 13, 1);

select add_class('ТипС_Б', 13, 1);

select add_class('Крылья', null, 1);

select add_class('Резиновые', 17, 1);

select add_class('Железные', 17, 1);

select add_class('Спицы', null, 1);

select add_class('ТипА_С', 20, 1);

select add_class('ТипБ_С', 20, 1);

select add_class('ТипС_С', 20, 1);

select add_class('Металл', null, 1);

select add_class('ТипА_М', 24, 1);

select add_class('ТипБ_М', 24, 1);

select add_class('ТипС_М', 24, 1);

select add_class('Резина', null, 1);

select add_class('ТипА_Ре', 28, 1);

select add_class('ТипБ_Ре', 28, 1);

select add_class('ТипС_Ре', 28, 1);

select add_class('Рама', null, 1);

select add_class('ТипА_Ра', 32, 1);

select add_class('ТипБ_Ра', 32, 1);

select add_class('ТипС_Ра', 32, 1);

------------------------------------------------

select add_product('Орион',4);

select add_product('БаранийРог',11);

select add_product('Пегас',19);

select add_product('ПерекатиПоле',6);

select add_product('Спайн',35);

select add_product('Звёздочка',15);

select add_product('Дюраль',25);

select add_product('Белая',30);

select add_product('Игла',22);

---------------------------------------------- Собери велосипед

select add_posSP(1,3,1,1);

select add_posSP(1,4,2,0);

select add_posSP(1,5,2,1);

select add_posSP(1,6,1,1);

select add_posSP(6,8,8000,1); --металл

select add_posSP(6,7,15,1); --болты

select add_posSP(7,8,20,1); -- на болты металла

--НА КОЛЁСо

select add_posSP(5,9,500,1); --резина

select add_posSP(5,10,32,1); --спицы

select add_posSP(5,7,2,1); --болты

--Крыло

select add_posSP(4,9,300,1); --резина

--Руль

select add_posSP(3,9,100,1); --резина

select add_posSP(3,8,2000,1); --металл

select add_posSP(3,7,6,1); --болты

--Спицы

select add_posSP(10,8,100,1); --металл

------

select add_posSP(7,1,6,1); --пусть болты содержат велосипед (неверно)

------Вывод количества комплектующих для велосипеда 1

select * from func_output(1);