Веб-ориентированная подсистема учета работ на железной дороге

 

Міністерство освіти і науки України, молоді та спорту України

ДВНЗ «Донецький національний технічний університет»

Факультет КНТ

Кафедра автоматизованих систем управління

"Затверджено"

_______________________

підпис викладача-керівника

_________________20__ р.

Завдання на курсову роботу

з дисципліни "Проектування веб-орієнтованих компютерних систем"

студенту групи ІУС-12м Авджи Ніни Іллівни___________________________

(група, прізвище, імя, по-батькові студента у родовому відмінку)

1.Тема курсової роботи: Спроектувати веб-орієнтовану підсистему обліку робіт на залізниці.__________________________________________

(назва предметної області)

2.Вхідні дані:

3.Перелік питань, що підлягають розробці:

4.Рекомендовані засоби:

сховище даних: реляційна СУБД MySQL.

засіб розробки програмного додатку PHP, JavaScript

Рекомендована література:

6. Зміст пояснювальної записки: типовий, згідно стандартів .

7. Термін здачі роботи на кафедру:

. Дата захисту роботи за графіком:

Завдання видано 05/09/2012.

Завдання видав_________________________________доц. Мартиненко Т.В.

(підпис, посада, ПІБ викладача-керівника)

Консультант_________________доц. Мартиненко Т.В.,асс. Андрієвська Н.К.

(підпис, посада, ПІБ викладача-консультанта)

Завдання до виконання прийняв_____________________________________.

(підпис, ПІБ студента)

РЕФЕРАТ


Цель курсовой работы - разработать компьютеризированную подсистему «Управления движением поездов».

Задачи курсовой работы:

. Анализ основных факторов (незапланированные «окна» в графике движения поездов, возникающие внештатные ситуации (и, как следствие, изменение пропускной способности), ограничения скорости движения поездов на участках, наличие и возможность подвязки локомотивов и локомотивных бригад), влияющих на организацию поездной и местной работы на станциях, участках, полигонах сети;

. Исследование эксплуатационной работы, обеспечивающей рациональный уровень качества перевозочного процесса;

. Изучение технологии организации перевозок на основе твердого графика движения поездов, системы идентификации подвижного состава, методов планирования и управления.

. Выполнение обзора существующих систем

ПЕРЕЧЕНЬ УСЛОВНЫХ ОБОЗНАЧЕНИЙ И СОКРАЩЕНИЙ


БД - база данных.

КП - компьютеризированная подсистема.

МД - модель данных.

ПО - программное обеспечение.

ВВЕДЕНИЕ


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

Железные дороги Украины из-за простоя и задержек полувагонов на подъездных путях за 6 месяцев 2012 года не смогли задействовать в перевозочном процессе 153,649 тыс. полувагонов и недополучили, таким образом, более 96 млн. грн.

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

1. ТЕХНИЧЕСКОЕ ЗАДАНИЕ НА РАЗРАБОТКУ СИСТЕМЫ


1.1 Назначение системы


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

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


1.2 Цели создания системы


Целями создания подсистемы являются:

повышение эффективности использования подвижного состава;

повышение эффективности планирования работы станций, отделений железной дороги;

повышение эффективности планирования человеческих и материальных ресурсов различных служб:

) службы перевозок (загрузки станций и перегонов);

) локомотивной (оптимизация использования локомотивов и локомотивных бригад);

) службы пути и службы автоматики и телемеханики (техническое обслуживание и ремонт пути);

повышение эффективности местной работы;

Достичь поставленных целей может комплексное решение задач:

анализ основных факторов (незапланированные «окна» в графике движения поездов, возникающие внештатные ситуации (и, как следствие, изменение пропускной способности), ограничения скорости движения поездов на участках, наличие и возможность подвязки локомотивов и локомотивных бригад), влияющих на организацию поездной и местной работы на станциях, участках, полигонах сети;

исследование эксплуатационной работы, обеспечивающей рациональный уровень качества перевозочного процесса;

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


1.3 Требования к подсистеме


Требования, которые заложены в подсистему:

надёжность, использование СУБД, которые зарекомендовали себя, обеспечивающие высокий уровень надежности;

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

широкие функциональные возможности, подсистема предоставляет полный набор функциональных возможностей необходимых современному пользователю;

простота использования;

удобство предоставления информации;

Требования к информационному обеспечению:

обеспечение конфиденциальности секретной информации;

достаточная производительность доступа к данным при выполнении запроса;

правильный отбор первичных сведений и источников информации;

правильная систематизация и классификация информации.

Требования к языкам программирования

Для написания статичных страниц должен быть использован язык разметки html 5, для написания интерактивных элементов клиентской части и динамических страниц должен использоваться скриптовый язык php.

Требования к режиму работы:

Система должна функционировать непрерывно и круглосуточно без вмешательства технических администраторов.

Требования к диагностированию:

Диагностирование системы должно выполняться с целью своевременного предупреждения возникновения аварийных ситуаций.

Требования к защите информации от несанкционированного доступа:

идентификация, проверка подлинности и контроль доступа субъектов;

шифрование конфиденциальной информации;

обеспечение целостности программных средств и обрабатываемой информации;

физическая охрана средств вычислительной техники и носителей информации;

использование сертифицированных средств защиты.

Требования к эргономике и эстетике:

. Минимальное расширение для корректной работы сайта 1024х768.

. Максимальное расширение неограниченно.

. Элементы управления должны быть сгруппированы однотипно-горизонтально или вертикально - на всех страницах.

. На каждой странице должны отображаться логотип и контактная информация.

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

Требования к ссылкам:

Все ссылки на сайте должны быть относительными, кроме внешних.

Язык интерфейса: русский.

Требования к размеру страницы:

Все элементы дизайна должны быть сжаты таким образом, чтобы размер страницы не превышал 50кб.

Требования к серверной части:

Системные требования:

процессор - 2 ядра, не менее 512МБ ОЗУ, жесткий диск не менее 250 ГБ.

операционная система: Linux, Windows.

версия Apache: 1.3.41+,

версия MySQL: 5.0+,

версия PHP: 5.1+.

Требования к пользовательской части:

Веб-система должна корректно отображаться в следующих браузерах - Internet Explorer 6.0+, Оpеra 9.2+, Firefox 2.0+, Safari 2.0+, Chrome 2+.

Требования к функциям

. Определение положения поездов

Описание: диспетчер вводит данные о маршруте в форму и отправляет данные контент-менеджеру.

Входные данные: времена хода поездов по перегонам, нормы времени на разгон и замедление, нормативы продолжительности стоянок поездов на промежуточных станциях для выполнения технических и коммерческих операций, нормативы оборота локомотивов в депо для выполнения технического обслуживания и расчетные минимальные интервалы между поездами при приеме, отправлении и проследовании их через станции (станционные интервалы), а также интервалы между поездами, следующими в пакете (межпоездные интервалы), названия участка, где производятся работы, вид работ и время работы (от 1 часа до 6 часов), сходы составов, неисправности пути, задержка поездов более часа, отказы технических средств.

Выходные данные: данные в виде массива.

. Анализ движения поездов. Описание: контент-менеджер анализирует данные, полученные от диспетчеров в виде массива сортирует их по станциям хода следования поезда

Входные данные: массив данных.

Выходные данные: графическое отображение маршрута поезда с указанными временными интервалами в декартовой системе координат, где ось Х - ось времени, ось У - ось расстояния с учетом всех неисправностей.

. Ведение информации о расположении поездов. Диспетчер ставит задачи машинистам и трудовым бригадам.

Входные данные: график движения поездов.

Выходные данные: постановка задач, координация работы, отслеживание движения поезда на больших расстояниях.

. Статистика отказа по перегонам.

Входная информация: номер и название перегона, состав, тип отказа.

Выходная информация: круговая диаграмма простоя поездов.

Требования к программному обеспечению

Требования к программному обеспечению серверной части.

Для функционирования ВБС, на сервере должно быть следующее программное обеспечение:

СУБД - MySQL;Server - Denver; - Drupal.

Требования к клиентскому программному обеспечению.

ВБС должна быть доступна для полнофункционального пользования и просмотра с помощью следующих браузеров:2.0 и в их более поздние версии;

ВБС Должна быть дееспособна, то есть информация, размещенная на ней, должна быть доступна, при отключенной в браузере поддержки flash і JavaScript.

Требования к техническому обеспечению

Техническое обеспечение системы должно максимально и наиболее эффективным образом использовать существующие технические средства. В состав системы должны входить следующие технические средства:

процессор с тактовой частотой не менее: 1,4 ГГц или выше;

ГБ или более оперативной памяти (ОЗУ);

жесткий диск 120 Гб или более;

графический адаптер;дисковод;

клавиатура и мышь;

сетевой интерфейс 100 мб/сек или более;

Требования к приему-сдаче проекта.

Сдача-приём работы производится поэтапно, в соответствии с рабочей программой и календарным планом.

Сдача-прием осуществляется комиссией, в состав которой входят руководитель курсовой работы и студент-исполнитель. По результатам приема подписывается пояснительная записка и студент получает зачет.

Все создаваемые в рамках настоящей работы программные продукты передаются руководителю, как в виде готовых модулей, так и в виде исходных кодов, представляемых в электронной форме на стандартном машинном носителе (например, на компакт-диске).

Требования к представлению системы

Администратор, который в нашей системе имеет имя Nina, может управлять сайтом и имеет права и менеджера, и диспетчера.

Менеджер может создавать маршруты и управлять ими, создавать перегоны и управлять ими, создавать рейсы и управлять ими, создавать составы и управлять ими и проводить анализ положения составов и предоставлять статистику отказов поездов.

Диспетчер может создавать задачи и управлять ими, регистрировать отказ технических средств и управлять ими, создавать технические работы и управлять ими.

Есть возможность просмотра списка задач для технических бригад на каждой станции.

Макеты страниц для работы диспетчера разработанной системы приведены ниже.


Рисунок 1.1 - Создание технической работы


Рисунок 1.2 - Просмотр всех технических работ


Рисунок 1.3 - Создание отказа технических средств


Рисунок 1.4 - Просмотр всех отказов технических средств


Рисунок 1.5 - Создание задачи трудовой бригаде


Рисунок 1.6 - Просмотр всех задач

Макеты страниц для работы менеджера разработанной системы приведены ниже.


Рисунок 1.7 - Создание маршрута


Рисунок 1.8 - Просмотр всех маршрутов


Рисунок 1.9 - Создание перегона


Рисунок 1.10 - Просмотр всех перегонов

Рисунок 1.11 - Создание рейса


Рисунок 1.12 - Просмотр рейсов


Рисунок 1.13 - Создание состава


Рисунок 1.14 - Просмотр всех составов


Рисунок 1.15 - Анализ движения состава


Рисунок 1.16 - Статистика отказа по перегонам


Макет страницы для работы рабочей бригады разработанной системы приведен ниже.


Рисунок 1.17 - Просмотр задач, поставленных бригадам

2. РАЗРАБОТКА ИНФОРМАЦИОННОГО ОБЕСПЕЧЕНИЯ


.1 Разработка логической модели данных


Была разработана база данных «railway», которая содержит информацию, необходимую для учета передвижения поездов. База данных содержит 8 таблиц: тЗадача, тЗадержка, тМаршрут, тПерегон, тРейс, тСостав, тТехработа, тПользователи.

Стуктура БД и таблиц приведена ниже в таблицах 2.2-2.11.

БД должна помочь диспетчеру и менеджеру ускорить работу и облегчить ведение учета передвижения поездов и постановки задач рабочим бригадам. Для разработки БД была выбрана СУБД phpMyAdmin, а диаграмма разработана в Microsoft SQL Server 2008 Managment Studio.

В таблице 2.1 представлены сущности логической модели данных, а также их описание.


Таблица 2.1 - Сущности логической МД базы данных «railway»

№ ппИмя таблицыНазначение1тЗадачаОпределяет задачу, которую диспетчер может поставить рабочей бригаде2т ЗадержкаОпределяет задержку состава на перегоне, вызванной неисправностью либо другими причинами3тМаршрутОписывает маршрут следования состава4тПерегонОпределяет часть железнодорожной линии между смежными раздельными пунктами5тРейсОписывает поезд на заданном маршруте, который отправляется в заданное время6тСоставОпределяет новый состав (поезд)7тТехработаОпределяет работу, связанную с обслуживанием путей8тПользователиПрофили пользователейОпределим типы связей между сущностями и индексы обеспечивающие целостность данных. Описание характера связей в БД и условия целостности приведены в табл. 2.2.


Таблица 2.3 - Связи между сущностями

Родительская таблицаДочерняя таблицаТип связиИмяИндексИмяИндексСоставPK_составРейсFK_состав1:?СоставPK_составЗадержкаFK_состав1:?МаршрутPK_маршрутРейсFK_маршрут1:?ПерегонPK_перегонМаршрутFK_перегон1:?ПерегонPK_перегонТехработаFK_перегон1:?ПерегонUQ_начальная_станцияПользователиFK_начальная_станция1:?ПользователиFK_рабочая бригадаЗадачаUQ_рабочая бригада1:?ПерегонUQ_конечная_станцияПользователиFK_начальная_станция1:?ПерегонPK_перегонЗадержкаFK_перегон1:?

Определим свойства таблиц и полей так, чтобы обеспечить максимальный контроль данных.


Таблица 2.4 - Структура таблицы тЗадача (task)

№ЗаголовокНазваниеТип1Тип задачиfield_task_type_idЦелое число2Рабочая бригадаfield_team_idСсылка на пользователя

Таблица 2.5 - Структура таблицы тМаршрут (route)

№ЗаголовокНазваниеТип1Перегонfield_stage_idСсылка на материал2Станция отправленияfield_start_station_idСсылка на пользователя3Станция прибытияfield_end_station_idСсылка на пользователяТаблица 2.6 - Структура таблицы тПерегон (stage)

№ЗаголовокНазваниеТип1Начальная станцияfield_stage_start_station_idСсылка на пользователя2Конечная станцияfield_stage_end_station_idСсылка на пользователя3Длина перегонаfield_stage_distanceЧисло с плавающей точкой

Таблица 2.7 - Структура таблицы тРейс (trip)

№ЗаголовокНазваниеТип1Маршрутfield_route_idСсылка на материал2Составfield_train_idСсылка на материал3Время отправленияfield_departure_timeДата

Таблица 2.8 - Структура таблицы тТехработа (work)

№ЗаголовокНазваниеТип1Перегонfield_stage_idСсылка на материал2Вид работfield_work_type_idЦелое число3Время работfield_work_timeЦелое число

Таблица 2.9 - Структура таблицы тСостав (train)

№ЗаголовокНазваниеТип1Тип перевозокfield_transport_type_idЦелое число2Количество вагоновfield_wagon_qtyЦелое число3Время разгонаfield_acceleration_timeЦелое число4Время торможенияfield_braking_timeЦелое число5Скоростьfield_speedЦелое число

Таблица 2.10 - Структура таблицы тЗадержка (delay)

№ЗаголовокНазваниеТип1Тип отказаfield_failure_type_idЦелое число2Перегонfield_stage_idСсылка на материал3Составfield_train_idСсылка на материал

Таблица 2.11 - Структура таблицы тПользователи (users)

№ЗаголовокНазваниеТип1Название станцииProfile_station_nameTextfield2Межпоездной интервалProfile_train_intervalTextfield3Технические операцииProfile_technical_operationsTextfield4Коммерческие операцииProfile_commercial_operationsTextfield

2.2 Разработка физической модели данных


Физическая модель данных приведена на рисунке. 2.1.


Рисунок 2.1 - Физическая модель данных

3. РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ


.1 Разработка диаграммы классов


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


Таблица 3.1 - Классы системы для диспетчера

КлассСтереотипНазначениеindex.phpServer PageПостроение главной страницыindex.htmlClient PageОтображение главной страницыstationinfo.phpServer PageПостроение страницы информации о станцияхstationinfo.htmlClient PageОтображение страницы информации о станцияхstationinfoFormФорма для ввода информации о станцияхdelaystat.phpServer PageПостроение страницы статистики отказовdelaystat.htmlClient PageОтображение страницы статистики отказовtaskmanage.phpServer PageПостроение страницы управления задачамиtaskmanage.htmlClient PageОтображение страницы управления задачамиtaskaction.phpServer PageПостроение страницы создания задачtaskcreateedit.htmlClient PageОтображение страницы создания задачtaskFormФорма для ввода задачdelaymanage.phpServer PageПостроение страницы управления отказамиdelaymanage.htmlClient PageОтображение страницы управления отказамиdelayaction.phpServer PageПостроение страницы создания отказовdelaycreateedit.htmlClient PageОтображение страницы создания отказовdelayFormФорма для ввода информации об отказахworkmanage.phpServer PageПостроение страницы управления техработамиworkmanage.htmlClient PageОтображение страницы управления техработамиworkaction.phpServer PageПостроение страницы создания техработworkcreateedit.htmlClient PageОтображение страницы создания техработworkFormФорма для ввода данных о техработах

Диаграмма классов приведена в приложении А.

Разработка диаграммы классов для менеджера.

Таблица 3.2 - Классы системы для менеджера

КлассСтереотипНазначениеindex.phpServer PageПостроение главной страницыindex.htmlClient PageОтображение главной страницыstagemanage.phpServer PageПостроение страницы управления перегонамиstagemanage.htmlClient PageОтображение страницы управления перегонамиstageaction.phpServer PageПостроение страницы создания перегонаstagecreateedit.htmlClient PageОтображение страницы создания перегонаstageFormФорма для создания перегонаanalyzeposition.phpServer PageПостроение страницы анализа положения поездовanalyzeposition.htmlClient PageОтображение страницы анализа положения поездовtrainmanage.phpServer PageПостроение страницы управления составамиtrainmanage.htmlClient PageОтображение страницы управления составамиtrainaction.phpServer PageПостроение страницы создания составовtraincreateedit.htmlClient PageОтображение страницы создания составовtrainFormФорма для ввода данных о составеtripmanage.phpServer PageПостроение страницы управления рейсамиtripmanage.htmlClient PageОтображение страницы управления рейсамиtripaction.phpServer PageПостроение страницы создания рейсаtripcreateedit.htmlClient PageОтображение страницы создания рейсаtripFormФорма для ввода данных о рейсеrouteaction.phpServer PageПостроение страницы создания маршрутаroutecreateedit.htmlClient PageОтображение страницы создания маршрутаrouteFormФорма для ввода данных о маршрутеroutemanage.phpServer PageПостроение страницы управления маршрутамиroutemanage.htmlClient PageОтображение страницы управления маршрутами

Диаграмма классов приведена в приложении А.


3.2 Разработка схемы взаимодействия объектов системы


Схема иерархии пользователей приведена на рисунке 3.1

Рисунок 3.1 - Иерархия пользователей


Диаграмма вариантов использования приведена на рисунке 3.2.


Рисунок 3.2 - Диаграмма вариантов использования


3.3 Описание программных модулей системы


Рассмотрим наиболее важные модули, которые использовались при проектировании системы:

) сck - система создания контента. Позволяет очень гибко управлять материалами на сайте, создавать различные типы полей контента, а также задавать способ отображения этих полей.

) devel - предоставляет различные инструменты (блоки, страницы и функции) для разработчиков.В частности используется возможность быстрого переключения пользователей.

) dhtml_menu - динамически открывает меню, чтобы уменьшить количество переходов по страницам.

) date - предоставляет поля даты для CCK и Views.

) l10n_update - предоставляет возможность автоматической загрузки и обновления переводов.

) potx - обеспечивает web-интерфейс и API-интерфейс, чтобы извлечь переводимый текст из строк установленных модулей.

) views - обеспечивает гибкое управление для разработчиков тем, какие списки составлять, что в них выводить, как по ним искать, в какой форме выводить. Можно сделать галереи изображений и т.д. В Drupal жёстко определены такие списки как термины таксономии и последние изменения на сайте. Модуль позволяет менять их и составлять новые.

) views_customfield - предоставляет дополнительные типы столбцов для модуля views. В частности используется тип столбца phpcode, который позволяет встраивать во views исполняемый код.

) open_flash_chart_api - предоставляет программный интерфейс к функциям обработки графиков.

) railway - наш модуль, предоставляет функции анализа движения и статистки отказов.

4. ТЕСТИРОВАНИЕ ВЕБ-БАЗИРОВАННОЙ СИСТЕМЫ


Зайдем в систему с правами диспетчера и создадим Задачу для локомотивной бригады. Для этого выберем пункт меню «Задачи» и подменю «Создать задачу», после создания сохраним ее и просмотрим внесенные данные, выбрав пункт подменю «Управлять задачами». Созданные задачи можно изменить либо удалить.


Рисунок 4.1 - Создание задачи


Рисунок 4.2 - Просмотр созданной задачи


Теперь создадим отказ технических средств, выбрав пункт меню «Отказы техсредств» и подпункт меню «Регистрировать отказ техсредств», выбрав пункт «Управлять отказами техсредств».

Рисунок 4.3 - Создание задержки


Рисунок 4.4 - Просмотр созданной задержки


Еще в данном режиме можно задать дополнительные критерии отбора.


Рисунок 4.5 - Вывод информации по заданным критериям


Теперь создадим техническую работу, выбрав пункт меню «Техработы» и подпункт меню «Создать техработу» и просмотрим введенные данные, выбрав пункт «Управлять техработами».


Рисунок 4.6 - Создание технической работы


Рисунок 4.7 - Просмотр созданных технических работ


Рисунок 4.8 - Выбор технической работы по заданным критериям

Зайдем в систему с правами менеджера и создадим маршрут. Для этого выберем пункт меню «Маршруты» и подменю «Создать маршрут», после создания сохраним ее и просмотрим внесенные данные, выбрав пункт подменю «Управлять маршрутами».


Рисунок 4.9 - Создание маршрута


Рисунок 4.10 -Просмотр созданных маршрутов


Зайдем в систему с правами менеджера и создадим перегон. Для этого выберем пункт меню «Перегоны» и подменю «Создать перегон», после создания сохраним ее и просмотрим внесенные данные, выбрав пункт подменю «Управлять перегонами».

Рисунок 4.11 -Создание перегона


Рисунок 4.12 - Просмотр созданных перегонов


Зайдем в систему с правами менеджера и создадим рейс. Для этого выберем пункт меню «Рейсы» и подменю «Создать рейс», после создания сохраним ее и просмотрим внесенные данные, выбрав пункт подменю «Управлять рейсами».


Рисунок 4.13 - Создание рейса

Рисунок 4.14 - Просмотр созданных рейсов


Зайдем в систему с правами менеджера и создадим состав. Для этого выберем пункт меню «Составы» и подменю «Создать состав», после создания сохраним ее и просмотрим внесенные данные, выбрав пункт подменю «Управлять составами».


Рисунок 4.15 - Создание состава


Рисунок 4.16 - Просмотр созданных сайтов


Статистическая функция и анализ движения поездов доступны пользователю с правами менеджера. Функция анализа движения поездов реализована подпунктом меню «Анализ движения поездов» пункта меню «Анализ».

На шаге 1 выбираем маршрут и переходи к шагу 2.


Рисунок 4.17 - Выбор маршрута для анализа положения поездов


На шаге 2 выбираем рейс.


Рисунок 4.18 - Выбор рейса для анализа положения поездов


На шаге 3 строится график, по которому производится анализ движения поездов. При передвижении курсора мышки по графику отображаются комментарии о том эффективное или неэффективное движение у поезда. В комментарии выводится информация о том, какой километр, станция, перегон, скорость, операция и подробности. По оси Х откладывается время, по оси У - положение поезда. График приведен на рисунке 4.19.


Рисунок 4.19 - График анализа положения поезда


При выборе пункта меню «Анализ» подменю «Статистика отказов составов» выводится круговая диаграмма с названиями составов и процентами отказов. Диаграмма приведена на рисунке 4.20.


Рисунок 4.20 - Статистика отказов

диспетчер веб данные система

Еще можно зайти в систему с правами рабочей бригады и просмотреть поставленные задачи.


Рисунок 4.21 - Просмотр поставленных задач

ЗАКЛЮЧЕНИЕ


В данном курсовом проекте была разработана веб-базированная система «Железная дорога Мариуполь - Донецк». Были описаны функции, задачи и цель создания системы. Была разработана схема базы данных для качественного управления движением поездов.

Были автоматизированы функции определения положения поездов, анализ движения поездов, ведение информации о расположении поездов, статистика отказа по перегонам

В ходе разработки ВБС мною были применены знания с курса «веб программирование» и «СУБД», а именно - html, css, javascript, php и sql.

СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ


1. Э. Гутманс, С. Баккен, Д. Ретанс, «PHP 5 Профессиональное программирование», Символ, 2006 г., 351 с.

2. Джек Д. Харрингтон <#"justify">ПРИЛОЖЕНИЕ А


Рисунок А.1 - Диаграмма классов для диспетчера

Рисунок А.2 - Диаграмма классов для менеджера

ПРИЛОЖЕНИЕ Б

.info= railway= "Railway"= 6.x.module

<?php_once('routes.railway.inc');_once('position.charts.railway.inc');

// права, которые публикует модульrailway_perm() {

return array('access analyze position', 'access delay statistic');

}

// меню модуляrailway_menu() {

$items['analyze/position'] = array(

'title' => t('Analyze position'),

'page callback' => 'railway_analyze_position',

'access arguments' => array('access analyze position'),

'type' => MENU_CALLBACK,

);

$items['statistic/delays'] = array(

'title' => t('Delays statistic'),

'page callback' => 'railway_delay_statistic',

'access arguments' => array('access delay statistic'),

'type' => MENU_CALLBACK,

);$items;

}

// callback-функция менюrailway_analyze_position(){drupal_get_form('railway_analyze_position_form');

}

// конструктор формы Drupalrailway_analyze_position_form(&$form_state){

$step['number'] = 0; // по умолчанию шаг на котором находится форма =0 (начальное состояние)

if(isset($form_state['storage']['stepno'])){

// если форма не на шаге 0, то сохранить в переменную актуальный шаг

$step['number'] = $form_state['storage']['stepno'];

}

$form = array();($step['number']){0:{

// шаг 0_set_title(t('Analyze position. Step 1'));

$stepname =

// получить список всех маршрутов

$routes = railway_get_routes();

// показать список маршрутов радио-кнопками

$form['railway_routes'] = array(

'#type' => 'radios',

'#title' => t("Routes"),

'#description' => t('Select trips that to show on graph.'),

'#required' => TRUE,

'#options' => railway_nodes_to_array($routes),

);

}break;1:{

// шаг 1_set_title(t('Analyze position. Step 2'));

// показать информацию по выбранному маршруту

$form['railway_routes'] = array(

'#prefix' => '<div>',

'#suffix' => '</div>',

'#value' => t('Route %routename.', array('%routename'=>node_load($form_state['storage']['step1']['railway_routes'])->title)),

);

// получить список рейсов для выбранного ранее маршрута

$trips = railway_get_trips($form_state['storage']['step1']['railway_routes']);

// показать список рейсов чекбоксами

$form['railway_trips'] = array(

'#type' => 'checkboxes',

'#title' => t("Trips"),

'#required' => TRUE,

'#options' => railway_nodes_to_array($trips,1),

);

}break;2:{

// шаг 2_set_title(t('Analyze position. Step 3'));

$step['name'] = 'Refresh chart';

// показать информацию по выбранному маршруту

$form['railway_routes'] = array(

'#prefix' => '<div>',

'#suffix' => '</div>',

'#value' => t('Route %routename.', array('%routename'=>node_load($form_state['storage']['step1']['railway_routes'])->title)),

);

// показать информацию по выбранным рейсам($form_state['storage']['step2']['railway_trips'] as $trip){

$tripname.=node_load($trip)->title.', ';

}

$tripname = rtrim($tripname,', ');

$form['railway_trips'] = array(

'#prefix' => '<div>',

'#suffix' => '</div>',

'#value' => t('Trips %tripname.',array('%tripname'=>$tripname)),

);

// показать график

$form['graphic'] = array(

'#prefix' => '<div><br>',

'#value' => railway_get_chart($form_state['storage']['step1']['railway_routes'],$form_state['storage']['step2']['railway_trips']),

'#suffix' => '<br></div>',

);

}break;

}

// показать кнопку "к следующему шагу" если шаг 1 или 2, и кнопку "обновить график" если шаг 3

$form['submit'] =array(

'#type' => 'submit',

'#value' => t('Go to step !stepno',array('!stepno'=>$step['number']+2)),

);($step['number']==2)$form['submit']['#value'] = t('Refresh chart');

// показать кнопку "отмена"

$form['cancel'] = array(

'#value' => l(t('Cancel'), 'analyze/position'),

);$form;

}railway_analyze_position_form_submit($form, &$form_state){(!isset($form_state['storage']['step1'])){

$form_state['storage']['stepno'] = 1;

$form_state['storage']['step1'] = $form_state['values'];

}elseif(!isset($form_state['storage']['step2'])){

$form_state['storage']['stepno'] = 2;

$form_state['storage']['step2'] = $form_state['values'];

}

}railway_delay_statistic(){

// получить все поезда

$trains_list = views_get_view_result('train_list');

// для каждого из поездов получить количество отказов

$total = 0;($trains_list as $train){

$cnt = count(views_get_view_result('delay_list',NULL,$train->nid));

$delays['title'][] = $train->node_title;

$delays['count'][] = $cnt;

$total+=$cnt;

}

// рассчитать процентное соотношение($i=0;$i<count($delays['title']);$i++){

$delays['percent'][$i]= round($delays['count'][$i]*100/$total);

}

$chart = new open_flash_chart_api();

// 60% прозрачности

$chart->pie(60,'#505050','{font-size: 12px; color: #404040;');

// передать массив данных и массив названий

$chart->pie_values( $delays['percent'], $delays['title']);

// цвета графика повторяются циклически

$chart->pie_slice_colours( array('#d01f3c','#356aa0','#C79810') );

$chart->set_tool_tip( '#val#%' );

$chart->title( t('Delays statistic'), '{font-size:18px; color: #d01f3c}' );

$chart->set_width(700);

$chart->set_height(400);

$chart->set_bg_colour('0xDFFFDF');$chart->render();

}.charts.railway.inc

<?phprailway_get_chart($route, $trips){

$granularity = 5; // гранулярность времени

$showevery = 60 / $granularity;

$stages = railway_build_route($route);

$works = railway_get_works($stages);

$chart = new open_flash_chart_api();

// найти минимальное время старта рейса

$min_start_date = NULL;

foreach($trips as $trip){(!empty($trip)){

$tmp = node_load($trip);

$train = node_load($tmp->field_train_id[0]['nid']);

$start = date_make_date($tmp->field_departure_time[0]['value'],$tmp->field_departure_time[0]['timezone_db']);_timezone_set($start, timezone_open($tmp->field_departure_time[0]['timezone']));($min_start_date===NULL){

$min_start_date = $start;

}else if($min_start_date>$start){

$min_start_date = $start;

}

$prepared_trips[] = array(

'train'=>$train,

'start'=>$start,

);

}

}

$min_start_hour = date_part_extract($min_start_date,'hour',DATE_OBJECT);

$min_start_hour_date = clone($min_start_date);

$min_start_hour_date->setTime($min_start_hour,0,0);

$colors = array('#3366FF','#CC33FF','#33FF66','#F5B800','#FF6633','#B88A00');

$current_color = 0;($prepared_trips as $trip){

// кол-во пропущенных шагов, от начала оси Х где не нужно прорисовывать график

$skip = date_difference($min_start_hour_date,$trip['start'],'minutes')/$granularity;

$line = new line(2,$colors[$current_color++]);

$trip_results[]=railway_draw_chart($chart,$line,$trip['train'],$trip['start'],$stages,$works,$granularity,$skip);

}

// вычисление параметров для установки границ координатной сетки

$max_distance = NULL;

$max_end_time = NULL;($trip_results as $tr){($max_end_time===NULL){

$max_end_time = $tr['end'];

}else if($max_end_time<$tr['end']){

$max_end_time = $tr['end'];

}($max_distance===NULL){

$max_distance=$tr['distance'];

}else if($max_distance<$tr['distance']){

$max_distance = $tr['distance'];

}

}_init_chart($chart,t('Analyze position'),700,500,$max_distance,$min_start_hour,$max_end_time,$granularity,$showevery);

return $chart->render();

}

// инициализирует координатную сетку графика

function railway_init_chart($chart,$title,$width,$height,$maxdistance,$fromtime,$totime,$granularity,$showevery){

// заголовки

$chart->set_title($title, '{font-size: 20px;}' );

$chart->set_y_legend( 'Position', 12, '#736AFF' );

$chart->set_x_legend( 'Time', 12, '#736AFF' );

// размер и фон

$chart->set_width($width);

$chart->set_height($height);

$chart->set_bg_colour('0xDFFFDF');

// настройка меток по X-оси

$xlabels = array();

$hours = date_part_extract($totime,'hour',DATE_OBJECT);

$mins = date_part_extract($totime,'minute',DATE_OBJECT);

// для красоты($mins>30)$hours+=2;$hours+=1;

// с интервалом в $granularity минут($i=$fromtime;$i<$hours;$i++){($j=0;$j<60;$j+=$granularity){

$xlabels[]=sprintf('%02d:%02d',$i,$j);

}

}

// установить метки

$chart->set_x_labels($xlabels);

// подписывать каждую $showevery метку по оси Х

$chart->set_x_label_style( 12, '#9933CC', 1, $showevery);

// деления

$chart->set_x_axis_steps($showevery/2);

// настройка меток по Y-оси

// добавить к макс. Y 10%

// привести к ближайшему числу кратному 10

$chart->set_y_max(round(($maxdistance+$maxdistance*0.1)/10)*10);

$chart->y_label_steps(10);

}railway_draw_chart($chart,$line,$train,$start,$stages,$works,$granularity,$skip){

// выполнить смещение по оси Х($i=0;$i<$skip;$i++){

$line->add_data_tip('null','');

}

$status = array(

// статические характеристики поезда

'speed' => 0, // максимальная скорость движения

'speed2' => 0, // максимальная скорость движения / 2

'distance_speed' => 0, // расстояние на которое переместиться поезд за 1 интервал измерения при макс.скорости движения

'distance_speed2'=> 0, // расстояние на которое переместиться поезд за 1 интервал измерения при торморжении/ускорении

'time_accelerating' => 0, // время, необходимое на разгон

'distance_accelerating' => 0, // расстояние необходимое поезду для разгона

'distance_braking' => 0, // расстояние необходимое поезду для торможения

'time_braking' => 0, // время, необходимое на торморжение

'trip_start' => 0, // время старта поезда

// динамические характеристики поезда

'current_stage' => 0, // текущий перегон

'current_station' => 0, // текущая станция либо NULL

'local_time' => 0, // локальное время задачи

'total_time' => 0, // общее время движения

'local_distance' => 0, // локальная дистанция

'total_distance' => 0, // общая дистанция

'current_speed' =>0, // текущая скорость движения

'cdist_spd'=> 0, // distance with current speed

'st' => 'technical', // статус, который опеределяет текущую операцию для поезда

'operation_msg' => 'Maintenance', // текст, который выводится в поле Операция

'details_msg' => '', // текст, который выводится в поле Детали

'done' => false,

);

// инициализация статических характеристик

$status['speed']= $train->field_speed[0]['value'];

$status['speed2']= $train->field_speed[0]['value']/2;

$status['distance_speed'] = $train->field_speed[0]['value']*$granularity/60;

$status['distance_speed2']= $train->field_speed[0]['value']*$granularity/120;

$status['distance_accelerating'] = $status['distance_speed2']*$train->field_acceleration_time[0]['value'];

$status['time_accelerating'] = $train->field_acceleration_time[0]['value'];

$status['distance_braking'] = $status['distance_speed2']*$train->field_braking_time[0]['value'];

$status['time_braking'] = $train->field_braking_time[0]['value'];

$status['trip_start'] = $start;(true){(railway_change_status($status,$stages,$works,$train)===false);($status['done']===true)break;

$line->add_data_tip($status['total_distance'],('Stage: !current_stage<br>Station: !current_station<br>Speed: !speed km/h<br>Operation: !op<br>Details: !det',(

'!current_stage'=>$stages[$status['current_stage']]['title'],

'!current_station'=>($status['current_station']===NULL)?'-':$stages[$status['current_stage']]['station'][$status['current_station']]['title'],

'!speed'=>$status['current_speed'],

'!op'=>$status['operation_msg'],

'!det'=>(empty($status['details_msg']))?'-':$status['details_msg'],

)

)

);

$status['local_time']+=$granularity;

$status['total_time']+=$granularity;

}

$chart->data_sets[] = $line;

$chart->set_tool_tip('#x_label# [#val# km]<br>#tip#');

$end = clone($start);

$end->add(new DateInterval('PT'.$status['total_time'].'M'));array('distance'=>$status['total_distance'],'end'=>$end);

}railway_change_status(&$status,$stages,$works,$train){($status['st']){'technical':{

// техническое обслуживание($status['local_time']>$stages[$status['current_stage']]['station'][$status['current_station']]['technical']){

// техническое обслуживание заверешено. перейти к коммерческим операциям

// $status['current_stage'] = 0;

// $status['current_station'] = 0;

$status['local_time'] = 0;

$status['local_distance'] = 0;

//$status['total_distance'] = 0;

$status['current_speed'] = 0;

$status['cdist_spd'] = 0;

$status['st'] = 'commercial';

$status['operation_msg'] = t('Commercial operation');

$status['details_msg'] = '';false;

}

}break;'commercial':{

// коммерческие операции($status['local_time']>$stages[$status['current_stage']]['station'][$status['current_station']]['commercial']){

// коммерческие операции заверешены. перейти к техработам

// $status['current_stage'] = 0;

// $status['current_station'] = 0;

$status['local_time'] = 0;

$status['local_distance'] = 0;

//$status['total_distance'] = 0;

$status['current_speed'] = 0;

$status['cdist_spd'] = 0;

$status['st'] = 'work';

$status['operation_msg'] = t('Techwork');

$status['details_msg'] = '';false;

}

}break;'work':{

// технические работы

// это последняя станция, остановить моделирование

if($status['current_station']==1){

$status['done'] = true;

}

// если тех.работ не было

// $status['current_stage'] = 0;

//$status['current_station'] = NULL;

$status['local_time'] = 0;

$status['local_distance'] = 0;

//$status['total_distance'] = 0;

$status['current_speed'] = 0;

$status['cdist_spd'] = 0;

// если суммарное расстояние, необходимое для разгона и торможения больше длины прогона, то вариант движения 2

if(($status['distance_accelerating']+$status['distance_braking'])>$stages[$status['current_stage']]['distance']){

$status['current_speed'] = $status['speed2'];

$status['cdist_spd'] = $status['distance_speed2'];

$status['st'] = 'moving_inefficiently';

$status['operation_msg'] = t('Moving');

$status['details_msg'] = t('Inefficiently');

$time_to_ride = $stages[$status['current_stage']]['distance']/$status['current_speed']*60;

}else{

$status['current_speed'] = 0;

$status['cdist_spd'] = 0;

$status['st'] = 'moving_effectively';

$status['operation_msg'] = t('Moving');

$status['details_msg'] = '';

$time_to_ride = $status['time_accelerating']+$status['time_braking']+($stages[$status['current_stage']]['distance']-$status['distance_accelerating']-$status['distance_braking'])/$status['speed']*60;

}

// проверить ведутся ли в заданное время тех.работы на этом участке

if(in_array($stages[$status['current_stage']]['id'],array_keys($works))===true){

$date_work_start = clone($works[$stages[$status['current_stage']]['id']]['created']);

$date_train_start = clone($status['trip_start']);

$date_train_start->add(new DateInterval('PT'.$status['total_time'].'M'));

$date_work_end = clone($date_work_start);

$date_work_end->add(new DateInterval('PT'.$works[$stages[$status['current_stage']]['id']]['duration'].'M'));

$date_train_end = clone($date_train_start);

$date_train_end->add(new DateInterval('PT'.$time_to_ride.'M'));(($date_work_start<$date_train_start and $date_train_start<$date_work_end)or

($date_work_start<$date_train_end and $date_train_end<$date_work_end)){

// $status['current_stage'] = 0;

//$status['current_station'] = NULL;

$status['local_time'] = 0;

$status['local_distance'] = 0;

//$status['total_distance'] = 0;

$status['current_speed'] = 0;

$status['cdist_spd'] = 0;

$status['st'] = 'work';

$status['operation_msg']=t('techwork !wrk',array('!wrk'=>$works[$stages[$status['current_stage']]['id']]['type']));

$status['details_msg'] = $works[$stages[$status['current_stage']]['id']]['title'];true;

}

}false;

}break;

// поезд полностью успевает разогнаться, двигается с макс.скоростью, затем тормозит.

case 'moving_effectively':{

$status['current_station'] = NULL;($status['local_distance']<$status['distance_accelerating']){

// ускорение. считаем, что данное время поезд двигался со скоростью вдвое меньшей обычной

$status['cdist_spd']= $status['distance_speed2'];

$status['current_speed'] = $status['speed2'];

$status['operation_msg'] = t('Moving');

$status['details_msg'] = t('Accelerating');

}else if($status['local_distance']>$stages[$status['current_stage']]['distance']-$status['distance_braking']){

// торморжение. считаем, что данное время поезд двигался со скоростью вдвое меньшей обычной

$status['cdist_spd']= $status['distance_speed2'];

$status['current_speed'] = $status['speed2'];

$status['operation_msg'] = t('Moving');

$status['details_msg'] = t('Braking');

}else{

// движение с максимальной скоростью

$status['cdist_spd']= $status['distance_speed'];

$status['current_speed'] = $status['speed'];

$status['operation_msg'] = t('Moving');

$status['details_msg'] = t('Top speed');

}

$status['local_distance']+= $status['cdist_spd'];($status['local_distance']>$stages[$status['current_stage']]['distance']){

// движение заверешено. перейти к техническому обслуживанию

$status['total_distance']+=$stages[$status['current_stage']]['distance']-$status['local_distance']+$status['cdist_spd'];

// если это последний перегон в рейсе, то переключиться на конечную станцию

if($status['current_stage']==(count($stages)-1)){

$status['current_station'] = 1;

}else{

$status['current_stage']++;

$status['current_station'] = 0;

}

$status['local_time'] = 0;

$status['local_distance'] = 0;

$status['current_speed'] = 0;

$status['cdist_spd'] = 0;

$status['st'] = 'technical';

$status['operation_msg'] = t('Maintenance');

$status['details_msg'] = '';false;

}

$status['total_distance']+=$status['cdist_spd'];

}break;

// поезд не успевает полностью разогнаться, достигает определенной точки прогона и начинает торморжение

// не входя в фазу движения с максимальной скоростью

case 'moving_inefficiently':{

$status['current_station'] = NULL;

$status['local_distance']+= $status['cdist_spd'];($status['local_distance']>$stages[$status['current_stage']]['distance']){

// движение заверешено. перейти к техническому обслуживанию

$status['total_distance']+=$stages[$status['current_stage']]['distance']-$status['local_distance']+$status['cdist_spd'];

// если это последний перегон в рейсе, то переключиться на конечную станцию

if($status['current_stage']==(count($stages)-1)){

$status['current_station'] = 1;

}else{

$status['current_stage']++;

$status['current_station'] = 0;

}

$status['local_time'] = 0;

$status['local_distance'] = 0;

$status['current_speed'] = 0;

$status['cdist_spd'] = 0;

$status['st'] = 'technical';

$status['operation_msg'] = t('Maintenance');

$status['details_msg'] = '';false;

}

$status['total_distance']+=$status['cdist_spd'];

}break;

}true;

}.railway.inc

<?phprailway_nodes_to_array($nodes){

$result = array();($nodes as $node){

$result[$node->nid]=$node->node_title;

}$result;

}

// возвращает список маршрутовrailway_get_routes(){

$route_list = views_get_view_result('route_list');

return $route_list;

}

// возвращает список рейсов для маршрута

function railway_get_trips($route){

$route_id = 0;(is_object($route)){

$route_id = $route->nid;

}else if(is_numeric($route)){

$route_id = $route;

}else {NULL;

}

$trip_list = views_get_view_result('trip_list',NULL,$route_id);

return $trip_list;

}

// возвращает массив перегонов и станций, упорядоченных по маршруту

function railway_build_route($route_id){

$route = node_load($route_id);

// загрузить все перегоны маршрута (без сортировки)

$unsorted_stages = array();($route->field_stage_id as $stage){

$unsorted_stages[$stage['nid']]=railway_build_stage($stage['nid']);

}

// выполнить сортировку перегонов

$search_for = $route->field_stage_start_station_id[0]['uid'];

$sorted_stages = array();

$found = 0;(($found=railway_find_stage_by_station($unsorted_stages,$search_for))!==FALSE){

// если вторая станция идет в массиве первой, то поменять станции местами

$first_station = reset($unsorted_stages[$found]['station']);($first_station['id']!=$search_for){

$unsorted_stages[$found]['station'] = array_reverse($unsorted_stages[$found]['station'],TRUE);

}

// запомнить вторую (конечную для этого перегона) станцию для дальнейшего поиска

$end_station = end($unsorted_stages[$found]['station']);

$search_for = $end_station['id'];

// скопировать перегон в новый массив

$sorted_stages[$found] = $unsorted_stages[$found];

// удалить перегон из несортированных элементов($unsorted_stages[$found]);

}

// переиндексировать массив($sorted_stages as &$s)$s['station'] = array_values($s['station']);

$sorted_stages = array_values($sorted_stages);

return $sorted_stages;

}

// возвращает массив перегонов, содержащий необходимую информацию

function railway_build_stage($stage_id){

$stage = node_load($stage_id);array(

'id' => $stage->nid,

'title' => $stage->title,

'distance' => $stage->field_stage_distance[0]['value'],

'station' => array(

$stage->field_stage_start_station_id[0]['uid'] => railway_build_station($stage->field_stage_start_station_id[0]['uid']),

$stage->field_stage_end_station_id[0]['uid'] => railway_build_station($stage->field_stage_end_station_id[0]['uid']),

)

);

}

// возвращает массив станций, содержащий необходимую информацию

function railway_build_station($station_id){

$station = user_load($station_id);array(

'id' => $station->uid,

'title' => $station->profile_station_name,

'interval' => $station->profile_train_interval,

'reception' => $station->profile_reception_interval,

'send' => $station->profile_send_interval,

'technical' => $station->profile_technical_operations,

'commercial' => $station->profile_commercial_operations,

);

}

// возвращает ид перегона, содержащего заданную станцию

function railway_find_stage_by_station($stages, $station_id){($stages as $stage_key=>$stage){(array_key_exists($station_id,$stage['station'])){$stage_key;

}

}FALSE;

}

// возвращает массив сожержащий данные о технических работах для заданного массива перегонов

function railway_get_works($stages){

$works = array();($stages as $stage){

$works = views_get_view_result('work_list',NULL,$stage['id']);(empty($works))continue;

($works as $work){(!empty($work)){($work->node_data_field_work_type_id_field_work_type_id_value){'1':{$work_list[$stage['id']]['type'] = t('Maintenance');}break;'2':{$work_list[$stage['id']]['type'] = t('Path repair');}break;'3':{$work_list[$stage['id']]['type'] = t('Cleaning area');}break;

}($work->node_data_field_work_type_id_field_work_time_value){'1':{$work_list[$stage['id']]['duration'] = 30;}break;'2':{$work_list[$stage['id']]['duration'] = 60;}break;'3':{$work_list[$stage['id']]['duration'] = 90;}break;'4':{$work_list[$stage['id']]['duration'] = 120;}break;

}

$work_list[$stage['id']]['created'] = date_make_date(intval($work->node_created),NULL,DATE_UNIX);

$work_list[$stage['id']]['title'] = $work->node_title;

}

}

}$work_list;

}



Міністерство освіти і науки України, молоді та спорту України ДВНЗ «Донецький національний технічний університет» Факультет КНТ Кафедра автом

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ