№
|
Заголовок
|
Название
|
Тип
|
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. РАЗРАБОТКА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
.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 Описание программных модулей системы
Рассмотрим наиболее важные модули, которые использовались при
проектировании системы:
) с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. Джек Д. Харрингтон
<#"650889.files/image042.gif">
Рисунок А.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(
'#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['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;
}
Похожие работы на - Веб-ориентированная подсистема учета работ на железной дороге