Управление списками разрешённых направлений

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 19.05.2013
Размер файла 849,8 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Федеральное государственное бюджетное образовательное учреждение высшего профессионального образования Национальный исследовательский университет «МЭИ»

Отчет

к курсовому проекту

по дисциплине «Базы данных»

Тема: «Управление списками разрешённых направлений»

Студент группы А-16-09:

Чаплыгин Д.И.

Преподаватель:

доц., к.т.н. Сидорова Н.П.

Москва 2013 г.

Оглавление

Задание на курсовой проект

Исходные данные для выполнения курсового проекта

Сокращения

Введение

1. Анализ предметной области

2. Проектирование базы данных

2.1. Разработка ER-модели

2.2. Проектирование правил целостности БД

2.3. Анализ реляционной модели

3. Реализация базы данных

4. Программная реализация

4.1 ADO .NET и Entity Framework

4.2 Примеры экранных форм интерфейса

Литература

Приложение 1. Программный код, содержащий функции взаимодействия с БД.

Задание на курсовой проект

Цель работы: разработка и написание ПО а также проектирование и реализация элементов БД для автоматизации организации работы с направлениями подготовки в учебных заведениях высшего и среднего-профессионального образования.

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

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

· Поддерживать рабочий интерфейс с уже реализованными компонентами БД (связи по внешнему ключу).

· Поддерживать целостность работы системы.

· Иметь возможность сохранять отклики (комментарии) пользователей и администраторов системы о причинах и результатах оформления заявок.

Исходные данные для выполнения курсового проекта

Среда реализации: Microsoft Visual Studio 2010;

СУБД: Microsoft SQL;

Сервер ASP.NET MVC, .Net 4.0 IIS;

Интерфейс работы с БД: Entity Framework, LinQ;

Среда проектирования БД: Allfusion ERWin.

Сокращения

БД - база данных

3НФ - третья нормальная форма

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

ФЗ - функциональная зависимость

ФИС ЕГЭ и приёма, система - Федеральная информационная служба Рособрнадзора о проведении Единого Государственного Экзамена и порядка приёма.

УЗ - учебное заведение (соотв. ВУЗ и ССУЗ - Высшее УЗ и Среднее спеиальное УЗ), пользователь системы ФИС.

Введение

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

Этапы выполнения курсового проекта:

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

· проектирование БД;

· реализация БД средствами выбранной СУБД;

· программная реализация интерфейса с БД.

Для анализа предметной области используется CASE-средство AllFusion Process Modeler, который входит в состав пакета AllFusion Modeler Suite. Проектирование моделей БД выполняется с помощью CASE-средства AllFusion ERwin Data Modeler, входящий в состав этого же пакета.

Реализация БД проводится в среде Microsoft SQL Server. В качестве языка реализации был выбран C# в среде Microsoft Visual Studio.

1. Анализ предметной области

1.1 Описание предметной области

Управление списками разрешённых направлениями: для каждого Уза предусмотрен список направлений, по которому он может проводить набор студентов для их обучения. В системе эти направления не могут редактироваться непосредственно УЗом, но могут редактироваться администраторами системы ФИС.

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

Предусмотрены комментарии пользователей о причине добавления/удаления (как пример: приказ), так и комментарии администраторов в случае отказа выполнения заявки. Доступ к комментариям должен сохраняться в независимости от результата обработки заявки.

Количество комментариев к одному направлению от одного пользователя неограниченно.

У одного УЗа может быть указано в заявке теоретически неограниченное количество направлений, причём на удаление могут указываться только направления, уже разрешённые для этого УЗа и, при этом, не входящие в конкурсные группы его незавершённых приёмных кампаний.

1.2 Определение объектов модели

Анализ построенных моделей позволил выделить информационные объекты предмтеной области. Состав и характеристика информационных объектов приведена в табл. 1.

Таблица 1. Информационные объекты и их свойства

Имя объекта

Описание объекта

Свойства объекта

Запрос на редактирование списка.

Содержит полную информацию о направлении и действии, которое необходимо произвести.

Номер запроса

Номер направления

Вид набора

Действие

Статус заявки

Дата создание заявки

Дата изменение статуса заявки

Комментарий к заявке

Содержит ветвь комментариев к каждому направлению каждого института. Необязательный атрибут.

Номер комментария

Комментатор

Дата создания комментария

Номер интститута

Номер направления

2. Проектирование базы данных

Проектирование БД предполагает разработку моделей нескольких типов:

· Модель «сущность - связь», которая строится на основе выделенных информационных объектов и определения связей между ними.

· Реляционная модель, которая формируется на основе модели «сущность - связь».

2.1 Разработка ER-модели

база данные предметный проектирование

На основе выделенных информационных объектов средствами Microsoft Visio была построена модель «сущность - связь» (рис. 2.1.).

Рис. 2.1. Модель «сущность-связь» для БД

Описание атрибутов таблицы «Заявка»:

Номер заявки - целое число, ненулевой тип, ключевой параметр, является внешним ключом (атрибут таблицы Институт - Номер института),

Номер направления - целое число, ненулевой тип, ключевой параметр, является внешним ключом (атрибут таблицы Направление подготовки - Номер направления),

Действие - строка, ненулевая, длина - 3,

Статус - строка, ненулевая, длина - 1,

Тип приёма набора - целое число, ненулевое,

Дата создания заявки - дата, необязательный атрибут,

Дата изменения заявки - дата, необязательный атрибут.

Описание атрибутов таблицы «Комментарий»:

Номер комментария - целое число, ненулевой тип, ключевой параметр,

Номер направления - целое число, ненулевой тип, является внешним ключом (атрибут таблицы Заявка - Номер направления),

Номер института - целое число, ненулевой тип, является внешним ключом (атрибут таблицы Заявка - Номер заявки),

Комментатор - строка, ненулевая,

Комментарий - строка, необязательный атрибут,

Дата добавления комментария - дата, необязательный тип.

2.2 Проектирование правил целостности БД

Поле

Правило целостности

Действие

Может принимать только значения 'ADD' или `DEL'

Статус

Может принимать только значения 'A', 'D' или 'W'

Номер направления

Больше нуля

Номер комментария

Больше нуля

Номер заявки

Больше нуля

Тип приёма набора

Число от 1 до 10

Все поля типа Date

Не ранее 01.01.2013

2.3 Анализ реляционной модели

Рис. 2.2 Реляционная модель БД

Для получения хороших характеристик работы с БД, она должна находиться в 3НФ. Для проверки этого необходимо обеспечить атомарность атрибутов, выделить функциональные зависимости (ФЗ) между атрибутами в каждом отношении и провести их анализ.

Отношение Request Direction, ключ отношения:

Request ID - Внешний ключ отношения Institution, атрибут InstitutionID,

DirectionID - Внешний ключ отноения Direction, атрибут DirectionID.

Функциональные зависимости:

Request ID, DirectionID > Activity,

Request ID, DirectionID > Action,

Request ID, DirectionID > ChangedDate,

Request ID, DirectionID > CreationDate,

DirectionID > AdmissionItemType.

Отношение RequestComments, ключ отношения:

Comment ID.

Функциональные зависимости:

CommentID > Commentor,

CommentID > Comment,

CommentID > Date,

CommentID > DirectionID,

CommentID > InstitutionID.

Других ФЗ для отношений не выявлено. Обоснование нахождения БД в 3НФ предполагает проверку ограничений, накладываемых в 3НФ.

1. Все таблицы БД находятся в 1НФ, их поля содержат атомарные значения.

2. Полная ФЗ неключевых атрибутов от ключа для RequestComments обеспечивается тем, что ключ в этом отношении простой.

3. Для отношения RequestDirection полная ФЗ между неключевыми атрибутами и составным ключом существует.

4. В разработанных отношениях отсутствуют транзитивные зависимости.

Следовательно, БД находится в 3НФ.

3. Реализация базы данных

В качестве СУБД для реализации БД в курсовом проекте была выбрана СУБД Microsoft SQL Server. Эта СУБД разработана корпорацией Microsoft и поддреживает реляционную модель БД. Основной используемый язык запросов - Transact-SQL, созданный совместно Microsoft и Sybase. Transact-SQL является реализацией стандарта ANSI/ISO структурированного языка запросов (SQL) с расширениями. СУБД SQL Server используется для работы со средними и большими БД. Ниже приведено описание БД средствами Transact-SQL.

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

SET ANSI_PADDING ON

GO

CREATE TABLE [dbo].[RequestDirection](

[Direction ID] [int] NOT NULL,

[Request ID] [int] NOT NULL,

[Activity] [varchar](1) NOT NULL,

[Action] [varchar](10) NOT NULL,

[AdmissionItemType] [int] NOT NULL,

[CreationDate] [datetime] NULL,

[ChangeDate] [datetime] NULL,

CONSTRAINT [PK_RequestDirection] PRIMARY KEY CLUSTERED

(

[Direction ID] ASC,

[Request ID] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY]

GO

SET ANSI_PADDING OFF

GO

ALTER TABLE [dbo].[RequestDirection] WITH CHECK ADD CONSTRAINT [FK_RequestDirection_Request] FOREIGN KEY([Request ID])

REFERENCES [dbo].[Institution] ([InstitutionID])

GO

ALTER TABLE [dbo].[RequestDirection] CHECK CONSTRAINT [FK_RequestDirection_Request]

GO

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

SET ANSI_PADDING ON

GO

CREATE TABLE [dbo].[RequestComments](

[Comment ID] [int] NOT NULL,

[Commentor] [varchar](5) NOT NULL,

[Comment] [text] NULL,

[Date] [datetime] NULL,

[DirectionID] [int] NOT NULL,

[InstitutionID] [int] NOT NULL,

CONSTRAINT [PK_RequestComments] PRIMARY KEY CLUSTERED

(

[Comment ID] ASC

)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

SET ANSI_PADDING OFF

GO

ALTER TABLE [dbo].[RequestComments] WITH NOCHECK ADD CONSTRAINT [FK_RequestComments_RequestDirection] FOREIGN KEY([DirectionID], [InstitutionID])

REFERENCES [dbo].[RequestDirection] ([Direction ID], [Request ID])

GO

ALTER TABLE [dbo].[RequestComments] NOCHECK CONSTRAINT [FK_RequestComments_RequestDirection]

GO

4. Программная реализация

Для реализации приложения с БД выбран язык С# и технология ADO.NET Entity Framework.

4.1 ADO .NET и Entity Framework

ADO.NET является набором классов, реализующих программные интерфейсы для облегчения подключения к БД из приложения, независимо от особенностей реализации конкретной СУБД. ADO .NET широко используется совместно с технологией web-программирования с использованием объектов ASP .NET для доступа к расположенным на сервере базам данных со стороны клиента.

Объектная модель ADO .NET реализует отсоединенный доступ к данным. При этом в Visual Studio .NET существует множество встроенных мастеров и дизайнеров, которые позволяют реализовать механизмы доступа к БД еще на этапе разработки программного кода. С другой стороны, задача получения доступа к данным может быть решена непосредственно во время выполнения приложения.

Концепция доступа к данным в ADO .NET основана на использовании двух компонентов:

* набора данных (представляется объектом класса DataSet) со стороны клиента. Это локальное временное хранилище данных;

* провайдера данных (представляется объектом класса DataProvider). Это посредник, обеспечивающий взаимодействие приложения и базы данных со стороны базы данных (в распределенных приложениях - со стороны сервера).

Объектная модель ADO .NET предполагает существование (при написании приложения для работы с базой данных - использование) двух множеств классов, выполняющих четко определенные задачи при работе с базой данных.

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

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

Приложения освобождаются от жестких зависимостей от конкретного ядра СУБД или схемы хранения.

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

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

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

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

Платформа Entity Framework впервые появилась как часть платформы .NET Framework и выпуске Microsoft Visual Studio. Начиная с Entity Framework версии 4.1 платформа Entity Framework не является частью .NET Framework, но построена на ее основе.

4.2 Примеры экранных форм интерфейса

Рис. 4.1 Форма добавления комментария Администратором системы в случае отказа выполнения заявки

Рис. 4.2 Таблица направлений указанных в заявке на выбранное ОУ

Рис. 4.3 Список ОУ, у которых есть заявки

Рис. 4.4 Интерфейс добавления направлений в заявку

Рис. 4.5 Кнопка вызывающая интерфейс заполнения заявки у пользователя

Рис. 4.6 Список направлений в заявке (интерфейс пользователя)

Рис. 4.7 Список разрешённых направлений после выполнения заявки

Литература

1. Microsoft Development network http://msdn.microsoft.com/en-US/

2. Н.П. Сидорова. Базы данных. Методическое пособие к курсовому проектированию. - М.: Изд-во МЭИ, 2010. - 40 с.

3. Рихтер Дж. CLR via C#. Программирование на платформе Microsoft .NET Framework 4.0 на языке C#. - Переводчик: Радченко И., Рузмайкина И., «Питер», 2012 - 928 с.

Приложение 1. Программный код, содержащий функции взаимодействия с БД

Контроллёры - пользователь ОУ:

[HttpPost]

[Authorize(Roles = UserRole.EduAdmin)]

public AjaxResultModel RequestDisabled()

{

using (InstitutionsEntities dbContext = new InstitutionsEntities())

{

return new AjaxResultModel { Data = (dbContext.RequestDirection.Any(x => x.Activity == "A")) };

}

}

[HttpPost]

[Authorize(Roles = UserRole.EduAdmin)]

public ActionResult CancelRequest(string directionID)

{

using (InstitutionsEntities dbContext = new InstitutionsEntities())

{

int dir = Convert.ToInt32(directionID);

//IQueryable<int> tlist = dbContext.Request.Where(x => x.InstitutionID == InstitutionID).Select(x => x.ID_Request);

RequestDirection toCancel = dbContext.RequestDirection.Where(x => x.Direction_ID == dir && x.Request_ID == InstitutionID).First();

if (toCancel.Activity == "W")

{

dbContext.DeleteObject(toCancel);

dbContext.SaveChanges();

// TODO: Finish Comment Deleting

return new AjaxResultModel();

}

else

return new AjaxResultModel("Данное направление в данный момент обрабатывается администратором.");

}

}

[HttpPost]

[Authorize(Roles = UserRole.EduAdmin)]

public ActionResult AllowedDirectionsGetAvailableEdu(AllowedDirectionAddViewModel model)

{

using (InstitutionsEntities dbContext = new InstitutionsEntities())

{

return dbContext.GetRemainedAvailableAllowedDirections(model, InstitutionID);

}

}

[HttpPost]

[Authorize(Roles = UserRole.EduAdmin)]

public ActionResult AllowedDirectionsGetExistingEdu(AllowedDirectionAddViewModel model)

{

using (InstitutionsEntities dbContext = new InstitutionsEntities())

{

return dbContext.GetAllowedDirections(model, InstitutionID);

}

}

[HttpPost]

[Authorize(Roles = UserRole.EduAdmin)]

public ActionResult RequestDirectionListDenied()

{

using (InstitutionsEntities dbContext = new InstitutionsEntities())

{

return dbContext.GetDeniedDirections(InstitutionID);

}

}

[HttpPost]

[Authorize(Roles = UserRole.EduAdmin)]

public ActionResult ClearAllDenied()

{

using (InstitutionsEntities dbContext = new InstitutionsEntities())

{

return dbContext.DeleteDenied(InstitutionID);

}

}

[HttpPost]

[Authorize(Roles = UserRole.EduAdmin)]

public ActionResult AllowedDirectionsDeleteEdu()

{

using (InstitutionsEntities dbContext = new InstitutionsEntities())

{

var model = dbContext.FillAllowedDirectionAddModel();

return PartialView("Admission/DeleteAllowedDirectionEdu", model);

}

}

[HttpPost]

[Authorize(Roles = UserRole.EduAdmin)]

public ActionResult RequestDirectionListToAdd()

{

using (InstitutionsEntities dbContext = new InstitutionsEntities())

{

return dbContext.GetRequestedToAddDirections(InstitutionID);

}

}

[HttpPost]

[Authorize(Roles = UserRole.EduAdmin)]

public ActionResult RequestDirectionListToDelete()

{

using (InstitutionsEntities dbContext = new InstitutionsEntities())

{

return dbContext.GetRequestedToDeleteDirections(InstitutionID);

}

}

[HttpPost]

[Authorize(Roles = UserRole.EduAdmin)]

public ActionResult DeleteDirectionRequest(int? directionid, string comment, int? admissiontype)

{

int DirID = directionid ?? 0;

int AdType = admissiontype ?? 0;

if (DirID == 0) return new AjaxResultModel("");

if (AdType == 0) return new AjaxResultModel("");

using (InstitutionsEntities dbContext = new InstitutionsEntities())

{

using (EntrantsEntities dbContext1 = new EntrantsEntities())

{

if (dbContext1.IsInCompetitiveGroup(InstitutionID, DirID, AdType))

{

string s = dbContext.Direction.Where(x => x.DirectionID == DirID).Select(x => x.Name).Single().ToString();

//return new AjaxResultModel(@"Нельзя удалить направление """ + s + @""" т.к. оно содержится в конкурсных группах.");

return new AjaxResultModel(s);

}

}

try

{

RequestDirection req = Model.Institutions.RequestDirection.CreateRequestDirection(DirID, InstitutionID, "W", "Delete", AdType);

dbContext.RequestDirection.AddObject(req);

dbContext.SaveChanges();

int y;

/*try

{*/

y = dbContext.RequestComments.Select(x => x.Comment_ID).Count();

/*}

catch (System.InvalidOperationException)

{ y = 0; }*/

RequestComments rc = Model.Institutions.RequestComments.CreateRequestComments(y + 1, "U", DirID, InstitutionID);;

rc.Comment = comment;

dbContext.RequestComments.AddObject(rc);

dbContext.SaveChanges();

}

catch (System.Data.UpdateException)

{

return new AjaxResultModel();

}

return new AjaxResultModel();

}

}

[HttpPost]

[Authorize(Roles = UserRole.EduAdmin)]

public ActionResult AddDirectionRequest(int? directionid, string comment, int? admissiontype)

{

if (directionid == null) return new AjaxResultModel();

using (InstitutionsEntities dbContext = new InstitutionsEntities())

{

try

{

RequestDirection req = Model.Institutions.RequestDirection.CreateRequestDirection(directionid ?? 0, InstitutionID, "W", "Add", admissiontype ?? 0);

dbContext.RequestDirection.AddObject(req);

//dbContext.SaveChanges();

int y;

/*try

{*/

y = dbContext.RequestComments.Count();

/*}

catch (System.InvalidOperationException)

{ y = 0; }*/

RequestComments rc = Model.Institutions.RequestComments.CreateRequestComments(y + 1, "U", directionid ?? 0, InstitutionID);

rc.Comment = comment;

dbContext.RequestComments.AddObject(rc);

dbContext.SaveChanges();

}

catch (System.Data.UpdateException)

{

}

return new AjaxResultModel();

}

}

[HttpPost]

[Authorize(Roles = UserRole.EduAdmin)]

public ActionResult AllowedDirectionsAddEdu()

{

using (InstitutionsEntities dbContext = new InstitutionsEntities())

{

var model = dbContext.FillAllowedDirectionAddModel();

return PartialView("Admission/AddAllowedDirectionEdu", model);

}

}

Функции из файлов расширения:
public static AjaxResultModel GetAllowedDirections(this InstitutionsEntities dbContext, AllowedDirectionAddViewModel model, int institutionID)

{

var existing = dbContext.AllowedDirections

.Where(x => x.InstitutionID == institutionID && x.AdmissionItemTypeID == model.EducationLevelID && x.Direction.ParentID == model.ParentDirectionID)

.Select(x => x.DirectionID);

List<string> qualCodes = new List<string>();

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

if (model.EducationLevelID == EDLevelConst.Bachelor)

qualCodes.Add("62");

if (model.EducationLevelID == EDLevelConst.BachelorShort)

qualCodes.Add("62");

if (model.EducationLevelID == EDLevelConst.Magistracy)

qualCodes.Add("68");

if (model.EducationLevelID == EDLevelConst.SPO)

{

qualCodes.Add("51");

qualCodes.Add("52");

}

if (model.EducationLevelID == EDLevelConst.Speciality)

qualCodes.Add("65");

var avail =

dbContext.Direction.Where(x => x.ParentID == model.ParentDirectionID && existing.Contains(x.DirectionID))

.OrderBy(x => x.Code)

.Select(x => new { ID = x.DirectionID, Code = x.Code, Name = x.Name, Period = x.PERIOD, x.QUALIFICATIONCODE }).ToArray()

.Where(x => qualCodes.Contains((x.QUALIFICATIONCODE ?? "").Trim()))

.Select(x => new { ID = x.ID, Code = x.Code, QualificationCode = x.QUALIFICATIONCODE, Name = x.Name, Period = (x.Period ?? "").Trim() }).ToArray();

return new AjaxResultModel { Data = avail };

}

/// <summary>

/// Список напрвалений отражённых в заявке на добавление

/// </summary>

public static AjaxResultModel GetRequestedToAddDirections(this InstitutionsEntities dbContext, int institutionID)

{

List<int> temp1;

temp1 = dbContext.RequestDirection.Where(y => y.Activity == "W" && y.Request_ID == institutionID && y.Action == "Add").Select(n => n.Direction_ID).ToList();

List<int> temp2 = new List<int>();

foreach (int intro in temp1)

{

temp2.Add(Convert.ToInt32(intro));

}

var avail =

dbContext.Direction.Where(x => x.DirectionID > 0 && temp2.Contains(x.DirectionID))

.OrderBy(x => x.Code)

.Select(x => new { ID = x.DirectionID, Code = x.Code, Name = x.Name, Period = x.PERIOD, x.QUALIFICATIONCODE }).ToArray()

//.Where(x => qualCodes.Contains((x.QUALIFICATIONCODE ?? "").Trim()))

.Select(x => new { ID = x.ID, Code = x.Code, QualificationCode = x.QUALIFICATIONCODE, Name = x.Name, Period = (x.Period ?? "").Trim() }).ToArray();

return new AjaxResultModel { Data = avail };

}

/// <summary>

/// Список напрвалений отражённых в заявке на udalenie

/// </summary>

public static AjaxResultModel GetRequestedToDeleteDirections(this InstitutionsEntities dbContext, int institutionID)

{

List<int> temp1;

temp1 = dbContext.RequestDirection.Where(y => y.Activity == "W" && y.Request_ID == institutionID && y.Action == "Delete").Select(n => n.Direction_ID).ToList();

List<int> temp2 = new List<int>();

foreach (int intro in temp1)

{

temp2.Add(Convert.ToInt32(intro));

}

var avail =

dbContext.Direction.Where(x => x.DirectionID > 0 && temp2.Contains(x.DirectionID))

.OrderBy(x => x.Code)

.Select(x => new { ID = x.DirectionID, Code = x.Code, Name = x.Name, Period = x.PERIOD, x.QUALIFICATIONCODE }).ToArray()

//.Where(x => qualCodes.Contains((x.QUALIFICATIONCODE ?? "").Trim()))

.Select(x => new { ID = x.ID, Code = x.Code, QualificationCode = x.QUALIFICATIONCODE, Name = x.Name, Period = (x.Period ?? "").Trim() }).ToArray();

return new AjaxResultModel { Data = avail };

}

public static AjaxResultModel GetDeniedDirections(this InstitutionsEntities dbContext, int institutionID)

{

List<int> temp1;

temp1 = dbContext.RequestDirection.Where(y => y.Activity == "D" && y.Request_ID == institutionID).Select(n => n.Direction_ID).ToList();

List<int> temp2 = new List<int>();

foreach (int intro in temp1)

{

temp2.Add(Convert.ToInt32(intro));

}

var avail =

dbContext.Direction.Where(x => x.DirectionID > 0 && temp2.Contains(x.DirectionID))

.OrderBy(x => x.Code)

.Select(x => new { ID = x.DirectionID, Code = x.Code, Name = x.Name, Period = x.PERIOD, x.QUALIFICATIONCODE }).ToArray()

//.Where(x => qualCodes.Contains((x.QUALIFICATIONCODE ?? "").Trim()))

.Select(x => new { ID = x.ID, Code = x.Code, QualificationCode = x.QUALIFICATIONCODE, Name = x.Name, Period = (x.Period ?? "").Trim() }).ToArray();

var query1 = dbContext.RequestComments

Where(x => temp1.Contains(x.RequestDirection.Direction_ID)

&& x.InstitutionID == institutionID

&& x.Commentor == "A")

.OrderByDescending(x => x.Date);

List<RequestComments> rlist = new List<RequestComments>();

foreach (RequestComments rq in query1)

{

if (!rlist.Select(x => x.DirectionID).Contains(rq.DirectionID))

{

rlist.Add(rq);

}

}

var comment = rlist

.Select(x => new { ID = x.DirectionID, Comment = x.Comment });

return new AjaxResultModel { Data = new { Direction = avail, Comment = comment } };

}

/// <summary>

/// Удаляем отклонённые направления в заявке

/// </summary>

public static AjaxResultModel DeleteDenied(this InstitutionsEntities dbContext, int instid)

{

var db = dbContext.RequestDirection.Where(x => x.Request_ID == instid && x.Activity == "D");

foreach (RequestDirection rd in db)

{

dbContext.RequestDirection.DeleteObject(rd);

}

dbContext.SaveChanges();

return new AjaxResultModel();

}

/// <summary>

/// Добавляем новое разрешённое направление в базу

/// </summary>

public static AjaxResultModel AddAllowedDirection(this EntrantsEntities dbContext, AllowedDirectionAddViewModel model, int institutionID)

{

//пришли ошибочные данные, ничего не делаем. Ситуация в нормальной жизни не должна быть

if (!dbContext.AdmissionItemType.Any(x => x.ItemTypeID == model.EducationLevelID && x.ItemLevel == 2))

return new AjaxResultModel();

foreach (var directionID in (model.DirectionIDs ?? new int[0]))

{

// если нет ещё, то добавляем

if (!dbContext.AllowedDirections.Any(x => x.DirectionID == directionID && x.AdmissionItemTypeID == model.EducationLevelID && x.InstitutionID == institutionID))

{

AllowedDirections ad = new AllowedDirections();

ad.InstitutionID = institutionID;

ad.AdmissionItemTypeID = (short)model.EducationLevelID;

ad.DirectionID = directionID;

dbContext.AllowedDirections.AddObject(ad);

}

dbContext.SaveChanges();

}

return new AjaxResultModel();

}

/// <summary>

/// Удаляем разрешённое направление из базы. Проверям что это допустимо.

/// </summary>

public static AjaxResultModel DeleteAllowedDirection(this EntrantsEntities dbContext, int educationLevelID, int directionID, int institutionID)

{

//пришли ошибочные данные, ничего не делаем. Ситуация в нормальной жизни не должна быть

if (!dbContext.AdmissionItemType.Any(x => x.ItemTypeID == educationLevelID && x.ItemLevel == 2))

return new AjaxResultModel();

if (dbContext.CompetitiveGroupItem.Any(x => x.CompetitiveGroup.InstitutionID == institutionID && x.DirectionID == directionID

&& x.EducationLevelID == educationLevelID))

return new AjaxResultModel("Невозможно удалить направление, так как оно используется в конкурсных группах.");

var ad = dbContext.AllowedDirections.FirstOrDefault(x => x.DirectionID == directionID && x.AdmissionItemTypeID == educationLevelID && x.InstitutionID == institutionID);

if (ad != null)

{

// до кучи удаляем объём приёма, он уже больше не нужен (КГ проверили, нет)

dbContext.AdmissionVolume

.Where(x => x.DirectionID == directionID && x.InstitutionID == institutionID && x.AdmissionItemTypeID == educationLevelID)

.ToList().ForEach(dbContext.AdmissionVolume.DeleteObject);

dbContext.AllowedDirections.DeleteObject(ad);

dbContext.SaveChanges();

}

return new AjaxResultModel();

}

public static bool IsInCompetitiveGroup(this EntrantsEntities dbContext, int institution, int direction, int admtype)

{

return (dbContext.CompetitiveGroupItem.Any(x => x.CompetitiveGroup.InstitutionID == institution && x.DirectionID == direction && x.EducationLevelID == (short)admtype))

;

}

Контроллёры - администратор ФИС:

[Authorize(Roles = UserRole.FBDAdmin)]

public ActionResult ReqList()

{

using (InstitutionsEntities dbContext = new InstitutionsEntities())

{

return View("../Admission/RequestList", dbContext.InitialFillRequestListViewModel(InstitutionID));

}

}

[Authorize]

[HttpPost]

public AjaxResultModel MakeEditable(int? institutionid)

{

if (institutionid == null)

return new AjaxResultModel("Invalid value of Institution ID.");

using (InstitutionsEntities dbContext = new InstitutionsEntities())

{

return dbContext.AtoU(institutionid ?? 0);

}

}

[Authorize(Roles = UserRole.FBDAdmin)]

[HttpPost]

public AjaxResultModel GetRequestList(RequestListViewModel model)

{

using (var dbContext = new InstitutionsEntities())

{

return dbContext.GetRequestList(model);

}

}

[Authorize(Roles = UserRole.FBDAdmin)]

[HttpPost]

public AjaxResultModel GetRequest(int? institutionid)

{

using (var dbContext = new InstitutionsEntities())

{

return dbContext.FillRequestList(institutionid ?? 0);

}

}

[Authorize(Roles = UserRole.FBDAdmin)]

[HttpPost]

public AjaxResultModel AddDirection(int? did, int? inid, int? adtype)

{

using (var dbContext = new InstitutionsEntities())

{

return dbContext.AcceptRequest(did ?? 0, inid ?? 0, adtype ?? 0);

}

}

[Authorize(Roles = UserRole.FBDAdmin)]

[HttpPost]

public AjaxResultModel DenyRequest(int? did,string comment, int? inid)

{

using (var dbContext = new InstitutionsEntities())

{

return dbContext.DenyRequestAdmin(did ?? 0, inid ?? 0, comment);

}

}

public ActionResult Index()

{

return View();

}

Функции из файлов расширения:

public static RequestListViewModel InitialFillRequestListViewModel(this InstitutionsEntities dbContext, int currentInstitutionID)

{

RequestListViewModel model = new RequestListViewModel();

model.CurrentInstitutionID = currentInstitutionID;

return model;

}

public static AjaxResultModel FillRequestList(this InstitutionsEntities dbContext, int InstID)

{

var query = dbContext.RequestDirection.Where(x => x.Request_ID == InstID && x.Activity == "W").Select(x => x.Direction_ID);

var current = dbContext.Direction.Where(x => query.Contains(x.DirectionID)).OrderBy(x => x.DirectionID)

.Select(x => new { ID = x.DirectionID, Code = x.Code, Name = x.Name, Period = x.PERIOD, x.QUALIFICATIONCODE}).ToArray()

.Select(x => new { ID = x.ID, Code = x.Code, QualificationCode = x.QUALIFICATIONCODE, Name = x.Name, Period = (x.Period ?? "").Trim() }).ToArray();;

var query1 = dbContext.RequestComments.Include(x => x.RequestDirection).Where(x => x.InstitutionID == InstID && x.Commentor == "U").OrderByDescending(x => x.Date);

List<RequestComments> rlist = new List<RequestComments>();

foreach (RequestComments rq in query1)

{

if (!rlist.Select(x => x.DirectionID).Contains(rq.DirectionID))

{

rlist.Add(rq);

}

}

foreach (RequestDirection rd in dbContext.RequestDirection.Where(x => x.Request_ID == InstID && x.Activity == "W"))

{

rd.Activity = "A";

}

dbContext.SaveChanges();

RequestThread rt = new RequestThread(InstID);

return new AjaxResultModel { Data = new { Request = current, Comment = rlist.OrderBy(x => x.DirectionID).Select(x => new { DirectionID = x.DirectionID, Comment = x.Comment, Action = x.RequestDirection.Action, admissionType = x.RequestDirection.AdmissionItemType}) } };

}

public static AjaxResultModel GetInstitutionList(this InstitutionsEntities dbContext, InstitutionListViewModel model)

{

var query = dbContext.Institution

.Include(x => x.RegionType)

.Include(x => x.FormOfLaw)

.Include(x => x.UserPolicy);

//sorting

if ((model.SortID ?? 0) == 0)

model.SortID = 1;

if (model.SortID == 1) query = query.OrderBy(x => x.FullName);

if (model.SortID == -1) query = query.OrderByDescending(x => x.FullName);

if (model.SortID == 2) query = query.OrderBy(x => x.InstitutionTypeID);

if (model.SortID == -2) query = query.OrderByDescending(x => x.InstitutionTypeID);

if (model.SortID == 3) query = query.OrderBy(x => x.RegionType.Name);

if (model.SortID == -3) query = query.OrderByDescending(x => x.RegionType.Name);

if (model.SortID == 4) query = query.OrderBy(x => x.OwnerDepartment);

if (model.SortID == -4) query = query.OrderByDescending(x => x.OwnerDepartment);

if (model.SortID == 5) query = query.OrderBy(x => x.UserPolicy.Count());

if (model.SortID == -5) query = query.OrderByDescending(x => x.UserPolicy.Count());

model.TotalItemCount = query.Count();

if (model.Filter != null)

{

if (!String.IsNullOrEmpty(model.Filter.ShortName))

query = query.Where(x => x.BriefName.Contains(model.Filter.ShortName));

if (!String.IsNullOrEmpty(model.Filter.FullName))

query = query.Where(x => x.FullName.Contains(model.Filter.FullName));

if (!String.IsNullOrEmpty(model.Filter.Owner))

query = query.Where(x => x.OwnerDepartment.Contains(model.Filter.Owner));

if (model.Filter.InstitutionTypeID > 0)

query = query.Where(x => x.InstitutionTypeID == model.Filter.InstitutionTypeID);

if (model.Filter.FormOfLawID > 0)

query = query.Where(x => x.FormOfLawID == model.Filter.FormOfLawID);

if (model.Filter.RegionID > 0)

query = query.Where(x => x.RegionID == model.Filter.RegionID);

if (!String.IsNullOrEmpty(model.Filter.OGRN))

query = query.Where(x => x.OGRN == model.Filter.OGRN);

if (!String.IsNullOrEmpty(model.Filter.INN))

query = query.Where(x => x.OGRN == model.Filter.INN);

}

var pageNumber = model.PageNumber;

if (!pageNumber.HasValue || pageNumber < 0) pageNumber = 0;

int totalCount = query.Count();

model.TotalItemFilteredCount = totalCount;

model.TotalPageCount = ((Math.Max(totalCount, 1) - 1) / InstitutionListPageSize) + 1;

var filtQuery = query

.Skip(pageNumber.Value * InstitutionListPageSize)

.Take(InstitutionListPageSize);

model.Institutions = filtQuery.ToArray().Select(x => new InstitutionListViewModel.InstitutionData

{

InstitutionID = x.InstitutionID,

ShortName = x.BriefName ?? x.FullName ?? "",

FullName = x.FullName ?? "",

InstitutionTypeName = x.InstitutionTypeID == 1 ? "ВУЗ" : (x.InstitutionTypeID == 2 ? "ССУЗ" : ""),

FormOfLawName = x.FormOfLaw != null ? x.FormOfLaw.Name : "",

Owner = x.OwnerDepartment ?? "",

RegionName = x.RegionType != null ? x.RegionType.Name : "",

UserCount = x.UserPolicy.Count()

}).ToArray();

return new AjaxResultModel { Data = model };

}

/// <summary>

/// Возвращаем интституты и их заявки

/// </summary>

public static AjaxResultModel GetRequestList(this InstitutionsEntities dbContext, RequestListViewModel model)

{

//var query = from request in dbContext.RequestDirection

// join institute in dbContext.Institution on request.Request_ID equals institute.InstitutionID

// select new { InstId = institute.InstitutionID, /*Date = request.ChangeDate,*/ name = institute.FullName, /*DirId = request.Direction_ID */};

//query = query.Distinct();

var query2 = dbContext.RequestDirection.Where(x => x.Activity == "W").Include(x => x.Institution);

List<int> query1 = query2.Select(x => x.Institution.InstitutionID).Distinct().ToList();

List<RequestDirection> queryL = new List<RequestDirection>();

foreach (RequestDirection q in query2)

{

if (query1.Contains(q.Request_ID))

{

queryL.Add(q);

query1.Remove(q.Institution.InstitutionID);

}

}

var query = queryL.AsEnumerable();

//sorting

if ((model.SortID ?? 0) == 0)

model.SortID = 1;

if (model.SortID == 1) query = query.OrderBy(x => x.Institution.FullName);

if (model.SortID == -1) query = query.OrderByDescending(x => x.Institution.FullName);

if (model.SortID == 3) query = query.OrderBy(x => x.ChangeDate);

if (model.SortID == -3) query = query.OrderByDescending(x => x.ChangeDate);

if (model.SortID == 2) query = query.OrderBy(x => dbContext.RequestDirection.Where(z => z.Institution.InstitutionID == x.Request_ID && z.Activity == "W").Count());

if (model.SortID == -2) query = query.OrderByDescending(x => dbContext.RequestDirection.Where(z => z.Institution.InstitutionID == x.Request_ID && z.Activity == "W").Count());

model.TotalItemCount = query.Count();

/*

if (model.Filter != null)

{

if (!String.IsNullOrEmpty(model.Filter.ShortName))

query = query.Where(x => x.BriefName.Contains(model.Filter.ShortName));

if (!String.IsNullOrEmpty(model.Filter.FullName))

query = query.Where(x => x.FullName.Contains(model.Filter.FullName));

if (!String.IsNullOrEmpty(model.Filter.Owner))

query = query.Where(x => x.OwnerDepartment.Contains(model.Filter.Owner));

if (model.Filter.InstitutionTypeID > 0)

query = query.Where(x => x.InstitutionTypeID == model.Filter.InstitutionTypeID);

if (model.Filter.FormOfLawID > 0)

query = query.Where(x => x.FormOfLawID == model.Filter.FormOfLawID);

if (model.Filter.RegionID > 0)

query = query.Where(x => x.RegionID == model.Filter.RegionID);

if (!String.IsNullOrEmpty(model.Filter.OGRN))

query = query.Where(x => x.OGRN == model.Filter.OGRN);

if (!String.IsNullOrEmpty(model.Filter.INN))

query = query.Where(x => x.OGRN == model.Filter.INN);

}

*/

var pageNumber = model.PageNumber;

if (!pageNumber.HasValue || pageNumber < 0) pageNumber = 0;

int totalCount = query.Count();

model.TotalItemFilteredCount = totalCount;

model.TotalPageCount = ((Math.Max(totalCount, 1) - 1) / InstitutionListPageSize) + 1;

var filtQuery = query

.Skip(pageNumber.Value * InstitutionListPageSize)

.Take(InstitutionListPageSize);

model.Institutions = filtQuery.ToArray().Select(x => new RequestListViewModel.InstitutionData

{

InstitutionID = x.Request_ID,

FullName = x.Institution.FullName,

RequestNumber = dbContext.RequestDirection.Where(z => z.Institution.InstitutionID == x.Request_ID && z.Activity == "W").Count(),

Date = x.ChangeDate.ToString()

}).ToArray();

return new AjaxResultModel { Data = model };

}

public static AjaxResultModel DenyRequestAdmin(this InstitutionsEntities dbContext, int DirectionID, int InstitutionID, string Comment)

{

if (DirectionID * InstitutionID == 0) return new AjaxResultModel("Data sending error. Try again later.");

RequestDirection rq = dbContext.RequestDirection.Where(x => x.Direction_ID == DirectionID && x.Request_ID == InstitutionID).Single();

rq.Activity = "D";

RequestComments rc = Model.Institutions.RequestComments.CreateRequestComments(dbContext.RequestComments.Count() + 1, "A", DirectionID, InstitutionID);

rc.Comment = Comment;

dbContext.AddToRequestComments(rc);

dbContext.SaveChanges();

return new AjaxResultModel();

}

public static AjaxResultModel AcceptRequest(this InstitutionsEntities dbContext, int DirID, int InstId, int adType)

{

RequestDirection rd = dbContext.RequestDirection.Where(x => x.Direction_ID == DirID && x.Request_ID == InstId && x.AdmissionItemType == adType).Single();

using (EntrantsEntities dbContextE = new EntrantsEntities())

{

if (rd.Action == "Add")

{

GVUZ.Model.Entrants.AllowedDirections ad = new GVUZ.Model.Entrants.AllowedDirections();

ad.InstitutionID = InstId;

ad.AdmissionItemTypeID = (short)adType;

ad.DirectionID = DirID;

dbContextE.AllowedDirections.AddObject(ad);

}

if (rd.Action == "Delete")

{

GVUZ.Model.Entrants.AllowedDirections ad = dbContextE.AllowedDirections.Where(x =>

x.InstitutionID == InstId &&

x.AdmissionItemTypeID == (short)adType &&

x.DirectionID == DirID).First();

dbContextE.AllowedDirections.DeleteObject(ad);

}

dbContextE.SaveChanges();

}

dbContext.RequestDirection.DeleteObject(rd);

dbContext.SaveChanges();

return new AjaxResultModel();

}

public static AjaxResultModel AtoU(this InstitutionsEntities dbContext, int instid)

{

foreach (RequestDirection rd in dbContext.RequestDirection.Where(x => x.Activity == "A" && x.Request_ID == instid))

{

rd.Activity = "W";

}

dbContext.SaveChanges();

return new AjaxResultModel();

}

class RequestThread

{

System.Threading.Thread thread;

InstitutionsEntities dbContext;

public RequestThread(int instID)

{

thread = new System.Threading.Thread(this.func);

thread.Start(instID);

dbContext = new InstitutionsEntities();

}

void func(object instID)

{

int id = Convert.ToInt32(instID);

System.Threading.Thread.Sleep(900000);

foreach (RequestDirection rd in dbContext.RequestDirection.Where(x => x.Activity == "A" && x.Request_ID == id))

{

rd.Activity = "W";

}

dbContext.SaveChanges();

}

}

Размещено на Allbest.ru


Подобные документы

  • Анализ предметной области и введение ограничений. Выделение базовых сущностей. Концептуальная модель данных. Построение схемы реляционной модели базы данных магазина одежды в третьей нормальной форме. Описание физической БД. Проектирование интерфейса.

    курсовая работа [2,6 M], добавлен 20.11.2013

  • Анализ данных предметной области. Информационно-логическая модель базы данных. Физическое проектирование и мероприятия по защите и обеспечению целостности базы данных. Приложение интерфейса для SQL-сервера базы данных на языке программирования Delphi.

    курсовая работа [2,2 M], добавлен 30.05.2013

  • Построение инфологической (концептуальной) модели предметной области. Проектирование логической и физической структуры базы данных. Реализация проекта в среде конкретной СУБД. Организация корректировки и ввода данных в БД. Разработка интерфейса.

    курсовая работа [1,4 M], добавлен 14.01.2018

  • Системный анализ предметной области. Построение концептуальной и даталогичной модели базы данных. Физическое проектирование базы данных. Описание функциональной модели системы управления базами данных. Разработка экранных форм ввода-вывода и отчета.

    курсовая работа [1,1 M], добавлен 09.12.2014

  • Выбор методологии проектирования и системы управления базами данных. Описание предметной области и проектирование физической структуры базы данных. Реализация проекта в MS SQL Server 2008. Построение инфологической модели. Ограничения целостности связи.

    курсовая работа [679,2 K], добавлен 22.01.2013

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

    курсовая работа [1,7 M], добавлен 18.01.2012

  • Система управления базой данных (СУБД), централизованное обеспечение безопасности и целостности данных, защита от несанкционированного доступа. Построение концептуальной и реляционной моделей. Процесс нормализации. Проектирование базы данных в ACCESS.

    курсовая работа [1,8 M], добавлен 29.10.2008

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

    курсовая работа [1,4 M], добавлен 23.09.2016

  • Ограничения, присутствующие в предметной области. Проектирование инфологической модели данных. Описание основных сущностей и их атрибутов. Логический и физический уровни модели данных. Реализация базы данных: представления, триггеры, хранимые процедуры.

    курсовая работа [1,7 M], добавлен 10.02.2013

  • Разработка концептуальной модели базы данных "Чемпионат авто": описание предметной области, каталог задач, описание таблиц, схема данных, ER-диаграмма. Проектирование реляционной модели "Спортивный комплекс". Реализация и результат работы базы данных.

    курсовая работа [3,7 M], добавлен 14.06.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.