Автор работы: Пользователь скрыл имя, 08 Ноября 2015 в 11:17, курсовая работа
Электронная очередь – это комплекс программно-аппаратных средств, предназначенных для оптимизации и формализации управления потоком людей (очередью). Очередь позволяет в значительной степени улучшить работу любой организации, в которой требуется постоянный прием клиентов. Распределение посетителей между операторами позволяет ускорять процесс обслуживания, а также исключает простой в работе персонала.
Внедрение электронной очереди в организации позволяют менеджерам зала в процессе работы системы и обслуживания клиентов оперативно вносить коррективы в работу операторов, разрабатывать новые методики облуживания, более эффективно выделять категории обслуживания клиентов.
В системе электронной очереди существует возможность гибко настроить работу операторов и, таким образом, равномерно разделить поток клиентов между всеми работающими в данный момент операторами.
ВВЕДЕНИЕ 3
1. АНАЛИЗ СРЕДЫ 5
2. ПОЯСНИТЕЛЬНАЯ ЗАПИСКА 16
2.1. Список исполнителей 16
2.2. Техническое задание 17
2.2.1. Назначение и область применения программного изделия. 17
2.2.2. Основание для разработки 17
2.2.3. Требования заказчика к ПИ 17
2.3. Календарный план разработки 21
2.3.1. Общий план разработки 21
2.3.2. Индивидуальный план разработки 22
2.4. Документация разработки 23
2.4.1. Технический проект 23
2.4.2. Подготовка к разработке 25
2.4.3. Программная реализация 29
2.4.4. Тестирование системы 36
2.5. Эксплуатационная документация 41
2.5.1. Руководство системного программиста 41
2.5.2. Руководство программиста. 43
2.5.3. Руководство оператора. 46
2.5.4. Документация по установке и сопровождению системы 49
ЗАКЛЮЧЕНИЕ 52
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ. 54
Приложения.
При запуске программы инициализируются возможные категории обслуживания. Они загружаются автоматически из БД (рис. 3). Для начала работы оператор должен вписать свое ФИО, номер своего окна обслуживания и нажать кнопку «Начать работу». Программа попытается зарегистрировать оператора в системе. Во время регистрации может возникнуть ошибка – оператор с таким номером уже присутствует в системе в настоящее время. Если оператор действительно уже есть, то следует выбрать другой номер, иначе, если никого с таким номером нет, следует подождать 1 минуту, чтобы данный номер окна разблокировался.
После регистрации в системе программа автоматически переключается во 2ю вкладку «Рабочая зона».
Рисунок 4. Приложение «Оператор» вызывает клиента в очереди
После запуска программа «Оператор» ищет клиента, соответствующего выбранным категориям, и пытается его вызвать. Производится запись в БД для этого клиента о его вызове. Вызов отображается в программе «Дисплей». В этот момент пользователю доступна только одна кнопка – «Клиент подошел» (рис. 4).
Если вызываемый клиент прослушал вызов, либо ушел, то он сдвигается на 1 позицию очереди вниз, а «Оператор» ищет себе нового клиента. После 3-го вызова клиент переходит в категорию «пропал», и исключается из очереди.
Когда клиент подошел, операционист нажимает кнопку, и начинается отсчет времени обслуживания, а в БД заносится время начала обслуживания (рис. 5).
Рисунок 5. Приложение «Оператор» в режиме обслуживания клиента
В конце обслуживания операционист нажимает кнопку «Клиент обслужен». Это действие фиксирует время окончания обслуживания в БД.
После обслуживания клиента оператору дается 10 секунд, чтобы завершить работу, и на это время становится доступна соответственная кнопка. По завершению этого периода программа вновь начинает искать себе клиента для вызова.
Если клиентов не обнаружено, то система переходит в режим «Нет клиентов» на 15 секунд. В этот момент операционист может либо завершить работу, либо ожидать появления клиентов (рис. 6).
Рисунок 6. Клиенты в очереди отсутствуют
Рисунок 7. Статистика в программе «Оператор»
В любой момент, если программа хотя бы раз переходила в режим работы, можно открыть 3-ю вкладку «Статистика» и узнать информацию по работе этого оператора (рис. 7):
Все статистические показатели в этой вкладке обновляются ежесекундно, следовательно, пользователь может видеть всегда актуальную информацию на настоящий момент.
Сколько клиентов обслужено оператором за день – важный статистический показатель. По данному показателю можно судить о продуктивности работы оператора. Этот показатель вычисляется с помощью следующего программного кода:
// Клиентов обслужено сегодня этим оператором private int todayClient() { // Открытие соединения с БД, создание подключения и запроса MySqlConnection connection = new MySqlConnection(MyConString); MySqlCommand query = connection.CreateCommand(); MySqlDataReader Reader; // Создание запроса по данному оператору за сегодня query.CommandText = "SELECT COUNT(turn_id) FROM turn " + "WHERE `date_reg` > '" + DateTime.Now.ToString("yyyy- " `date_begin` IS NOT NULL AND `date_end` IS NOT NULL AND " + "`serviced` = '" + numberUpDown.Value.ToString() + "'"; connection.Open(); Reader = query.ExecuteReader(); int i = 0; while (Reader.Read()) { i = int.Parse(Reader.GetValue(0). } connection.Close(); return i; } |
В данной функции вычисление количества обслуженных клиентов полностью ложится на СУБД, благодаря SQL-функции COUNT(), программа лишь получает готовое значение.
Следующий показатель представленные на этой странице – это время работы оператора за сегодня. Он может использоваться оператором для слежения за отработанным временем, чтобы соблюдать дневную норму по обслуживанию.
В отличие от предыдущего показателя, расчет этого полностью ложится на приложение. Ниже представлен исходный код функции его осуществляющей.
// Суммарное время работы этого оператора private string todayTime() { // Открытие соединения с БД, создание подключения и запроса MySqlConnection connection = new MySqlConnection(MyConString); MySqlCommand query = connection.CreateCommand(); MySqlDataReader Reader; // Формирование запроса на все интервалы работы этого оператора за сегодня. query.CommandText = "SELECT date_start, date_end FROM operator " + "WHERE `number` = '" + numberUpDown.Value.ToString() + "' AND " + "`date_end` > '" + DateTime.Now.ToString("yyyy- "ORDER BY operator_id DESC"; connection.Open(); Reader = query.ExecuteReader(); // Создаем переменную – временной интервал TimeSpan work = new TimeSpan(0,0,0); while (Reader.Read()) { // К переменной, хранящей
временной интервал, прибавляем
разницу между концом и work = work + (Convert.ToDateTime(Reader. } connection.Close(); // Возвращаем, как результат работы функции, временной интервал, форматированный по шаблону ЧЧ:ММ в виде строки текста. return string.Format("{0:h\\:mm}", work); } |
Последний показатель, представленный на вкладке, отражает общее количество клиентов, обслуженных сегодня в организации. Это значение показано оператору, чтобы он мог представлять долю своего вклада в работу организации за сегодня.
Логика функции аналогична подсчету количества человек, которых обслужил этот оператор. Вычисляется данный показатель, опять же силами СУБД. Единственное отличие между первой и этой функцией – в строке SQL-запроса:
query.CommandText = "SELECT COUNT(turn_id) FROM turn " + "WHERE `date_reg` > '" + DateTime.Now.ToString("yyyy- " `date_begin` IS NOT NULL AND `date_end` IS NOT NULL"; |
По нашему мнению, представленных статистических выборок должно хватать оператору для оценки собственного качества работы в ежедневном режиме.
По завершению разработки наступил этап тестирования системы. В этот момент у нас уже были готовы все четыре приложения и база данных. Все эти приложения были оттестированы по-отдельности во время параллельной разработки. Теперь настало время тестировать систему в сборе.
Для этого мы подготовили сценарий тестирования, включающий возможные аспекты влияния среды на систему.
Система тестировалась на следующие факторы:
По итогам проведения тестирования мы выявили несколько недоработок и ошибок:
Критических ошибок и конфликтов в работе системы не было обнаружено, что указывает на то, что проектирование системы было проведено качественно.
Остановимся подробнее на выявленных недоработках. Начнем с недоработки в статистическом модуле системы.
В первоначальном варианте у нас предполагалось хранить в базе три временных значения: время регистрации клиента в очереди, время начала его обслуживания и время завершения обслуживания с ним. Соответственно вычитание времени регистрации в очереди из времени завершения обслуживания давало нам время, которое клиент обслуживается в организации. Также вычитание времени регистрации из времени начала обслуживания – это время, которое клиент стоит в очереди – временной промежуток, который следует уменьшать. На этапе проектирования это выглядело логичной и законченной схемой. Сейчас же, проанализировав ситуацию, мы поняли, что есть еще одна временная точка, которую следует хранить, а именно время вызова клиента к оператору.
Данная временная точка нужна, чтобы разделить время вызова от времени начала обслуживания, потому что эти временные метки могут не соответствовать друг другу. К примеру, клиента вызвали на обслуживание к оператору, а он не услышал этого, либо уже ушел, и соответственно никакого обслуживания не началось. Хранение же данного значения позволит значительно улучшить ведомую статистику.
Для решения этой проблемы мы добавили дополнительное поле в таблицу «Очередь» (turn) – date_call типа datetime со значением по умолчанию равным NULL (пусто). Дополнительно был написан дополнительный модуль в приложении «Оператор», который данное поле заполнял.
Исходный код процедуры вызова клиента в приложении «Оператор»
private void markClient() { // Открытие соединения с БД, создание подключения и запроса MySqlConnection connection = new MySqlConnection(MyConString); MySqlCommand query = connection.CreateCommand(); connection.Open(); // Создание SQL команды для запроса в БД query.CommandText = "UPDATE `turn` " + "SET `call` = `call` + 1, " + "`board` = '0', " + "`serviced` = '" + numberUpDown.Value.ToString() + "', " + "`date_call` = '" + DateTime.Now.ToString("yyyy- "WHERE `turn_id` = '" + turn_id + "'"; // Отправление SQL запроса в БД query.ExecuteNonQuery(); // Закрытие соединения connection.Close(); } |
Второй недоработкой стало то, что в системе оператор регистрировался просто по своему номеру и ФИО, которые ни на что дальнейшее не влияло. Соответственно, могло случиться такое событие, что в системе зарегистрировано одновременно два оператора с одинаковым номером. Появление двух таких операторов может вызвать недоумение у клиентов, так как приложение «Электронное табло» вызывает клиента к оператору, как раз по его номеру.
Для решения этой проблемы было решено хранить в базе данных значения времени входа оператора в сеть и времени выхода его из сети. Каждые 60 секунд приложение оператора автоматически обновляет время выхода из сети. Соответственно при попытке зайти в сеть приложение «Оператор» проверяет последнее время выхода оператора с таким же номером минус одну минуту 30 секунд и сравнивает с настоящим временем. Если такого значения в базе не существует – то оператору разрешается зарегистрироваться в системе, иначе – приложение показывает ошибку, и предложение сменить номер.
Исходный код процедуры регистрации в сети в приложении «Оператор»
// Проверяем нет ли нас онлайн // Открытие соединения с БД, создание подключения и запроса MySqlConnection connection = new MySqlConnection(MyConString); MySqlCommand query = connection.CreateCommand(); MySqlDataReader Reader; query.CommandText = "SELECT operator_id FROM operator " + "WHERE `number` = '" + numberUpDown.Value.ToString() + "' AND " + "`date_end` > '" + DateTime.Now.AddMinutes(-1). "ORDER BY operator_id DESC"; connection.Open(); // Считываем ответ, который вернула БД Reader = query.ExecuteReader(); while (Reader.Read()) if (int.Parse(Reader.GetValue(0). { // Если есть, то не даем зайти MessageBox.Show("Оператор с таким номером уже есть онлайн"); connection.Close(); return; } connection.Close();
// Прописываемся в онлайне connection = new MySqlConnection(MyConString); query = connection.CreateCommand(); connection.Open(); query.CommandText = "INSERT INTO `operator` SET " + "`number` = '" + numberUpDown.Value.ToString() + "'," + "`fio` = '" + fioTextBox.Text + "'," + "`date_start` = '" + DateTime.Now.ToString("yyyy- "`date_end` = '" + DateTime.Now.ToString("yyyy- query.ExecuteNonQuery(); connection.Close();
// Определяем, какой номер нам выдала БД connection = new MySqlConnection(MyConString); query = connection.CreateCommand(); query.CommandText = "SELECT operator_id FROM operator " + "WHERE `number` = '" + numberUpDown.Value.ToString() + "' " + "ORDER BY operator_id DESC LIMIT 1"; connection.Open(); Reader = query.ExecuteReader(); while (Reader.Read()) operator_id = int.Parse(Reader.GetValue(0). connection.Close(); |
Исходный код процедуры синхронизации в приложении «Оператор»
private void updateOnline() { // Открытие соединения с БД, создание подключения и запроса MySqlConnection connection = new MySqlConnection(MyConString); MySqlCommand query = connection.CreateCommand(); connection.Open(); // Создание запроса, обновляющего наше время завершения работы query.CommandText = "UPDATE `operator` " + "SET `date_end` = '" + DateTime.Now.ToString("yyyy- "WHERE `operator_id` = '" + operator_id.ToString() + "'"; query.ExecuteNonQuery(); connection.Close(); } |
Данная система удобна еще тем, что в любом случае, даже при некорректном отключении оператора от базы данных, в ней останется время последней синхронизации. Дополнительно по времени проведенному приложением «Оператор» в системе за день, можно вычислить, сколько времени оператор работал.
Оставшиеся мелкие ошибки были проанализированы, было выявлено место в программном коде, где они происходили, и они были исправлены. После исправления данных ошибок было проведено еще одно тестирование, в котором мы не обнаружили ошибок, либо недоработок, в целом система работала стабильно и корректно.
Располагается на терминалах при входе в организацию и выдает порядковые номера клиентам. Имеет доступ на создание записей в таблице «Очередь» и частичное изменение таблицы «Категории» (увеличение счетчика категории на 1). С программой работают клиенты – посетители организации.
Приложение помогает оператору вызывать следующего в очереди клиента, а также устанавливать категории обслуживания данного оператора. Имеет доступ ко всем таблицам БД: таблица «Категории» на уровне чтения, остальные на чтение-запись.
Данные программы требуют следующих программных средств для обеспечения работоспособности:
Информация о работе Разработка и стандартизация программных средств и информационных технологий