Материал: Разработка проекта Автостоянка

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Таблица 11 - Дежурные

Номер

Информация

Тип данных

1

Код дежурного

Числовой

2

Сектор

Строковый

3

Логин

Строковый

4

Пароль

Строковый

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

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

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

Все таблицы связаны между собой в следующую схему данных – рис. 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 часов сумма рассчитывается произведением стоимости тарифа на количество часов. Аналогично рассчитывается сумма к оплате для дневного и ночного тарифов.

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

  1. Для подсчета суммы для часов, проведенных в дневное время, из 20 вычитается час въезда, и полученное значение умножается на ставку тарифа ДЕНЬ.

  2. Для подсчета суммы для часов, проведенных в ночное время, из 8 вычитается час выезда, полученное значение помещается в модуль, которое показывает, сколько времени до 8 часов остается после окончания парковки. Затем из 12 вычитаем полученное число, чтобы понять, сколько именно часов в ночное время заняла парковка, и умножаем на ставку тарифа НОЧЬ.

  3. Результаты расчетов складываются, и формируется общая сумма к оплате.

Если время суток на начало – ночь, а на конец парковки – день, то подсчет осуществляется следующим образом:

  1. Для подсчета суммы для часов, проведенных в ночное время, из 20 вычитается час выезда, полученное значение помещается в модуль, которое показывает, сколько времени прошло после 20 на момент парковки. Затем из 12 вычитаем полученное число, чтобы понять, сколько именно часов в ночное время заняла парковка, и умножаем на ставку тарифа НОЧЬ.

  2. Для подсчета суммы для часов, проведенных в дневное время, из 8 вычитается час въезда, и полученное значение, помещенное в модуль, умножается на ставку тарифа ДЕНЬ.

  3. Результаты расчетов складываются, и формируется общая сумма к оплате.

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



Листинг 10 – Расчет суммы к оплате в журнале регистрации

Поскольку в представлении журнала необходимо получить наглядную информацию о клиенте и гос. номере его автомобиля в триггере также предусмотрен подхват необходимых данных из таблиц «Клиенты» и «Автомобили» и их помещение в журнал регистрации (см. рис. 11).



Листинг 11 – Получение информации о клиенте и его автомобиле с помещением их в журнал регистрации

В модуле учета оказанных услуг идентично журналу регистрации при вводе данных подхватываются данные из таблиц базы данных (см. листинг 12).

Интересным здесь является расчет для услуги «Тент-чехол», для которой предусмотрена почасовая оплата. Поэтому при расчете для данной услуги используется условие:

  1. Если значение столбца «Код услуги» не равно 3, следовательно сумма к оплате ставится в соответствии со столбцом «Цена» без изменений, поскольку для всех услуг, кроме «Тент-чехла» оплата является единовременной.

  2. Если значение столбца «Код услуги» равно 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).
Источник: https://tut-files.ru/previewfile/30974