Файл: Министерство цифрового развития.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 17.03.2024

Просмотров: 41

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.




Далее при выборе кнопки «Заявки моей группы» в рабочем окне слева - открывается список всех активных заявок для группы технической поддержки в которую включен пользователь. (рис. 3.3):



Рисунок 3.3 – Страница «Заявки моей группы»

При выборе кнопки «Закрытые заявки» в рабочем окне слева - открывается список всех закрытых заявок (рис. 3.4):



Рисунок 3.4 – Страница «Закрытые заявки»

При нажатии кнопки «Создать заявку» в окне авторизации или в рабочем окне - открывается окно с формой для регистрации заявки в тикет системе. В ней присутствуют текстбоксы: «Ваше ФИО», «Рабочая группа», «Контактный телефон», «Описание заявки», а также выпадающий список «Тип заявок» и кнопка «Создать заявку» (рис. 3.5):



Рисунок 3.5. – окно «Создать заявку»


xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns:local="clr-namespace:WpfApp1"

mc:Ignorable="d"

Title="Окно заявки" Height="475.424" Width="559.745">
























































3.2 Разработка программных модулей

Для начала необходимо обеспечить подключение к разработанным базам данных.

Метод getConnectionString() получает адрес SQL-сервера, к которому будет подключаться.

public static String GetConnectionString() //Извлекаем файла конфигурации данные для подключения к БД

{

return ConfigurationManager.ConnectionStrings["conString"].ToString();

}

Данные адреса хранятся в в config файле в строке conString:






providerName="System.Data.SqlClient" />



Метод openConnection() реализует подключение к БД. В случае неудачи выдает

исключение и всплывающее сообщение «Невозможно открыть SQL сервер»:

public static void openConnection() //Подключаемся к серверу согласно извлеченным данным

{

try

{

if(SQLC.State == ConnectionState.Closed)

{

SQLC.ConnectionString = GetConnectionString();

SQLC.Open();

}

}

catch (Exception ex) //Исключение - если не подключился

{

MessageBox.Show("SQL сервер не найден!"); //всплывающее окно

return;

}

}

Для закрытия сессии подключения к базе данных используется метод

closeConnection():

public static void closeConnection() //отключаемся от сервера

{

try

{

if (SQLC.State == ConnectionState.Open)

{

SQLC.Close();

}

}

catch (Exception ex) //исключение если не отключился

{

MessageBox.Show("Невозможно закрыть сервер!");

}

}

В случае неудачи выдает исключение – ничего не возвращает.

Метод executeSQL(string Code) обеспечивает выполнение SQL-команд. На вход

подается строка, которая хранит инструкцию. В случае удачного выполнения, полученные

данные загружаются в таблицу DT и могут быть дальше использованы:

public static void executeSQL(string Code) //выполнение команд

{

openConnection(); //подключение

DT.Clear();

DT.Columns.Clear();

SQL = Code; //выполнение кода

Cmd.CommandType = System.Data.CommandType.Text;

Cmd.CommandText = SQL;

Adapter.SelectCommand = Cmd; //загрузка данных с БД

Adapter.Fill(DT);

closeConnection(); //закрытие подключения

}

В случае неудачи выдает исключение – ничего не возвращает.

Метод executeSQL(string Code) обеспечивает выполнение SQL-команд. На вход подается строка, которая хранит инструкцию. В случае удачного выполнения, полученные данные загружаются в таблицу DT и могут быть дальше использованы:

public static void executeSQL(string Code) //выполнение команд

{

openConnection(); //подключение

DT.Clear();

DT.Columns.Clear();


SQL = Code; //выполнение кода

Cmd.CommandType = System.Data.CommandType.Text;

Cmd.CommandText = SQL;

Adapter.SelectCommand = Cmd; //загрузка данных с БД

Adapter.Fill(DT);

closeConnection(); //закрытие подключения

}

Метод getIndexColumn(string name) возвращает индекс столбца, который нумеруется аргументом. Он необходим для правильного получения данных из конкретного столбца по его имени, такой метод не кэширует пару индекс-имя столбца:

public static int getIndexColumn(string name, DataTable LocalDT) //возвращает индекс столбца
{

for (int i = 0; i < LocalDT.Columns.Count; i++)

{

if (LocalDT.Columns[i].ColumnName == name)

{

return i; //индекс

}

}

return 0;

}

getDynamicSqlValues(int Index,string[] Values,DataTable SDT) – общий метод для возврата значений в виде списка, возвращает все требуемые значения. Здесь необходимо указать таблицу (SDT) для хранения данных. Такой метод не кэширует пару индекс-имя столбца:

public static List getDynamicSqlValues(int Index, string[]

Values, DataTable SDT) //возврат значений в виде списка

{

List RValues = new List();

for (int i = 0; i < SDT.Columns.Count; i++)

{

for (int j = 0; j < Values.Length; j++)

{

if (SDT.Columns[i].ColumnName == Values[j])
{
RValues.Add(SDT.Rows[Index].ItemArray[i].ToString());

}

}

}

return RValues; //возвращение значения

}

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

private void Button_Click(object sender, RoutedEventArgs e) //обработка нажатия кнопки "Вход в систему"

{

if (LoginTextBox.Text == "") //Не введён логин

{

MessageBox.Show("Введите логин");

return;

}

if (PasswordTextBox.Password == "") //Не введён пароль

{

MessageBox.Show("Введите пароль");

return;

}

private void Button_Click_1(object sender, RoutedEventArgs e) //Обработчик нажатия кнопки "Создать заявку" ссылается на окно "Создание заявки"

{

RequestWindow RW = new RequestWindow();

RW.Show();

}

private void Button_Click_2(object sender, RoutedEventArgs e) //Обработчик кнопки "Проверить заявку"

{

if (RequestCheck.Text == "") return;
try

{

MainWindow.executeSQL("SELECT [Статус],[Решение] FROM [TicketSystem].[dbo].[Заявка] WHERE([Уникальный_ключ]=" + RequestCheck.Text + ")"); //Указываем какие записи из таблицы БД показать

}

catch

{

return;

}

if (MainWindow.DT.Rows.Count == 0) //На случай указания не верного номера заявки

{

MessageBox.Show("Заявки с таким номером не существует!");

return;

}
Здесь при отсутствии логина, пароля появляется сообщение с просьбой ввести логин или пароль, а в случае ввода не верных учетных данных, будет вызвано окно с сообщением о не корректности введенных данных.. В обратном случае сохраняется индекс БД и происходит выгрузка данных из таблицы «Пользователь». Далее происходит проверка логина и пароля с данными, после чего авторизация завершается и пользователь начинает работу с приложением.

Фамилия, имя и отчество пользователя, а так же должность и рабочая группа сохраняются в DBConnection.CurrentUser для отображения в заголовке рабочего окна. Данные извлекаются из БД методом «setAccountData».

public void setAccountData()

        {

            LabelFIO.Content        = "ФИО: "       + AccountData[1] + " " + AccountData[2];

            LabelRole.Content       = "Должность: " + AccountData[4];

            LabelWorkGroup.Content  = "Отдел: "     + AccountData[3];

        }
Подключение к БД осуществляется с помощью методов:

String GetConectionString – для извлечения адреса и данных авторизации приложения в БД из файла конфигурации App.config;

openConnection для подключения к БД.

public static String GetConnectionString()

        {

            return ConfigurationManager.ConnectionStrings["conString"].ToString();

        }

        public static void openConnection()

        {

            try

            {

                if(SQLC.State == ConnectionState.Closed)

                {                  

                    SQLC.ConnectionString = GetConnectionString();

                    SQLC.Open();

                }

            }
Страница «Рабочее окно» отображает информацию из таблицы «Заявки» и умеет сортировать заявки по номеру, ответственной группе, типу заявки.

public static int getIndexColumn(string name)

        {

            for(int i = 0; i < DT.Columns.Count; i++)

            {

                if (DT.Columns[i].ColumnName == name)

                {

                    return i;

                }

            }

            return 0;

        }

        public static int getIndexColumn(string name,DataTable SDT)

        {

            for (int i = 0; i < SDT.Columns.Count; i++)

            {

                if (SDT.Columns[i].ColumnName == name)

                {

                    return i;

                }

            }

            return 0;

        }

        public static string getSQLValue(int index,string name)

        {

            return DT.Rows[index].ItemArray[getIndexColumn(name)].ToString();

        }

        public static List getDynamicSqlValues(int Index, string[] Values, DataTable SDT)

        {

            List RValues = new List();
            for (int i = 0; i < SDT.Columns.Count; i++)

            {

                for (int j = 0; j < Values.Length; j++)

                {

                    if (SDT.Columns[i].ColumnName == Values[j])

                    {

                        RValues.Add(SDT.Rows[Index].ItemArray[i].ToString());

                    }

                }

            }

            return RValues;

        }

        public void updateRequestView()

        {

            LocalDT.Clear();

            LocalDT.Columns.Clear();

            executeSQL("SELECT [Уникальный_ключ],[Тип_заявки],[Рабочая_группа],[Исполнитель],[Статус] FROM [TicketSystem].[dbo].[Заявка] WHERE([Статус]<>'Закрыта')", LocalDT);
            loadToLocalData();

        }

        public void loadToLocalData()

        {

            RequestCount.Text = LocalDT.Rows.Count.ToString();

            LocalDT.Columns[getIndexColumn("Уникальный_ключ", LocalDT)].ColumnName = "ID";

            LocalDT.Columns[getIndexColumn("Тип_заявки", LocalDT)].ColumnName = "Тип заявки";

            LocalDT.Columns[getIndexColumn("Рабочая_группа", LocalDT)].ColumnName = "Рабочая группа";

            RequestDataView.ItemsSource = LocalDT.DefaultView;

        }
Кнопки в рабочем окне позволят открывать необходимые страницы с помощью событий: CreateTick_Click (Создать заявку), ClosedTicks_Click (Закрытые заявки), AllTicks_Click (Все заявки), MyGroupTicks_Click (Заявки моей группы). Пример использования:

private void CreateTick_Click(object sender, RoutedEventArgs e)

        {

            RequestWindow RW = new RequestWindow();

            RW.Show();

            RW.adminSend((string)LabelFIO.Content.ToString().Substring(4));

        }

            loadToLocalData();

        }

private void ClosedTicks_Click(object sender, RoutedEventArgs e)

        {

            LocalDT.Clear();

            LocalDT.Columns.Clear();
            executeSQL("SELECT [Уникальный_ключ],[Тип_заявки],[Рабочая_группа],[Исполнитель],[Статус] FROM [TicketSystem].[dbo].[Заявка] WHERE([Статус]='Закрыта')", LocalDT);

            loadToLocalData();

        }

private void AllTicks_Click(object sender, RoutedEventArgs e)

        {

            updateRequestView();

        }

private void MyGroupTicks_Click(object sender, RoutedEventArgs e)

        {

            LocalDT.Clear();

            LocalDT.Columns.Clear();

            executeSQL("SELECT [Уникальный_ключ],[Тип_заявки],[Рабочая_группа],[Исполнитель],[Статус] FROM [TicketSystem].[dbo].[Заявка] WHERE([Рабочая_группа]='"+AccountData[3]+"')", LocalDT);

            loadToLocalData();

        }
Так же в рабочем окне имеется возможность открыть окно для работы с заявкой с помощью двойного клика по заголовку в списке заявок с помощью методов: RequestDataView_SelectionChanged и RequestDataView_DoubleClick.

Пример:
private void RequestDataView_DoubleClick(object sender, MouseButtonEventArgs e) //обработчик двойного клика по заголовку заявки в таблице

{

if (RequestDataView.SelectedItem == null) return;
DataRowView DRV = (DataRowView)RequestDataView.SelectedItem;


RequestProtocolWindow RPW = new RequestProtocolWindow(); //Открывает заявку в окне просмотра заявки

RPW.sendRequest(DRV["ID"].ToString());

RPW.Show();
}

При открытии заявки двойным кликом открывается отдельно окно в которое подгружаются все данные связанные с данной заявкой. Поиск выполняется по уникальному id заявки с помощью метода SendRequest:

public void sendRequest(string _RID) //Отображение данных по заявке

{

MainWindow.executeSQL("SELECT [Уникальный_ключ],[Ваше_ФИО],[Рабочая_почта],[Контактный_телефон],[Тип_заявки],[Описание_заявки],[Статус],[Исполнитель],[Протокол],[Решение],[Рабочая_группа] FROM [TicketSystem].[dbo].[Заявка] WHERE([Уникальный_ключ]=" + _RID + ")");

List Values = MainWindow.getDynamicSqlValues(0, new string[] { "Уникальный_ключ", "Ваше_ФИО", "Рабочая_почта", "Контактный_телефон", "Тип_заявки", "Описание_заявки", "Статус", "Исполнитель", "Протокол", "Решение", "Рабочая_группа" }, MainWindow.DT); //Выгрузка из буфера

RID.Text = MainWindow.getSQLValue(0, "Уникальный_ключ"); //Отображение данных в соответствующем окне

RUser.Text = MainWindow.getSQLValue(0, "Ваше_ФИО");

REmail.Text = MainWindow.getSQLValue(0, "Рабочая_почта");

RPhone.Text = MainWindow.getSQLValue(0, "Контактный_телефон"); //Отображение данных в соответствующем окне

RType.Text = MainWindow.getSQLValue(0, "Тип_заявки");

RBody.Text = MainWindow.getSQLValue(0, "Описание_заявки");

RProtocol.AppendText(MainWindow.getSQLValue(0, "Протокол"));

Rdecision.AppendText(MainWindow.getSQLValue(0, "Решение")); //Отображение данных в соответствующем окне
string Status = MainWindow.getSQLValue(0, "Статус"); //Отобразить статус из списка

if (Status == "Назначена") RStatus.SelectedIndex = 0;

if (Status == "На уточнении") RStatus.SelectedIndex = 1;

if (Status == "В работе") RStatus.SelectedIndex = 2;

if (Status == "Закрыта") RStatus.SelectedIndex = 3;

string sRWorkGroup = MainWindow.getSQLValue(0, "Рабочая_группа"); //Отобразить

for(int i = 0; i
{

ComboBoxItem iItem = (ComboBoxItem)RWorkGroup.Items[i]; //Выпадающий список

if (sRWorkGroup == (string)iItem.Content)

{

RWorkGroup.SelectedIndex = i;

}

}

RExecuter.Text = MainWindow.getSQLValue(0, "Исполнитель");

}

В открытой заявке появляется возможность заполнить совершенно новые поля «Протокол» и «Решение для пользователя», с помощью метода: Button_Click

private void Button_Click(object sender, RoutedEventArgs e)

{

string Protocol = new TextRange(RProtocol.Document.ContentStart, RProtocol.Document.ContentEnd).Text; //Ввод текста в поле "протокол"

string Decision = new TextRange(Rdecision.Document.ContentStart, Rdecision.Document.ContentEnd).Text; //Ввод текста в поле "Решение"

try

{

MainWindow.executeSQL("UPDATE [TicketSystem].[dbo].[Заявка] SET [Ваше_ФИО]='" + RUser.Text + "',[Рабочая_почта]='" + REmail.Text + "',[Контактный_телефон]='" + RPhone.Text + "',[Тип_заявки]='" + RType.Text + "',[Описание_заявки]='" + RBody.Text + "',[Статус]='" + RStatus.Text + "',[Исполнитель]='" + RExecuter.Text + "',[Протокол]='" + Protocol + "',[Решение]='" + Decision + "',[Рабочая_группа]='" + RWorkGroup.Text + "' WHERE([Уникальный_ключ]=" + RID.Text + ")");

}

catch //исключение

{

MessageBox.Show("Ошибка введеных данных"); //Всплывающее окно

return;

}

}

Есть возможность выполнить поиск заявки с помощью метода FindButton_Click:

private void FindButton_Click(object sender, RoutedEventArgs e)

        {

            if (TextBoxNumberTicket.Text == "") return;

            LocalDT.Clear();

            LocalDT.Columns.Clear();

            try

            {

                executeSQL("SELECT [Уникальный_ключ],[Тип_заявки],[Рабочая_группа],[Исполнитель],[Статус] FROM [TicketSystem].[dbo].[Заявка] WHERE([Уникальный_ключ]=" + TextBoxNumberTicket.Text + ")", LocalDT);

            }

            Catch

{

                return;

            }
Описание методов – обработчиков событий этого окна представлено в таблице (табл. 3.1):

Таблица 3.1

Обработчики событий рабочего окна

№ п/п

Имя

Описание

1.

Button_Click_1

Кнопка «Закрыть», закрывает рабочее окно, данный метод так же используется в окне просмотра заявки.

2.

CreateTick_Click

Кнопка «Создать заявку», открывает страницу «Создать заявку» с формой регистрации заявки.

3.

ClosedTicks_Click

Кнопка «Закрытые заявки», в таблице с заявками отображаются только закрытые заявки.

4.

AllTicks_Click

Кнопка «Все заявки», в таблице с заявками отображаются вообще все заявки в БД.

5.

MyGroupTicks_Click

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

6.

FindButton_Click

Кнопка «Поиск», ищет заявку по введенному номеру и отображает только её в таблице с заявками.

Окно создания заявки позволяет создать и отправить заявку в БД с помощью метода Button Click.

В случае не заполнения обязательного пункта, появится соответствующее всплывающее окно.

private void Button_Click(object sender, RoutedEventArgs e) //обработчик нажатия кнопки "создать заявку"

{

if(TB_FIO.Text=="" || TB_Email.Text == "" || TB_Phone.Text == "")

{

MessageBox.Show("Введите свои данные полностью"); //Всплывающее окно

return;

}

if (ComboBoxRequestType.Text == "")

{

MessageBox.Show("Выберите тип заявки"); //Всплывающее окно

return;

}

string RBody = new TextRange(RequestBody.Document.ContentStart, RequestBody.Document.ContentEnd).Text;
if (RBody == "")

{

MessageBox.Show("Опишите проблему перед тем как отправить"); //Всплывающее окно

return;

}

try

{

MainWindow.executeSQL("INSERT INTO [TicketSystem].[dbo].[Заявка] ([Ваше_ФИО],[Рабочая_почта],[Контактный_телефон],[Тип_заявки],[Описание_заявки],[Статус],[Рабочая_группа],[Исполнитель]) VALUES('" + TB_FIO.Text + "', '" + TB_Email.Text + "','" + TB_Phone.Text + "','" + ComboBoxRequestType.Text + "','" + RBody + "','Зарегистрирована','Поддержка 1-я линия','Не назначен'); ");

}

catch

{

MessageBox.Show("Проверьте правильность введеных данных"); //Вслывающее окно

return;

}

try

{

MainWindow.executeSQL("SELECT [Уникальный_ключ] FROM [TicketSystem].[dbo].[Заявка] WHERE([Ваше_ФИО]='" + TB_FIO.Text + "' AND [Рабочая_почта]='" + TB_Email.Text + "' AND [Контактный_телефон]='" + TB_Phone.Text + "' AND [Тип_заявки]='" + ComboBoxRequestType.Text + "' AND [Описание_заявки]='" + RBody + "')");

}

catch

{

MessageBox.Show("Проверьте правильность введеных данных"); //Всплывающее окно

return;

}

MessageBox.Show("Заявка под номером "+ MainWindow.getSQLValue(0, "Уникальный_ключ") +" отправлена"); //Всплывающее окно

Close();

}

}

}

В окне просмотра заявки есть возможность назначить рабочую группу и выбрать ответственного за данную заявку специалиста из выпадающего списка с помощью методов: RExecuters_SelectionChanged и RWorkGroup_SelectionChanged:

private void RWorkGroup_SelectionChanged(object sender, SelectionChangedEventArgs e) //Выбрать ответственную группу

{

ComboBoxItem iItem = (ComboBoxItem)RWorkGroup.SelectedItem; //Выпадающий список

MainWindow.executeSQL("SELECT [Уникальный_ключ],[Фамилия],[Имя],[Отдел],[Должность],[Логин],[Пароль] FROM [TicketSystem].[dbo].[Пользователь] WHERE([Отдел]='" + iItem.Content + "')");

Console.WriteLine("SELECT [Уникальный_ключ],[Фамилия],[Имя],[Отдел],[Должность],[Логин],[Пароль] FROM [TicketSystem].[dbo].[Пользователь] WHERE([Отдел]='" + iItem.Content + "')");

if (MainWindow.DT.Rows.Count == 0) return; //Возврат данных

RExecuters.Items.Clear();

for (int i = 0; i < MainWindow.DT.Rows.Count; i++)

{

string E = MainWindow.getSQLValue(i, "Фамилия") + " " + MainWindow.getSQLValue(i, "Имя"); //Отображение ответственного в выпадающем списке

RExecuters.Items.Add(E);

}

}

Следующий шаг после разработки программного продукта – его тестирование.


ТЕСТИРОВАНИЕ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

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

В этой главе описана история изменения версий приложения, определены объекты тестирования и составлены тест-кейсы в виде таблицы.

    1. История изменений

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

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

  • вторая часть – добавление функционала без нарушения совместимости;

  • третья часть – исправления.

Таблица 4.1

Версионность программного продукта

Версия


Дата выхода

Изменения

1

2

3

1.1.1

09.04.2021

Создание интерфейса:

  • начального окна;

  • рабочего окна;

  • окна заявки;

  • страниц «Заявки моей группы», «Все заявки», «Закрытые заявки», «Создать заявку».

2.1.1

16.04.2021

Добавлено:

  • подключение к базе данных;

  • отображение информации в окне заявки;

  • возможность изменять данные в заявке;

  • возможность сохранять данные в заявке

  • возможность добавлять данные в заявке.

2.2.1

19.04.2021

Добавлено:

  • Сортировка заявок по номеру/алфавиту/ответственной группе.

2.3.1

21.04.2021

Добавлено:

  • кнопка «Поиск» в начальном окне;

  • кнопка «Поиск» в рабочем окне.

2.4.1

24.04.2021

Добавлено:

  • возможность узнать статус заявки по её номеру без авторизации в начальном окне.

3.4.1

27.04.2021

Добавлено:

  • авторизация в приложении через логин и пароль;

  • логотип в начальном и рабочем окнах.

3.5.1

30.04.2021

Добавлено:

  • всплывающие окна с сообщениями об ошибках и выполнении операций.

3.5.2

02.05.2021

Исправлено:

  • Ошибки при растягивании окна на весь экран;

  • Критическая ошибка при поиске не существующей заявки.

3.6.2

07.05.2021

Создание интерфейса:

  • страницы «Создать заявку»;

Добавлено:

  • Вывод решения по заявке при поиске заявки по номеру.