Веб-ориентированная подсистема учета работ на железной дороге
Назначение и цели создания системы. Разработка логической модели данных, выбор хранилища. Диаграмма классов для диспетчера и контент-менеджера, схема взаимодействия объектов системы. Описание программных модулей. Тестирование веб-базированной системы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 17.09.2013 |
Размер файла | 5,4 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
[Введите текст]
Міністерство освіти і науки України, молоді та спорту України
ДВНЗ «Донецький національний технічний університет»
Факультет КНТ
Кафедра автоматизованих систем управління
"Затверджено"
_______________________
підпис викладача-керівника
“____”_____________20__ р.
Завдання на курсову роботу
з дисципліни "Проектування веб-орієнтованих комп'ютерних систем"
студенту групи ІУС-12м Авджи Ніни Іллівни___________________________
(група, прізвище, ім'я, по-батькові студента у родовому відмінку)
1. Тема курсової роботи: “Спроектувати веб-орієнтовану підсистему обліку робіт на залізниці.__________________________________________
(назва предметної області)
2. Вхідні дані:
3. Перелік питань, що підлягають розробці:
4. Рекомендовані засоби:
сховище даних: реляційна СУБД MySQL.
засіб розробки програмного додатку PHP, JavaScript
Рекомендована література:
6. Зміст пояснювальної записки: типовий, згідно стандартів .
7. Термін здачі роботи на кафедру:
8. Дата захисту роботи за графіком:
Завдання видано 05/09/2012.
Завдання видав_________________________________доц. Мартиненко Т.В.
(підпис, посада, ПІБ викладача-керівника)
Консультант_________________доц. Мартиненко Т.В.,асс. Андрієвська Н.К.
(підпис, посада, ПІБ викладача-консультанта)
Завдання до виконання прийняв_____________________________________.
(підпис, ПІБ студента)
РЕФЕРАТ
Цель курсовой работы - разработать компьютеризированную подсистему «Управления движением поездов».
Задачи курсовой работы:
1. Анализ основных факторов (незапланированные «окна» в графике движения поездов, возникающие внештатные ситуации (и, как следствие, изменение пропускной способности), ограничения скорости движения поездов на участках, наличие и возможность подвязки локомотивов и локомотивных бригад), влияющих на организацию поездной и местной работы на станциях, участках, полигонах сети;
2. Исследование эксплуатационной работы, обеспечивающей рациональный уровень качества перевозочного процесса;
3. Изучение технологии организации перевозок на основе твердого графика движения поездов, системы идентификации подвижного состава, методов планирования и управления.
4. Выполнение обзора существующих систем
ПЕРЕЧЕНЬ УСЛОВНЫХ ОБОЗНАЧЕНИЙ И СОКРАЩЕНИЙ
БД - база данных.
КП - компьютеризированная подсистема.
МД - модель данных.
ПО - программное обеспечение.
ВВЕДЕНИЕ
Организация движения поездов и местной работы на поездоучастке в соответствии с нормативным графиком движения поездов, а также соблюдение безусловного уровня безопасности движения и обеспечение максимальной экономической эффективности является одной из важнейших задач перевозочного процесса.
Железные дороги Украины из-за простоя и задержек полувагонов на подъездных путях за 6 месяцев 2012 года не смогли задействовать в перевозочном процессе 153,649 тыс. полувагонов и недополучили, таким образом, более 96 млн. грн.
Чтобы избежать этого, возникает задача разработки системы, которая отображала данные о передвижении поездов с учетом загрузки узлов, запланированных и незапланированных окон, возникновением внештатных ситуаций, с учетом ограничения скорости движения поездов на участках, с учетом наличия и возможности подвязки локомотивов и локомотивных бригад, что позволит уменьшить часы простоя поездов.
1. ТЕХНИЧЕСКОЕ ЗАДАНИЕ НА РАЗРАБОТКУ СИСТЕМЫ
1.1 Назначение системы
Система предназначена для отображения данных о передвижении поездов с учетом загрузки узлов, запланированных и незапланированных окон, возникновением внештатных ситуаций, с учетом ограничения скорости движения поездов на участках, с учетом наличия и возможности подвязки локомотивов и локомотивных бригад.
Подсистема должна соответствовать современным требованиям и обеспечивать пользователей необходимыми сервисами (учет поездного положения, учет загруженности станций, данные о поездном положении с учетом информации о структуре и состоянии транспортной сети, с учетом пассажирских, пригородных и грузовых поездов высшего приоритета, с учетом запланированных и незапланированных «окон», получение данных о загруженности станции на заданное время, перегонов и местоположении локомотивных бригад).
1.2 Цели создания системы
Целями создания подсистемы являются:
- повышение эффективности использования подвижного состава;
- повышение эффективности планирования работы станций, отделений железной дороги;
- повышение эффективности планирования человеческих и материальных ресурсов различных служб:
1) службы перевозок (загрузки станций и перегонов);
2) локомотивной (оптимизация использования локомотивов и локомотивных бригад);
3) службы пути и службы автоматики и телемеханики (техническое обслуживание и ремонт пути);
- повышение эффективности местной работы;
Достичь поставленных целей может комплексное решение задач:
- анализ основных факторов (незапланированные «окна» в графике движения поездов, возникающие внештатные ситуации (и, как следствие, изменение пропускной способности), ограничения скорости движения поездов на участках, наличие и возможность подвязки локомотивов и локомотивных бригад), влияющих на организацию поездной и местной работы на станциях, участках, полигонах сети;
- исследование эксплуатационной работы, обеспечивающей рациональный уровень качества перевозочного процесса;
- изучение технологии организации перевозок на основе твердого графика движения поездов, системы идентификации подвижного состава, методов планирования и управления.
1.3 Требования к подсистеме
Требования, которые заложены в подсистему:
- надёжность, использование СУБД, которые зарекомендовали себя, обеспечивающие высокий уровень надежности;
-модульность, подсистема должна обеспечивать индивидуальную конфигурацию системы и разрешать расширять и дополнять функциональные возможности уже работающего решения без его остановки;
-широкие функциональные возможности, подсистема предоставляет полный набор функциональных возможностей необходимых современному пользователю;
-простота использования;
-удобство предоставления информации;
Требования к информационному обеспечению:
обеспечение конфиденциальности секретной информации;
достаточная производительность доступа к данным при выполнении запроса;
правильный отбор первичных сведений и источников информации;
правильная систематизация и классификация информации.
Требования к языкам программирования
Для написания статичных страниц должен быть использован язык разметки html 5, для написания интерактивных элементов клиентской части и динамических страниц должен использоваться скриптовый язык php.
Требования к режиму работы:
Система должна функционировать непрерывно и круглосуточно без вмешательства технических администраторов.
Требования к диагностированию:
Диагностирование системы должно выполняться с целью своевременного предупреждения возникновения аварийных ситуаций.
Требования к защите информации от несанкционированного доступа:
- идентификация, проверка подлинности и контроль доступа субъектов;
- шифрование конфиденциальной информации;
- обеспечение целостности программных средств и обрабатываемой информации;
- физическая охрана средств вычислительной техники и носителей информации;
- использование сертифицированных средств защиты.
Требования к эргономике и эстетике:
1. Минимальное расширение для корректной работы сайта 1024х768.
2. Максимальное расширение неограниченно.
3. Элементы управления должны быть сгруппированы однотипно-горизонтально или вертикально - на всех страницах.
4. На каждой странице должны отображаться логотип и контактная информация.
5. Интерфейс модулей должен быть выполнен в едином стиле с интерфейсом ядра системы и должен обеспечивать возможность прозрачного перемещения администратора между модулями системы и использования одинаковых процедур управления и навигационных элементов для выполнения однотипных операций.
Требования к ссылкам:
Все ссылки на сайте должны быть относительными, кроме внешних.
Язык интерфейса: русский.
Требования к размеру страницы:
Все элементы дизайна должны быть сжаты таким образом, чтобы размер страницы не превышал 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. Определение положения поездов
Описание: диспетчер вводит данные о маршруте в форму и отправляет данные контент-менеджеру.
Входные данные: времена хода поездов по перегонам, нормы времени на разгон и замедление, нормативы продолжительности стоянок поездов на промежуточных станциях для выполнения технических и коммерческих операций, нормативы оборота локомотивов в депо для выполнения технического обслуживания и расчетные минимальные интервалы между поездами при приеме, отправлении и проследовании их через станции (станционные интервалы), а также интервалы между поездами, следующими в пакете (межпоездные интервалы), названия участка, где производятся работы, вид работ и время работы (от 1 часа до 6 часов), сходы составов, неисправности пути, задержка поездов более часа, отказы технических средств.
Выходные данные: данные в виде массива.
2. Анализ движения поездов. Описание: контент-менеджер анализирует данные, полученные от диспетчеров в виде массива сортирует их по станциям хода следования поезда
Входные данные: массив данных.
Выходные данные: графическое отображение маршрута поезда с указанными временными интервалами в декартовой системе координат, где ось Х - ось времени, ось У - ось расстояния с учетом всех неисправностей.
3. Ведение информации о расположении поездов. Диспетчер ставит задачи машинистам и трудовым бригадам.
Входные данные: график движения поездов.
Выходные данные: постановка задач, координация работы, отслеживание движения поезда на больших расстояниях.
4. Статистика отказа по перегонам.
Входная информация: номер и название перегона, состав, тип отказа.
Выходная информация: круговая диаграмма простоя поездов.
Требования к программному обеспечению
Требования к программному обеспечению серверной части.
Для функционирования ВБС, на сервере должно быть следующее программное обеспечение:
СУБД - MySQL;
Web Server - Denver;
CMS - Drupal.
Требования к клиентскому программному обеспечению.
ВБС должна быть доступна для полнофункционального пользования и просмотра с помощью следующих браузеров:
Chrome 2.0 и в их более поздние версии;
ВБС Должна быть дееспособна, то есть информация, размещенная на ней, должна быть доступна, при отключенной в браузере поддержки flash і JavaScript.
Требования к техническому обеспечению
Техническое обеспечение системы должно максимально и наиболее эффективным образом использовать существующие технические средства. В состав системы должны входить следующие технические средства:
процессор с тактовой частотой не менее: 1,4 ГГц или выше;
2 ГБ или более оперативной памяти (ОЗУ);
жесткий диск 120 Гб или более;
графический адаптер;
DVD-дисковод;
клавиатура и мышь;
сетевой интерфейс 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. РАЗРАБОТКА ИНФОРМАЦИОННОГО ОБЕСПЕЧЕНИЯ
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_name |
Textfield |
|
2 |
Межпоездной интервал |
Profile_train_interval |
Textfield |
|
3 |
Технические операции |
Profile_technical_operations |
Textfield |
|
4 |
Коммерческие операции |
Profile_commercial_operations |
Textfield |
2.2 Разработка физической модели данных
Физическая модель данных приведена на рисунке. 2.1.
Рисунок 2.1 - Физическая модель данных
3. РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
3.1 Разработка диаграммы классов
Разработка диаграммы классов для диспетчера.
Таблица 3.1 - Классы системы для диспетчера
Класс |
Стереотип |
Назначение |
|
index.php |
Server Page |
Построение главной страницы |
|
index.html |
Client Page |
Отображение главной страницы |
|
stationinfo.php |
Server Page |
Построение страницы информации о станциях |
|
stationinfo.html |
Client Page |
Отображение страницы информации о станциях |
|
stationinfo |
Form |
Форма для ввода информации о станциях |
|
delaystat.php |
Server Page |
Построение страницы статистики отказов |
|
delaystat.html |
Client Page |
Отображение страницы статистики отказов |
|
taskmanage.php |
Server Page |
Построение страницы управления задачами |
|
taskmanage.html |
Client Page |
Отображение страницы управления задачами |
|
taskaction.php |
Server Page |
Построение страницы создания задач |
|
taskcreateedit.html |
Client Page |
Отображение страницы создания задач |
|
task |
Form |
Форма для ввода задач |
|
delaymanage.php |
Server Page |
Построение страницы управления отказами |
|
delaymanage.html |
Client Page |
Отображение страницы управления отказами |
|
delayaction.php |
Server Page |
Построение страницы создания отказов |
|
delaycreateedit.html |
Client Page |
Отображение страницы создания отказов |
|
delay |
Form |
Форма для ввода информации об отказах |
|
workmanage.php |
Server Page |
Построение страницы управления техработами |
|
workmanage.html |
Client Page |
Отображение страницы управления техработами |
|
workaction.php |
Server Page |
Построение страницы создания техработ |
|
workcreateedit.html |
Client Page |
Отображение страницы создания техработ |
|
work |
Form |
Форма для ввода данных о техработах |
Диаграмма классов приведена в приложении А.
Разработка диаграммы классов для менеджера.
Таблица 3.2 - Классы системы для менеджера
Класс |
Стереотип |
Назначение |
|
index.php |
Server Page |
Построение главной страницы |
|
index.html |
Client Page |
Отображение главной страницы |
|
stagemanage.php |
Server Page |
Построение страницы управления перегонами |
|
stagemanage.html |
Client Page |
Отображение страницы управления перегонами |
|
stageaction.php |
Server Page |
Построение страницы создания перегона |
|
stagecreateedit.html |
Client Page |
Отображение страницы создания перегона |
|
stage |
Form |
Форма для создания перегона |
|
analyzeposition.php |
Server Page |
Построение страницы анализа положения поездов |
|
analyzeposition.html |
Client Page |
Отображение страницы анализа положения поездов |
|
trainmanage.php |
Server Page |
Построение страницы управления составами |
|
trainmanage.html |
Client Page |
Отображение страницы управления составами |
|
trainaction.php |
Server Page |
Построение страницы создания составов |
|
traincreateedit.html |
Client Page |
Отображение страницы создания составов |
|
train |
Form |
Форма для ввода данных о составе |
|
tripmanage.php |
Server Page |
Построение страницы управления рейсами |
|
tripmanage.html |
Client Page |
Отображение страницы управления рейсами |
|
tripaction.php |
Server Page |
Построение страницы создания рейса |
|
tripcreateedit.html |
Client Page |
Отображение страницы создания рейса |
|
trip |
Form |
Форма для ввода данных о рейсе |
|
routeaction.php |
Server Page |
Построение страницы создания маршрута |
|
routecreateedit.html |
Client Page |
Отображение страницы создания маршрута |
|
route |
Form |
Форма для ввода данных о маршруте |
|
routemanage.php |
Server Page |
Построение страницы управления маршрутами |
|
routemanage.html |
Client Page |
Отображение страницы управления маршрутами |
Диаграмма классов приведена в приложении А.
3.2 Разработка схемы взаимодействия объектов системы
Схема иерархии пользователей приведена на рисунке 3.1
Рисунок 3.1 - Иерархия пользователей
Диаграмма вариантов использования приведена на рисунке 3.2.
Рисунок 3.2 - Диаграмма вариантов использования
3.3 Описание программных модулей системы
Рассмотрим наиболее важные модули, которые использовались при проектировании системы:
1) сck - система создания контента. Позволяет очень гибко управлять материалами на сайте, создавать различные типы полей контента, а также задавать способ отображения этих полей.
2) devel - предоставляет различные инструменты (блоки, страницы и функции) для разработчиков.В частности используется возможность быстрого переключения пользователей.
3) dhtml_menu - динамически открывает меню, чтобы уменьшить количество переходов по страницам.
4) date - предоставляет поля даты для CCK и Views.
5) l10n_update - предоставляет возможность автоматической загрузки и обновления переводов.
6) potx - обеспечивает web-интерфейс и API-интерфейс, чтобы извлечь переводимый текст из строк установленных модулей.
7) views - обеспечивает гибкое управление для разработчиков тем, какие списки составлять, что в них выводить, как по ним искать, в какой форме выводить. Можно сделать галереи изображений и т.д. В Drupal жёстко определены такие списки как термины таксономии и последние изменения на сайте. Модуль позволяет менять их и составлять новые.
8) views_customfield - предоставляет дополнительные типы столбцов для модуля views. В частности используется тип столбца phpcode, который позволяет встраивать во views исполняемый код.
9) open_flash_chart_api - предоставляет программный интерфейс к функциям обработки графиков.
10) 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. Джек Д. Харрингтон, «PHP. Трюки», Питер, 2008 г., 448 с.
3. Крис Дейт. «Введение в базы данных», 6-е изд. Киев, Диалектика, 1998.
4. Влад Мержевич, «HTML и CSS на примерах», Петербург, 2005 г., 448 с.
ПРИЛОЖЕНИЕ А
Рисунок А.1 - Диаграмма классов для диспетчера
Рисунок А.2 - Диаграмма классов для менеджера
ПРИЛОЖЕНИЕ Б
railway.info
name = railway
description = "Railway"
core = 6.x
railway.module
<?php
require_once('routes.railway.inc');
require_once('position.charts.railway.inc');
// права, которые публикует модуль
function railway_perm() {
return array('access analyze position', 'access delay statistic');
}
// меню модуля
function 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,
);
return $items;
}
// callback-функция меню
function railway_analyze_position(){
return drupal_get_form('railway_analyze_position_form');
}
// конструктор формы Drupal
function railway_analyze_position_form(&$form_state){
$step['number'] = 0; // по умолчанию шаг на котором находится форма =0 (начальное состояние)
if(isset($form_state['storage']['stepno'])){
// если форма не на шаге 0, то сохранить в переменную актуальный шаг
$step['number'] = $form_state['storage']['stepno'];
}
$form = array();
switch($step['number']){
case 0:{
// шаг 0
drupal_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;
case 1:{
// шаг 1
drupal_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;
case 2:{
// шаг 2
drupal_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)),
);
// показать информацию по выбранным рейсам
foreach($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)),
);
if($step['number']==2)$form['submit']['#value'] = t('Refresh chart');
// показать кнопку "отмена"
$form['cancel'] = array(
'#value' => l(t('Cancel'), 'analyze/position'),
);
return $form;
}
function railway_analyze_position_form_submit($form, &$form_state){
if(!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'];
}
}
function railway_delay_statistic(){
// получить все поезда
$trains_list = views_get_view_result('train_list');
// для каждого из поездов получить количество отказов
$total = 0;
foreach($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;
}
// рассчитать процентное соотношение
for($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');
return $chart->render();
}
position.charts.railway.inc
<?php
function railway_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){
if(!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']);
date_timezone_set($start, timezone_open($tmp->field_departure_time[0]['timezone']));
if($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;
foreach($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;
foreach($trip_results as $tr){
if($max_end_time===NULL){
$max_end_time = $tr['end'];
}else if($max_end_time<$tr['end']){
$max_end_time = $tr['end'];
}
if($max_distance===NULL){
$max_distance=$tr['distance'];
}else if($max_distance<$tr['distance']){
$max_distance = $tr['distance'];
}
}
railway_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);
// для красоты
if($mins>30)$hours+=2;
else $hours+=1;
// с интервалом в $granularity минут
for($i=$fromtime;$i<$hours;$i++){
for($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);
}
function railway_draw_chart($chart,$line,$train,$start,$stages,$works,$granularity,$skip){
// выполнить смещение по оси Х
for($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;
while(true){
while(railway_change_status($status,$stages,$works,$train)===false);
if($status['done']===true)break;
$line->add_data_tip($status['total_distance'],
t('Stage: !current_stage<br>Station: !current_station<br>Speed: !speed km/h<br>Operation: !op<br>Details: !det',
array(
'!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'));
return array('distance'=>$status['total_distance'],'end'=>$end);
}
function railway_change_status(&$status,$stages,$works,$train){
switch($status['st']){
case 'technical':{
// техническое обслуживание
if($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'] = '';
return false;
}
}break;
case 'commercial':{
// коммерческие операции
if($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'] = '';
return false;
}
}break;
case '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'));
if(($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'];
return true;
}
}
return false;
}break;
// поезд полностью успевает разогнаться, двигается с макс.скоростью, затем тормозит.
case 'moving_effectively':{
$status['current_station'] = NULL;
if($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'];
if($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'] = '';
return false;
}
$status['total_distance']+=$status['cdist_spd'];
}break;
// поезд не успевает полностью разогнаться, достигает определенной точки прогона и начинает торморжение
// не входя в фазу движения с максимальной скоростью
case 'moving_inefficiently':{
$status['current_station'] = NULL;
$status['local_distance']+= $status['cdist_spd'];
if($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'] = '';
return false;
}
$status['total_distance']+=$status['cdist_spd'];
}break;
}
return true;
}
routes.railway.inc
<?php
function railway_nodes_to_array($nodes){
$result = array();
foreach($nodes as $node){
$result[$node->nid]=$node->node_title;
}
return $result;
}
// возвращает список маршрутов
function railway_get_routes(){
$route_list = views_get_view_result('route_list');
return $route_list;
}
// возвращает список рейсов для маршрута
function railway_get_trips($route){
$route_id = 0;
if(is_object($route)){
$route_id = $route->nid;
}else if(is_numeric($route)){
$route_id = $route;
}else {
return 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();
foreach($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;
while(($found=railway_find_stage_by_station($unsorted_stages,$search_for))!==FALSE){
// если вторая станция идет в массиве первой, то поменять станции местами
$first_station = reset($unsorted_stages[$found]['station']);
if($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];
// удалить перегон из несортированных элементов
unset($unsorted_stages[$found]);
}
// переиндексировать массив
foreach($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);
return 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);
return 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){
foreach($stages as $stage_key=>$stage){
if(array_key_exists($station_id,$stage['station'])){
return $stage_key;
}
}
return FALSE;
}
// возвращает массив сожержащий данные о технических работах для заданного массива перегонов
function railway_get_works($stages){
$works = array();
foreach($stages as $stage){
$works = views_get_view_result('work_list',NULL,$stage['id']);
if(empty($works))continue;
foreach($works as $work){
if(!empty($work)){
switch($work->node_data_field_work_type_id_field_work_type_id_value){
case '1':{$work_list[$stage['id']]['type'] = t('Maintenance');}break;
case '2':{$work_list[$stage['id']]['type'] = t('Path repair');}break;
case '3':{$work_list[$stage['id']]['type'] = t('Cleaning area');}break;
}
switch($work->node_data_field_work_type_id_field_work_time_value){
case '1':{$work_list[$stage['id']]['duration'] = 30;}break;
case '2':{$work_list[$stage['id']]['duration'] = 60;}break;
case '3':{$work_list[$stage['id']]['duration'] = 90;}break;
case '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;
}
}
}
return $work_list;
}
Размещено на Allbest.ru
Подобные документы
Контекстная диаграмма системы обслуживания и диаграмма декомпозиции. Обоснование необходимости внедрения информационной системы. Обзор существующих программных продуктов. ER-диаграмма системы, описание таблиц базы данных. Используемые системы кодирования.
дипломная работа [577,2 K], добавлен 27.01.2014Назначение программы "Учёт пациентов" и её подсистемы. Диаграмма классов предметной области, диаграмма последовательностей, описание автоматизируемых функций и характеристика функциональной структуры. Физическая схема и описание таблиц базы данных.
дипломная работа [3,3 M], добавлен 15.11.2016Выбор состава технических и программных средств разработки системы. Описание входных и выходных данных. Выбор модели базы данных. Разработка подсистемы наполнения базы данных, формирования отчетов. Разработка интерфейса пользователя, тестирование системы.
курсовая работа [3,7 M], добавлен 04.12.2014Описание операционной системы, аппаратных и программных средств. Анализ входной и выходной информации. Структура таблиц базы данных. Построение информационно-логической модели. Блок-схема работы программы. Расчет трудоемкости на обработку информации.
курсовая работа [1,2 M], добавлен 05.07.2015Разработка автоматизированной информационной системы учета заказов на выполнение работ и формированию отчетной документации Бюро технической инвентаризации (БТИ). Системный анализ и схема документооборота. Разработка инфологической модели данных.
дипломная работа [603,9 K], добавлен 29.08.2014Создание аппаратно-программных средств для системы сбора данных и управления с использованием локальной сети. Предметная область системы, ее структурная схема. Описание рабочих алгоритмов, выбор аппаратной платформы. Тестирование разработанной системы.
дипломная работа [2,0 M], добавлен 29.05.2015Классификация информационных систем, назначение ИС с Web-доступом. Анализ узких мест работы учреждения, нуждающихся в автоматизации. Выбор платформы разработки, физической и логической модели данных, настройка и тестирование информационной системы.
дипломная работа [5,2 M], добавлен 10.09.2013Автоматизация проектирования визуальной модели системы. Построение диаграммы последовательности и классов. Информационный анализ предметной области и выделение информационных объектов. Построение логической модели данных. Программное обеспечение.
дипломная работа [1,5 M], добавлен 27.10.2017Специфика рекламной деятельности в агентствах недвижимости, обзор программных продуктов. Описание бизнес-процессов, назначение и цели создания автоматизированной системы, структура базы данных и ее Логическая модель, инструкция и интерфейс пользователей.
дипломная работа [3,4 M], добавлен 21.04.2009Построение концептуальной (инфологической) модели базы данных. Выбор языка и среды программирования, требования к клиентскому приложению. Выбор шаблонов проектирования, UML диаграмма классов с учетом выбранных шаблонов. Тестирование слайдера "Slick".
дипломная работа [2,5 M], добавлен 10.07.2017