Разработка проекта Автостоянка
Скачать 1.68 Mb.
|
3. 2. Проектирование базы данных.Информация, хранимая в таблицах БД данных приведена в таблицах со 4-ю по 11-ю. Таблица 4 - Тарифы
Таблица 5 - Услуги
Таблица 6 - Клиенты
Таблица 7 - Автомобили
Таблица 8 - Парковочные места
Таблица 9 - Журнал регистрации
Таблица 10 - Оказанные услуги
Таблица 11 - Дежурные
Первые четыре таблицы и последняя «Дежурные» относительно небольшие, и информация в них меняется сравнительно редко. Такого рода таблицы, содержащие условно-постоянную информацию, обычно называются справочными. Таблица «Парковочные места» небольшая, но информация в данной таблице меняется часто, поскольку отображает статус занятости парковочного места в соответствии с журналом регистрации. Две других таблицы очень обширны и постоянно дополняются новыми записями, поскольку процессы постановки и оказания услуг идут постоянно. Данные в них основываются на справочных таблицах. Все таблицы связаны между собой в следующую схему данных – рис. 8. Рисунок 8 – Схема данных БД 3. 3. Описание проектных решений Для того, чтобы обеспечить правильный расчет необходимо автоматизировать выбор тарифа, подсчет часов парковки и суммы к оплате самой информационной системой, а не дежурным. Поэтому в журнале регистрации от дежурного требуется ввести только дату въезда и выезда автомобилем, занятое парковочное место и код клиента. Дополнительно следует отразить наличие дополнительных услуг и указание о несвоевременном выезде для подсчета штрафа. При вводе необходимых данных в журнал регистрации система берет из базы данных сведения о клиенте и его автомобиле, а также информацию о стоимости тарифов и штрафов. Подсчет количества часов на парковке осуществляется с помощью функции в SQL «DATEDIFF», как часовая разница между датами выезда и въезда. Результат округляется для упрощения расчета по суточному тарифу (см. рис. 9). Рисунок 9 – Подсчет количества часов для определения тарифа Если значения для даты выезда нет, значит парковка на данный момент активна, и количество часов будет определено, как клиент покинет автостоянку, это позволяет определить занятые на данный момент парковочные места. Так как системой предусмотрены смешанные тарифы и тарифы, зависящие от времени суток парковки автомобиля, вычисляется время суток на момент въезда и выезда с помощью функции DATEPART и проверяется соответствие диапазону проверки: между 8-ю и 19-ю часами – для дневного времени парковки, между 20-ю часами и 7-ю часами утра – для ночного времени парковки. Для определения тарифа в таблице базы данных используются 5 разных условий: Если количество часов превышает, либо равно 24, следовательно в соответствии со справочником тарифов присваивается значение «1» - суточный тариф с ценой за сутки – 1 000 руб. Если количество часов превышает 12, но менее суток, то предусмотрен тариф «5» - 65 рублей за час. Если парковка занимает меньшее количество часов, а время суток в течение парковки остается неизменным (день-день/ночь-ночь), то выбирается тариф «2» с оплатой 80 в час и «3» с оплатой 60 в час для дневного и ночного тарифов соответственно. В случае смены времени суток в течение парковки автомобиля выбирается смешанный тариф, который основан на оплате дневных часов как за дневной тариф, а ночных часов – как за ночной. На листинге 9 представлена реализация определения тарифа в триггере для автоматического изменения таблицы после ввода или изменения данных в журнале регистрации. Листинг 9 – Определение тарифа в журнале регистрации Расчет оплаты меняется в зависимости от выбранного тарифа. При суточном тарифе количество часов парковки делится на 24, и полученное значение умножается на сумму тарифа. При тарифе свыше 12 часов сумма рассчитывается произведением стоимости тарифа на количество часов. Аналогично рассчитывается сумма к оплате для дневного и ночного тарифов. Для смешанного тарифа расчет самый сложный. Для него проверяется значение не только тарифа, но также и времени суток на начало и на конец парковки. Если время суток на начало – день, а на конец парковки – ночь, то подсчет осуществляется следующим образом: Для подсчета суммы для часов, проведенных в дневное время, из 20 вычитается час въезда, и полученное значение умножается на ставку тарифа ДЕНЬ. Для подсчета суммы для часов, проведенных в ночное время, из 8 вычитается час выезда, полученное значение помещается в модуль, которое показывает, сколько времени до 8 часов остается после окончания парковки. Затем из 12 вычитаем полученное число, чтобы понять, сколько именно часов в ночное время заняла парковка, и умножаем на ставку тарифа НОЧЬ. Результаты расчетов складываются, и формируется общая сумма к оплате. Если время суток на начало – ночь, а на конец парковки – день, то подсчет осуществляется следующим образом: Для подсчета суммы для часов, проведенных в ночное время, из 20 вычитается час выезда, полученное значение помещается в модуль, которое показывает, сколько времени прошло после 20 на момент парковки. Затем из 12 вычитаем полученное число, чтобы понять, сколько именно часов в ночное время заняла парковка, и умножаем на ставку тарифа НОЧЬ. Для подсчета суммы для часов, проведенных в дневное время, из 8 вычитается час въезда, и полученное значение, помещенное в модуль, умножается на ставку тарифа ДЕНЬ. Результаты расчетов складываются, и формируется общая сумма к оплате. На листинге 10 приведена реализация расчета суммы к оплате в триггере для автоматического изменения таблицы после ввода или изменения данных в журнале регистрации. Листинг 10 – Расчет суммы к оплате в журнале регистрации Поскольку в представлении журнала необходимо получить наглядную информацию о клиенте и гос. номере его автомобиля в триггере также предусмотрен подхват необходимых данных из таблиц «Клиенты» и «Автомобили» и их помещение в журнал регистрации (см. рис. 11). Листинг 11 – Получение информации о клиенте и его автомобиле с помещением их в журнал регистрации В модуле учета оказанных услуг идентично журналу регистрации при вводе данных подхватываются данные из таблиц базы данных (см. листинг 12). Интересным здесь является расчет для услуги «Тент-чехол», для которой предусмотрена почасовая оплата. Поэтому при расчете для данной услуги используется условие: Если значение столбца «Код услуги» не равно 3, следовательно сумма к оплате ставится в соответствии со столбцом «Цена» без изменений, поскольку для всех услуг, кроме «Тент-чехла» оплата является единовременной. Если значение столбца «Код услуги» равно 3, следовательно сумма к оплате рассчитывается с использованием вложенного запроса для вывода данных о часах при условии соответствия значений для столбцов «Автомобиль» и «Дата въезда», умноженных на значения в столбце «Цена». Листинг 12 – Заполнение данных в журнале услуг Результат подсчета для услуги «Тент-чехол» с подхватом количества часов из журнала регистрации представлен на листинге 13. Листинг 13– Расчет вычисления суммы для услуги «Тент-чехол» Учет состояния парковочного места зависит от сектора, в котором это место находится. В секторе A машиноместа предназначены для клиентов без абонемента, и их учет ведется по журналу регистрации. А в секторе B парковочные места предназначены для клиентов с купленными абонементами, и их учет ведется в соответствии с модулем учета оказанных услуг. В случае с журналом регистрации, как упоминалось выше, учет занятых парковочных мест в секторе A не сложен, достаточно обратить внимание на значение в столбце «Дата выезда». Однако возникает проблема с подхватом даты въезда для соответствующего парковочного места, ведь группирование по парковочному месту с определением даты реализовать не получится. Для решения проблемы были созданы два представления, в первом отображается информация о занятых парковочных местах, а во втором – информация о последней дате въезда для каждого места с использованием агрегатной функции MAX. Созданные представления представлены на рисунке 10. Рисунок 10 – Представления с информацией о дате въезда для учета занятости парковочных мест в секторе A После этого в триггере с помощью объединения таблиц проверяется, занято ли место и в случае истинности статус парковочного места в таблице «Парковочные места» изменяется на «Занято», иначе – на «Свободно» (см. листинг 14). Листинг 14 – Изменение статуса парковочного места в журнале регистрации В случае с сектором B необходимо условие для проверки кода услуги «Абонемент», и в случае истинности – подсчет количества часов с момента покупки абонемента с использованием текущей даты для проверки действительности абонемента: для месячного количество дней с момента покупки не должно превышать 30, а для годового – 365. Для сокращения записей в теле триггера было создано представление к таблице «Оказанные услуги» с запросом, представляющим информацию о действующих абонементах (см. рис. 11). Рисунок 11 – Представление с действующими абонементами для учета занятости парковочных мест в секторе B Затем уже в триггере с помощью объединения таблиц проверяется, забронировано ли место и в случае истинности статус парковочного места в таблице «Парковочные места» изменяется на «Бронь», иначе – на «Свободно» (см. листинг 15). Листинг 15 – Изменение статуса парковочного места в журнале услуг 3. 4. Описание интерфейса Работа по созданию представления информационной системы начинается с создания проекта WindowsForms на языке C#. Каждый запланированный компонент ИС располагается на отдельной форме: "Авторизация", "Меню", "Тарифы и услуги", "Клиенты", "Автомобили", "Парковочные места", "Журнал регистрации", "Оказанные услуги". Общий код программы и всех форм проекта приложен к курсовой работе. Для авторизации и загрузки данных необходимо подключение к базе данных поэтому в качестве источника данных указывается база данных PP, работа с которой была описана в предыдущих подразделах (см. рис. 12). Для использования авторизации в созданном классе DB.cs прописывается строка подключения к ней и методы для учета состояния подключения. Класс для подключения к базе данных приведен в листинге 16. Рисунок 12 – Подключение базы данных Листинг 16 – Класс для работы с базой данных За авторизацию отвечает форма «LoginForm». В конструкторе данной формы располагаются такие элементы управления, как TextBox - для ввода логина, TextBox - для ввода пароля, Label - для заголовка и для комментариев, Button – для входа, Button – для закрытия приложения. В методе, присвоенном для кнопки входа в систему, прописывается условие соответствия введенного пользователем логина и пароля хранящимся данным в базе данных, и если условие истинное, то пользователю открывается доступ в систему, иначе система выдает уведомление о том, что логин или пароль были введены неверно (см. листинг 17). Листинг 17 – Организация системы доступа Демонстрация авторизации приведена в рисунке 13. Рисунок 13 – Успешная авторизация Для создания заставки в главном меню в графическом редакторе Adobe Photoshop подготавливается изображение с названием системы. В конструкторе главной формы подготовленное изображение помещается в элемент Panel на задний план. Затем добавляются 7 элементов типа Button, которые позволяют открыть форму с соответствующим им компонентом информационной системы или закрыть приложение. Спроектированное меню представлено на рисунке 14. Рисунок 14 – Меню информационной системы В компоненте «Тарифы и услуги» помещается информация об условиях, единице времени, стоимости и штрафах применяемых тарифов, а также информация об услугах с указанием их описания, способе оплаты и стоимости. Для представления этих данных в конструкторе формы используются элементы DataGridView, в которых в качестве источника данных выбираются таблицы «Тарифы» и «Услуги». Для возможности редактирования данных напрямую из программы добавляются элементы TextBox со значением DataBindings в свойствах элемента с соответствующим данному полю столбцу в таблице базе данных. В результате работа с формой выглядит следующим образом (см. рис. 15): в таблице выбирается строка, которую необходимо изменить, а в текстовых полях присваиваются новые значения для данной строки. Данные при этом так же изменятся в базе данных. Рисунок 15 – Компонент «Тарифы и услуги» После нажатия на кнопку «Обновить», данные в таблице обновятся (см. рис. 16). Рисунок 16 – Редактирование информации в компоненте «Тарифы и услуги» Для того, чтобы программа могла работать представленным образом, кнопке «Обновить» определен метод, указаный в листинге 18. Листинг 18 – Редактирование информации в компоненте «Тарифы и услуги» В дальнейшем работа со всеми остальными элементами в системе организована аналогичным образом, за исключением компонента «Парковочные места». Это обусловлено тем, что данные в таблице «Парковочные места» в базе данных обновляются исключительно автоматически на основании журнала регистрации и журнала услуг. Компонент «Клиенты», представленный на рисунке 17, содержит информацию о клиентах. Рисунок 17 – Компонент «Клиенты» Аналогичным образом в соответствии с БД оформлен компонент «Автомобили» (см. рис. 18). Рисунок 18 – Компонент «Автомобили» Компоненты «Парковочные места», «Журнал регистрации» и «Журнал услуг» представлены на рисунках с 19-го по 21-й. Рисунок 19 – Компонент «Парковочные места» Рисунок 20 – Компонент «Журнал регистрации» Рисунок 21 – Компонент «Журнал услуг» Компоненты «Журнал регистрации» и «Журнал услуг» являются самыми значимыми, поскольку основная работа дежурным происходит именно в них. Поскольку процесс редактирования информации ранее уже был рассмотрен, следует продемонстрировать такой важный метод работы с данными как создание новых строк в таблице. Для этого в конце журналов есть пустые строки. Если дежурному необходимо добавить новую строку, он выбирает пустую строку (в нашем случае строку №65) указывает дату въезда, дату выезда (при наличии), место и код клиента (см. рис 22). Рисунок 22 – Добавление новой строки в журнал регистрации Оставшаяся информация заполнится сама, и статус в компоненте «Парковочные места» изменится автоматически (см. рис. 23). Рисунок 23 – Автоматическое заполнение данных и изменение статуса места Если же клиент намеревается покинуть парковку, то дежурный добавляет дату выезда для формирования суммы к оплате. После этого статус для ранее занятого места изменится снова (см. рис. 24). Рисунок 24 – Добавление новых данных для учета занятости парковочного места В рассмотренном варианте подтверждается тот факт, что триггер работает корректно в отношении учета занятости парковочных мест сектора A, следует проверить корректноть работы триггера для учета занятости парковочных мест сектора B. Например, дежурный добавляет две покупки абонемента – один - действующий, другой – нет. После добавления данных, статус парковочных мест сменится следующим образом. Рисунок 25 – Отображение информации о бронировании парковочного места Действительно, как следует из рисунка 25, статус для места с истекшим абонементом – «Свободно», а с действующим – «Бронь». |