Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Информация о деятельности индивидуального предпринимателя

Поиск

ОГЛАВЛЕНИЕ

 

ОПРЕДЕЛЕНИЯ, ОБОЗНАЧЕНИЯ И СОКРАЩЕНИЯ.. 7

ВВЕДЕНИЕ.. 8

1 АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ.. 10

1.1 Информация о деятельности индивидуального предпринимателя. 10

1.2 Выбор технологии разработки и программного обеспечения. 10

1.3 Сбор данных для информационной системы.. 15

2 РАЗРАБОТКА ИНФОРМАЦИОННОЙ СИСТЕМЫ ОБРАБОТКИ ДАННЫХ ДЛЯ АВТОМАСТЕРСКОЙ.. 16

2.1 Создание базы данных SQLite. 16

2.1.1 Разработка ER-диаграммы.. 16

2.1.2 Процесс создания базы данных SQLite. 17

2.2 Разработка пользовательского интерфейса. 18

2.2.1 Создание проекта и форм приложения Windows Forms. 18

2.2.2 Процесс подключения базы данных SQLite к проекту. 19

2.2.3 Описание основных функций. 20

3 ИСПОЛЬЗОВАНИЕ ИНФОРМАЦИОННОЙ СИСТЕМЫ В ДЕЯТЕЛЬНОСТИ ПРЕДПРИЯТИЯ 40

3.1 Руководство пользователя. 40

3.2 Статистический анализ данных. 50

3.3 Внедрение и расчет экономической эффективности. 54

3.3.1 Оценка уровня качества информационной системы.. 54

3.3.2 Планирование комплекса работ по разработке темы и оценка трудоемкости 56

3.3.3 Расчет затрат на разработку проекта. 58

3.3.4 Расчет эксплуатационных затрат. 63

3.3.5 Расчет показателя экономического эффекта. 67

ЗАКЛЮЧЕНИЕ.. 70

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ.. 71

ПРИЛОЖЕНИЕ А. Техническое задание. 73

ПРИЛОЖЕНИЕ Б. Программный продукт. 77

ПРИЛОЖЕНИЕ В. Акт внедрения. 78

 


ОПРЕДЕЛЕНИЯ, ОБОЗНАЧЕНИЯ И СОКРАЩЕНИЯ

 

В выпускной квалификационной работе применяются следующие определения, обозначения и сокращения:

бд – база данных;

ИП – индивидуальный предприниматель;

ИТ – информационные технологии;

СУБД – системы управления базами данных.

 


 

ВВЕДЕНИЕ

 

В настоящее время компьютерные технологии нашли широкое применение в различных областях деятельности, в том числе и в сфере предоставления услуг. Рабочий процесс современной автомастерской трудно представить без использования компьютерной техники и специализированного программного обеспечения. С их помощью сотрудник автомастерской может записывать необходимые данные о клиентах, об автомобилях, иметь удобный перечень услуг и их стоимость. Единых стандартов создания таких программ нет, так как пишут их сами предприятия, настраивая их под свои нужды. Важными критериями являются простота использования, интуитивно понятный пользовательский интерфейс, высокая скорость обмена данными и малая ресурсоемкость. Данные параметры могут повлиять на конкурентоспособность предприятия, так как в условиях конкуренции различия в ценах услуг невелики, и клиент, выбирая автомастерскую, скорее обратится к той организации, где обслуживание осуществляется быстрее.

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

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

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

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

Объектом исследования является предприятие ИП Матевосян Оганес Востаникович, занимающиеся ремонтом автотранспортных средств.

Предметом исследования является автоматизация процессов управления деятельностью автомастерской.

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

Для достижения цели были поставлены следующие задачи:

˗ произвести анализ предметной области;

˗ выбрать технологии разработки и программное обеспечение;

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

˗ рассчитать экономическую эффективность.

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

В области информационных экономических систем управления предприятием можно отметить работы следующих ученых: Афанасьева С. [2], Дробыцкого Н. [3], Дика В. [4], Кузнецова С. [5], Подольской В. [7], Сидорова А. [8], Тихомирова В. [9], а также многих других авторов.

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


 

АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ

 

Информация о деятельности индивидуального предпринимателя

 

Основным видом деятельности ИП является техническое обслуживание и ремонт автотранспортных средств.

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

Масштаб предприятия: малое предприятие (численность персонала не превышает 15 человек).

Основными контрагентами являются физические лица.

ИП существует на рынке с 2006 года и предоставляет качественное обслуживание и имеет невысокие цены.

 

Сбор данных для информационной системы

 

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

В связи с Федеральным законом Российской Федерации «О персональных данных», №152-ФЗ от 27.07.2006, глава 2, статья 7 –Конфиденциальность персональных данных: «Операторы и иные лица, получившие доступ к персональным данным, обязаны не раскрывать третьим лицам и не распространять персональные данные без согласия субъекта персональных данных, если иное не предусмотрено федеральным законом» [11].

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

РАЗРАБОТКА ИНФОРМАЦИОННОЙ СИСТЕМЫ ОБРАБОТКИ ДАННЫХ ДЛЯ АВТОМАСТЕРСКОЙ

 

Создание базы данных SQLite

 

Разработка ER-диаграммы

 

Рассмотрим некоторые базовые понятия ER-диаграмм.

Сущность (таблица) – это представление набора реальных или абстрактных объектов (людей, вещей, событий, мест и т. д.), которые можно объединить в одну группу по каким-либо признакам. Каждая сущность должна иметь наименование. Сущности в модели изображаются в виде прямоугольника с наименованием.

Экземпляр сущности (запись) – это конкретный представитель данной сущности. Записи должны быть различимы, т.е. сущности должны иметь некоторые свойства, уникальные для каждой записи этой сущности.

Атрибут сущности (поле) – это именованная характеристика, являющаяся некоторым свойством сущности. Атрибуты изображаются в пределах прямоугольника, определяющего сущность.

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

Каждая связь может иметь один из следующих типов связи: один-к-одному, многое-ко-многим, один-ко-многим.

Было выделено 9 сущностей:

˗ Klient – таблица клиентов;

˗ Auto – таблица автомобилей;

˗ Orders – таблица заказов;

˗ Repairs – таблица ремонтных работ;

˗ Master – таблица сотрудников;

˗ View_work – таблица видов работ;

˗ AutoSparePart – таблица автозапчастей;

˗ Prices_work – таблица стоимостей ремонтных работ;

˗ Box – таблица боксов.

На рисунке 4 изображена ER-диаграмма с перечисленными выше сущностями, атрибутами и связями.

Рисунок 4 – ER-диаграмма

 

На основании разработанной диаграммы была создана база данных SQLite.

 

Описание основных функций

 

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

Рассмотрим форму Entance (Рисунок 7), предназначенную для выбора пользователя и входа в систему. Форма имеет comboBox, который содержит список пользователей, textBox для ввода пароля, кнопку «Войти» и кнопку «Изменить пароль».

 

Рисунок 7 – Форма Entance

 

Для хранения пользователей и паролей был создан класс UserInfo:

 

static class UserInfo

{

public static string Admin;

public static string User;

public static string Registrator;

public static string Manager;

 

public static string passAdm;

public static string passUsr;

public static string passReg;

public static string passMang;

}

 

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

Admin – имеет все права доступа;

User – имеет право оформлять и печатать заказ, добавлять нового клиента и редактировать информацию о нем, рассчитывать стоимость работы и печатать бланк оплаты, добавлять автозапчасти.

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

Manager – имеет те же права, что и Registrator, плюс имеет доступ к просмотру статистических данных и просмотру всех таблиц.

При нажатии на кнопку «Войти» происходит проверка введенных данных, если данные совпадают, открывается форма MainAutoservice с соответствующими правами. Данные с именами пользователей и паролей хранятся в отдельной таблице Password. Событие button1_Click():

 

private void button1_Click(object sender, EventArgs e){

string pass = "";

SetConnection();

con.Open();

using (SQLiteCommand command = new SQLiteCommand(con)){

//считываем пароль и записываем в переменную

command.CommandText = "select pass from Password where Password.Name LIKE '" + comboBox1.Text + "'";

DB = new SQLiteDataAdapter(command.CommandText, con);

SQLiteDataReader DR = command.ExecuteReader();

while (DR.Read()){

pass = DR.GetValue(0).ToString();

}

DR.Close();

}

con.Close();

//узнаем какой пользователь входит

if (comboBox1.Text == "Admin") UserInfo.passAdm = pass;

...

//если пароли совпадают, то вход

if (comboBox1.Text == UserInfo.Admin && textBox1.Text == UserInfo.passAdm){

MainAutoservice fd = new MainAutoservice();

fd.Show();

}

...

else { MessageBox.Show("Неверный логин или пароль!","Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); }

}

 

При нажатии на кнопку «Изменить пароль» открывается форма Password. Событие button2_Click():

 

private void button2_Click(object sender, EventArgs e){

Password fd = new Password();

fd.ShowDialog();

}

 

Форма Password (Рисунок 8) предназначена для изменения пароля пользователя. Форма имеет три textBox, comboBox и кнопку «Изменить пароль».

Рисунок 8 – Форма Password

 

При нажатии на кнопку «Изменить пароль» происходит проверка введенных данных и запись нового пароля в таблицу. Событие button1_Click():

private void button1_Click(object sender, EventArgs e){

...

//какой пользователь меняет пароль

if (comboBox1.Text == UserInfo.Admin){

//совпадает ли старый пароль

if (textBox1.Text == UserInfo.passAdm{

if (textBox2.Text == textBox3.Text){

//сохранение нового пароля

UserInfo.passAdm = textBox2.Text;

string txtSQLQuery = "UPDATE Password SET pass = '" + textBox2.Text + "' WHERE Password.Name = 'Admin'";

ExecuteQuery(txtSQLQuery);

MessageBox.Show("Пароль успешно сменен");

Hide();

}

else MessageBox.Show("Пароли не совпадают");}

else{MessageBox.Show("Старый пароль введен неверно!");}

}

...}

 

Подсказка в textBox (Рисунок 9) имеет следующий программный код:

 

textBox1.Text = "введите старый пароль..."; //подсказка

textBox1.ForeColor = Color.Gray;

 

 

Рисунок 9 – Подсказка в textBox

 

После того как пользователь начинает вводить пароль, текст становится черным и заменяется на «*»:

 

textBox1.Text = null;

textBox1.ForeColor = Color.Black;

textBox1.PasswordChar = '*';

 

Форма MainAutoservice содержит класс menuStrip, который представляет меню для формы. Класс menuStrip состоит из следующих параметров: Меню (Рисунок 10.1), Таблицы (Рисунок 10.2) и Информационная панель (Рисунок 10.3), которые в свою очередь имеют свои параметры.

 

Рисунок 10.1 – Параметр Меню menuStrip

 

Рисунок 10.2 – Параметр таблицы menuStrip

 

Рисунок 10.3 – Параметр Информационная панель menuStrip

 

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

Форма содержит класс statusStrip и класс tabControl, который управляет связным набором страниц вкладок, состоящий из трех вкладок: «Оформление заказа», «Клиент» и «Автозапчасти».

На вкладке «Оформление заказа» (Рисунок 11) осуществляется оформление заказа, которое состоит из добавления информации в две таблицы, таблицу Orders и таблицу Repairs.

Рисунок 11 – Вкладка Оформление заказа

 

Добавление происходит из textBox, comboBox и dataTimePicker.

Каждый comboBox заполняется соответствующими элементами. Добавления элементов в comboBox на примере id_klient:

 

...

using (SQLiteCommand command = new SQLiteCommand(con)){

command.CommandText = @"select * from Klient";

DR = command.ExecuteReader();

while (DR.Read()){

comboBox4.Items.Add(DR["id_klient"].ToString());

}

}

...

 

После нажатия на кнопку «Добавить» происходит добавление информации в соответствующие таблицы, функции добавления имеют следующий вид:

 

private void Add_Orders(){//добавление заказа

string txtSQLQuery = "insert into Orders values (NULL,'" + dateTimePicker4.Value.ToString("yyyy-MM-dd") + "', '" + comboBox4.Text + "', '"+ textBox14.Text + "')";

ExecuteQuery(txtSQLQuery);

}

private void Add_Repairs(){//добвление ремонтных работ

string txtSQLQuery = "insert into Reparies values (NULL,'" + textBox11.Text + "', '" + dateTimePicker3.Value.ToString("yyyy-MM-dd") + "', '" + comboBox4.Text +"', '" + textBox15.Text + "', '" + dateTimePicker1.Value.ToString("yyyy-MM-dd") + "', '" + textBox12.Text + "', '" + comboBox5.Text + "', '" + comboBox1.Text + "')";

ExecuteQuery(txtSQLQuery);}

Событие button2_Click_1(), вызывает функции добавления, после чего происходит очищение полей:

 

private void button2_Click_1(object sender, EventArgs e){

//вызов функций

Add_Orders();

Add_Repairs();

//очистка

textBox14.Text = string.Empty;

comboBox1.Text = string.Empty;

...

//запись следующего номера заказа

int num = dataGridView1.RowCount;

textBox11.Text = num.ToString();

MessageBox.Show("Заказ добавлен!");

...

}

 

Функция Orders_Load() отображает таблицы Orders и Reparies в dataGridView:

 

private void Orders_Load(object sender, EventArgs e){

DataSet DS = new DataSet();

DataTable DT = new DataTable();

SetConnection();

con.Open();

using (SQLiteCommand command = new SQLiteCommand(con)){

command.CommandText = @"SELECT Orders.id_orders, Orders.[Date], Orders.id_klient, Orders.Notes, Reparies.[Date], Reparies.id_auto, Reparies.id_view_works, Reparies.Term, Reparies.Gaurantee, Reparies.id_box, Reparies.id_master FROM Orders INNER JOIN Reparies ON Orders.id_orders = Reparies.id_orders;";

DB = new SQLiteDataAdapter(command.CommandText, con);

DS.Reset();

DB.Fill(DS);

DT = DS.Tables[0];

dataGridView1.DataSource = DT;

dataGridView1.Columns[0].HeaderText = "id_заказа";

dataGridView1.Columns[1].HeaderText = "Дата заказа";

...

}

con.Close();

int num = dataGridView1.RowCount;

textBox11.Text = num.ToString();

}

 

Свойство dataGridView1.RowCount задает «id_заказа», свойство dataGridView1.Columns[].HeaderText задет название столбца.

При нажатии на textBox, предназначенный для ввода «id_вида_работы», отображается таблица View_work. Для упрощения ввода, можно воспользоваться двойным щелчком по ячейке «id_вида_работы», после чего содержание ячейки записывается в textBox. Событие dataGridView1_CellDoubleClick():

 

private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e){

if (textBox15.Text == "") textBox15.Text = dataGridView1[0, e.RowIndex].Value.ToString();

else

textBox15.Text += "," + dataGridView1[0, e.RowIndex].Value.ToString();

}

 

Также вкладка «Оформление заказа» содержит два textBox для поиска информации. Функция поиска на примере поиска клиента по фамилии имеет следующий вид:

 

...

using (SQLiteCommand command = new SQLiteCommand(con)){

command.CommandText = "select * from Klient where FIO LIKE '" + textBox1.Text + "%'";

DB = new SQLiteDataAdapter(command.CommandText, con);

DS.Reset();

DB.Fill(DS);

DT = DS.Tables[0];

dataGridView7.DataSource = DT;

... }

 

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

 

private void button5_Click(object sender, EventArgs e){

printDialog1.AllowSomePages = true;

printDialog1.ShowHelp = true;

printDialog1.Document = printDocument1;

DialogResult result = printDialog1.ShowDialog();

string text = "ЗАКАЗ №" + dataGridView1.CurrentCell.Value;

//задаем имя файла и отправляем на печать

if (result == DialogResult.OK){

printDocument1.DocumentName = text + DateTime.Today;

printDocument1.Print();

}

}

 

Запись файла происходить следующим образом, после выбора нужного заказа в dataGridView, определяется номер заказа, фамилия клиента и виды работ, так как видов работ может быть несколько, и разделены они между собой запятой, то логично записать «id работ» в массив. После чего заказ можно печатать. Запись файла реализована в событии printDocument1_PrintPage():

 

private void printDocument1_PrintPage(object sender, PrintPageEventArgs e){

string text = "ЗАКАЗ №" + dataGridView1.CurrentCell.Value;\\номер заказа

...

//определение фамилии

using (SQLiteCommand command = new SQLiteCommand(con)){

command.CommandText = @"select FIO from Klient WHERE id_klient = '" + dataGridView1.Rows[activStr].Cells[2].Value.ToString() + "'";

DR = command.ExecuteReader();

while (DR.Read())

{FIO = DR["FIO"].ToString();}

}

using (SQLiteCommand command = new SQLiteCommand(con)){//виды работ

for (int i = 0; i < Vw.Length; i++){

if (Vw[i]!= ""){

command.CommandText = @"select View_work.View from View_work where id_view = '" + Vw[i] + "'";

DR = command.ExecuteReader();

while (DR.Read()){

if (View_work == "") View_work = (i+1).ToString()+") "+ DR["View"].ToString() + "; ";

else View_work += (i + 1).ToString() + ") " +DR["View"].ToString() + "; ";

}

...

//размер области отображения текста

int w = (int)e.Graphics.MeasureString(text + " От " + dataGridView1.Rows[activStr].Cells[1].Value, BoldFont).Width;

int h = (int)e.Graphics.MeasureString(text + " От " + dataGridView1.Rows[activStr].Cells[1].Value, BoldFont).Height;

//координаты верхнего левого угла

int x = (this.ClientSize.Width-w)/6;

int y = (this.ClientSize.Height-h)/6;

//заполнение документа

e.Graphics.DrawString(text + " От " + dataGridView1.Rows[activStr].Cells[1].Value.ToString().Substring(0, 10), BoldFont, System.Drawing.Brushes.Black, x + w /2, y,StringFormat.GenericTypographic);

...

 

Также вкладка «Оформление заказа» содержит две кнопки «Стоимость» и «Справочник», при нажатии на которые открываются новые соответствующие формы Prices и Directory.

Во вкладке «Клиент» (Рисунок 12) осуществляется добавление информации из textBox о клиенте и его автомобиле в соответствующие таблицы Klient и Auto. Также вкладка содержит textBox для поиска клиента по фамилии, dataGridView для отображения таблиц и две кнопки: «Добавить», при нажатии на которую происходит добавление информации в таблицы; «Изменить информацию о клиенте», при нажатии открывается форма EditKlient.

Функции добавления и отображения таблиц в dataGridView аналогичны рассмотренным выше.

 

Рисунок 12 – Вкладка Клиент

 

На форме EditKlient (Рисунок 13) осуществляется редактирование информации о клиенте и его автомобиле. Форма содержит textBox для поиска клиента по фамилии, две dataGridView для отображения информации из таблиц Klient и Auto. Также на форме имеется две кнопки для сохранения изменений и для отображения таблицы.

Рисунок 13 – Форма EditKlient

Функция отображения таблицы Автомобилей аналогична рассмотренной ранее функции, запрос для отображения таблицы имеет следующий вид:

 

...

//запрос данных, где id_клиента равно активной строке в dataGridView

command.CommandText = @"SELECT Auto.id_auto, Auto.id_klient, Auto.Name_auto, Auto.UIN, Auto.Year, Auto.State_number, Auto.Volume, Auto.Colour FROM Auto WHERE Auto.id_klient = '" + dataGridView1.CurrentCell.Value + "';";

...

 

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

Функция сохранения изменений имеет следующий вид:

 

...

using (SQLiteCommandBuilder cb = new SQLiteCommandBuilder(DB)){

try{

cb.GetUpdateCommand();

DB.Update(DT);

MessageBox.Show("Сохранено!", "Сохранение");

}

catch (Exception exc){

MessageBox.Show("Ошибка! " + exc.Message, "");

}

}

 

Во вкладке «Автозапчасти» (Рисунок 14) осуществляется добавление информации из textBox и comboBox в таблицу AutoSparePart. Вкладка содержит кнопку «Добавить», после нажатия на которую происходит запись информации в базу данных, и dataGridView для отображения таблицы. Функции добавления и отображения аналогичны рассмотренным выше.

Форма Prices (Рисунок 15) имеет textBox и comboBox из которых осуществляется добавление информации в таблицу Prices_work, две dataGridView для отображения таблиц стоимости и автозапчастей, кнопку «Добавить» и кнопку «Печать бланка оплаты».

Рисунок 14 – Вкладка Автозапчасти

 

Рисунок 15 – Форма Prices

 

Добавление элементов в comboBox рассматривалось ранее на примере таблицы клиентов. Рассмотрим похожую функцию на примере таблицы заказов. Функция имеет следующий вид:

 

private void Load_orders_inCombo(){

...

using (SQLiteCommand command = new SQLiteCommand(con)){

command.CommandText = @"select * from Orders where Orders.id_klient LIKE '" + comboBox2.Text + "'";

DR = command.ExecuteReader();

while (DR.Read())

{ comboBox6.Items.Add(DR["id_orders"].ToString()); }

}

...

 

Функция Load_orders_inCombo() добавляет в comboBox только те заказы, которые принадлежат определенному клиенту из comboBox2.Text.

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

 

...

using (SQLiteCommand command = new SQLiteCommand(con))//виды работ{

command.CommandText = @"select id_view_works, id_orders from Reparies INNER JOIN Klient ON Klient.id_klient = Reparies.id_auto where Klient.id_klient LIKE '" + comboBox2.Text + @"' AND Reparies.id_orders LIKE '" + comboBox6.Text + @"'GROUP BY Reparies.id_view_works";

DR = command.ExecuteReader();

while (DR.Read()){

if (str == "") str = DR["id_view_works"].ToString();

else str += "," + DR["id_view_works"].ToString();

}}con.Close();

string[] str1 = str.Split(',');// все виды работ клиента

 

Затем по таблице View_work осуществляется поиск по виду работы и записывается стоимость в строку, а затем в массив:

 

...

using (SQLiteCommand command = new SQLiteCommand(con)){

for (int i = 0; i < str1.Length; i++){

if (str1[i]!= ""){

command.CommandText = @"SELECT View_work.id_view, View_work.prices_work FROM View_work where View_work.id_view LIKE '" + str1[i] + "'";

DR = command.ExecuteReader();

...

 

После этого в textBox записывается сумма выполненных работ:

 

...

int[] p = new int[view.Length - 1];

int Sum = 0;

for (int i = 0; i < view.Length - 1; i++){

p[i] = Convert.ToInt32(prices[i], 10);

Sum += p[i];

}

textBox24.Text = Sum.ToString();

...

 

В textBox, предназначенный для стоимости автозапчастей, автоматически записывается сумма всех имеющихся автозапчастей у клиента, но если необходимо выбрать определенные, то можно воспользоваться двойным щелчком по нужной ячейке в dataGridView, тогда отобразится сумма выбранных элементов:

 

private void dataGridView6_CellDoubleClick(object sender, DataGridViewCellEventArgs e){

if (str == ""){

str = dataGridView6[2, e.RowIndex].Value.ToString();

textBox25.Text = str;

}else{

str += ";" + dataGridView6[2, e.RowIndex].Value.ToString();

int Summa = 0;

string[] sum = str.Split(';');

for (int i = 0; i < sum.Length; i++){

Summa += Convert.ToInt32(sum[i], 10);

}

textBox25.Text = Summa.ToString();

}

 

Форма Directory содержит класс tabControl, состоящий из трех вкладок: «Добавить сотрудника» (Рисунок 16), «Добавить вид работы» (Рисунок 17) и «Добавить Box». Первые две вкладки состоят из textBox, dataGridView, и трех кнопок: «Добавить», «Редактировать» и «Сохранить изменения». Вкладка «Добавить Box» (Рисунок 18) имеет только кнопку Добавить и dataGridView для отображения таблицы.

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

Форма NowOrders (Рисунок 19) содержит только dataGridView для отображения таблицы заказов.

 

Рисунок 16 – Вкладка «Добавить сотрудника»

Рисунок 17 – Вкладка «Добавить вид работы»

 

Рисунок 18 – Вкладка «Добавить Box»

 

Рисунок 19 – Форма NowOrders

 

Функция отображения активных заказов имеет следующий вид:

 

private void ActivOrders(){

...

using (SQLiteCommand command = new SQLiteCommand(con)){

command.CommandText = @" SELECT Orders.id_orders, Reparies.id_reparies, Orders.[Date], Orders.Notes, Auto.Name_auto, Auto.State_number, Reparies.id_view_works, Reparies.id_box, Master.FIO FROM Reparies INNER JOIN Orders ON Reparies.id_orders = Orders.id_orders INNER JOIN Auto ON Reparies.id_auto = Auto.id_auto INNER JOIN Master ON Reparies.id_master = Master.id_master WHERE date('now') BETWEEN Orders.[Date] AND Reparies.Term GROUP BY Orders.id_orders";

...

}

con.Close();

label4.Text = (dataGridView2.Rows.Count - 1).ToString();}

 

Форма AllTables (Рисунок 20) имеет класс tabControl, состоящий из вкладок, количество которых равно количеству таблиц в базе данных. Каждая вкладка включает в себя только dataGridView для отображения соответствующей таблицы.

 

Рисунок 20 – Форма AllTables

 

Форма Grafics содержит класс tabControl, состоящий из трех вкладок: «Графики заказов» (Рисунок 21), «Графики доходов» (Рисунок 22) и «Архив погоды», которая предназначена для просмотра статистики заказов и погодных условий. Первые две вкладки содержат radioButton для определения характеристики отображения графика и компонент chart, предназначенный для отображения графика.

Рисунок 21 – Вкладка Графики заказов

 

Рисунок 22 – Вкладка Графики доходов

 

Функция отображения гистограммы заказов за неделю:

 

private void Load_orders_chart_on_week(){//количество заказов за неделю

...

using (SQLiteCommand command = new SQLiteCommand(con)){//считываем даты заказов

command.CommandText = @" SELECT Orders.id_orders, Orders.[Date] FROM Orders WHERE Orders.[Date] BETWEEN date('now','-7 day') AND date('now')";

DR = command.ExecuteReader();

while (DR.Read()){

od += DR["Date"].ToString() + ";";

}

...

string[] ordDat = od.Split(';');//date

DateTime thisDay = DateTime.Today;

int[] mas = new int[7];

...

//записываем кол-во заказов в определенный день

for (int i = 0; i < 7; i++){

for (int j = 0; j < ordDat.Length - 1; j++){

if (ordDat[j] == (thisDay.AddDays(-7 + i)).ToString()){

mas[i] += 1;

}

}

chart1.Series[0].Points.AddXY((thisDay.AddDays(-7 + i)).ToString().Substring(0, 5), mas[i]);

}...

 

Аналогично отображаются гистограммы заказов за месяц, год и гистограммы доходов за неделю, месяц и год.

Вкладка «Архив погоды» (Рисунок 23) имеет dataGridView для отображения таблицы, listBox для отображения информации о погоде, comboBox, содержащий список характеристик по которым отображается график в компоненте chart, и две кнопки: «Открыть файл и запустить» и «Показать».

 

Рисунок 23 – Вкладка Архив погоды

 

Кнопка «Открыть файл и запустить», предназначенная для открытия файла архива погоды [10]. Для файла архива погоды была создана структура Weather:

 

public class Weather{

public string Date { get; set; }

public string W1{ get; set; }

...

public void Read(string line){

string[] parts = line.Split(';'); //Разделитель в CVS файле.

Date = parts[0];

...

W1 = parts[12];

...}

public static List<Weather> ReadFile(string filename){//ф-я чтения

List<Weather> res = new List<Weather>();

using (StreamReader sr = new StreamReader(filename)){

string line;

while ((line = sr.ReadLine())!= null){

Weather p = new Weather();

p.Read(line);

res.Add(p);

}

...

 

Файл архива погоды открывается при помощи класса OpenFileDialog и записывается в структуру следующим образом:

 

List<Weather> CSV_Struct = new List<Weather>();

OpenFileDialog openFileDialog1 = new OpenFileDialog();

...

if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK){

var reader = new StreamReader(File.OpenRead(openFileDialog1.FileName));

CSV_Struct = Weather.ReadFile(openFileDialog1.FileName);

fname = openFileDialog1.FileName;

}

 

После записи отображается в dataGridView, но так как в архиве погоды имеется несколько одинаковых дат с разным временем, то перед отображением повторяющиеся даты были удалены:

 

int q=1;

while(q < CSV_Struct.Count - 1){

if (CSV_Struct[q].Date.Substring(0, 10) == CSV_Struct[q + 1].Date.Substring(0, 10)) q++;

else { dataGridView2.Rows.Add(CSV_Struct[q].Date.Substring(0, 10)); q++; }

if (q == CSV_Struct.Count-1) dataGridView2.Rows.Add(CSV_Struct[q].Date.Substring(0, 10));

}

for (int i = 0; i < dataGridView2.Rows.Count - 1; i++){

for (int j = 0; j < dataGridView3.Rows.Count - 1; j++){

if (dataGridView2.Rows[i].Cells[0].Value.ToString() == dataGridView3.Rows[j].Cells[0].Value.ToString().Substring(0, 10)){ k++; }

}

dataGridView2.Rows[i].Cells[1].Value = k;

k = 0;}

Информация о погоде в определенный день записывается в listBox, после выбора в dataGridView нужного дня:

 

private void dataGridView2_Click(object sender, EventArgs e){

listView1.Items.Clear();

List<Weather> Struct = new List<Weather>();

Struct = Weather.ReadFile(fname);

string activStr = dataGridView2.CurrentCell.Value.ToString();

int j = 0;

for (int i = 0; i < Struct.Count - 1; i++){

if (Struct[i].Date.Substring(0, 10) == activStr){

listView1.Items.Add(Struct[i].Date);

listView1.Items[j].SubItems.Add(Struct[i].W1);

j++;

}

}

}

 

В chart отображается количество заказов, выбранного из comboBox месяца. Рассмотрим на примере февраля:

 

if (comboBox1.Text == "Февраль"){

int y = DateTime.Today.Year;

var year = DateTime.IsLeapYear(y);

if (year == true) Array.Resize(ref days28, 29);

chart3.ChartAreas[0].AxisX.Maximum = days28.Length;//максимальный х

for (int i = 0; i < days28.Length; i++){

for (int j = 0; j < dataGridView2.Rows.Count - 1; j++){

if (dataGridView2.Rows[j].Cells[0].Value.ToString().Substring(3, 2) == "02"){

if (i < 10) {

if (dataGridView2.Rows[j].Cells[0].Value.ToString().Substring(0, 2) == "0" + (i + 1).ToString()){

days28[i] += Convert.ToInt16(dataGridView2.Rows[j].Cells[1].Value);

}

}

else{if (dataGridView2.Rows[j].Cells[0].Value.ToString().Substring(0, 2) == (i + 1).ToString()){

days28[i] += Convert.ToInt16(dataGridView2.Rows[j].Cells[1].Value);

...

chart3.Series[0].Points.AddXY(i+1, days28[i]);}

 

 

Метод DateTime.IsLeapYear() определяет, является ли год високосным, тем самым определяя, сколько дней в феврале. Аналогично для других месяцев.


 

Руководство пользователя

 

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

 

Рисунок 24 – Окно входа в систему

 

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

 

Рисунок 25 – Окно изменения пароля

 

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

В главном окне осуществляются основные функции системы.

Для того чтобы оформить заказ, необходимо открыть вкладку «Оформление заказа» (после входа в систему данная вкладка является стартовой) и ввести необходимые данные в соответствующие поля (Рисунок 26). Дата выбирается из макета, изображенного на рисунке 27.

 

Рисунок 26 – Оформление заказа

 

Рисунок 27 – Макет календаря

 

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

 

Рисунок 28 – Поиск вида работы по названию

 

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

Рисунок 29 – Параметры печати

 

Рисунок 30 – Сохранение файла заказа

Рисунок 31 – Файл заказа

 

Для того чтобы добавить нового клиента, необходимо открыть вкладку «Клиент» и заполнить поля, после чего нажать кнопку «Добавить» (Рисунок 32). Если необходимо редактировать информацию о клиенте или его автомобиле необходимо нажать кнопку «Изменить информацию о клиенте».

 

Рисунок 32 – Добавление нового клиента

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

 

Рисунок 33 – Редактирование информации о клиенте

 

Рисунок 34 – Редактирование информации об автомобиле

 

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

Рисунок 35 – Добавление автозапчастей

 

Чтобы открыть справочник, необходимо на главном окне нажать кнопку «Справочник». Во вкладке «Добавить сотрудника» осуществляется добавление сотрудников автомастерской, для добавления необходимо заполнить поля и нажать кнопку «Добавить» (Рисунок 36).

 

Рисунок 36 – Добавление сотрудника

 

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

Рисунок 37 – Редактирование информации о сотрудниках

 

Во вкладке «Добавить вид работы» осуществляется добавление услуг, предоставляемых автомастерской. Для добавления необходимо заполнить поля и нажать кнопку «Добавить» (Рисунок 38). Выполне



Поделиться:


Последнее изменение этой страницы: 2016-07-11; просмотров: 300; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.141.19.115 (0.011 с.)