Управление списками разрешённых направлений
Анализ предметной области. Проектирование базы данных и ее реализация. Проектирование правил целостности базы данных. Анализ реляционной модели. Примеры экранных форм интерфейса. Программный код, содержащий функции взаимодействия с базой данных.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 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