Основная функция модератора - просмотр заявок, у которых еще не назначен исполнитель, и собственно назначение исполнителя. Для этого добавим в контроллер RequestController метод Distribute:
[HttpGet] [Authorize(Roles="Модератор")] public ActionResult Distribute() { var requests = db.Requests.Include(r => r.User) .Include(r=>r.Lifecycle) .Include(r=>r.Executor) .Where(r=>r.ExecutorId==null) .Where(r=>r.Status!=(int)RequestStatus.Closed); List<User> executors = db.Users.Include(e=>e.Role) .Where(e=>e.Role.Name=="Исполнитель").ToList<User>(); ViewBag.Executors = new SelectList(executors, "Id", "Name"); return View(requests); } [HttpPost] [Authorize(Roles = "Модератор")] public ActionResult Distribute(int? requestId, int? executorId) { if (requestId == null && executorId == null) { return RedirectToAction("Distribute"); } Request req = db.Requests.Find(requestId); User ex = db.Users.Find(executorId); if(req==null && ex==null) { return RedirectToAction("Distribute"); } req.ExecutorId = executorId; req.Status = (int)RequestStatus.Distributed; Lifecycle lifecycle = db.Lifecycles.Find(req.LifecycleId); lifecycle.Distributed = DateTime.Now; db.Entry(lifecycle).State = EntityState.Modified; db.Entry(req).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("Distribute"); }
В get-версии метода получаем заявки, у которых не определен исполнитель, а также список исполнителей.
В post-версии метода мы получаем через параметры id заявки и id выбранного исполнителя. Далее у нас логика может быть следующей: если заявка только открыта, то мы меняем ее статус. Иначе просто устанавливаем исполнителя. В принципе можно также добавить смену исполнителя, даже если он уже определен, но для простоты я оставил так как есть.
Теперь добавим для этого метода представление Distribute.cshtml:
@model IEnumerable<Request> @using HelpDeskTrain.Models @{ ViewBag.Title = "Список заявок"; int i = 0; } <h2>Список заявок</h2> <p>Всего нераспределенных заявок: @(Model.Count<Request>())</p> <table> @foreach (var item in Model) { i++; <tr> <td><b>@i</b></td> <td> @if (item.Status == (int)RequestStatus.Open) { <img src="../../Content/pictures/status1.png" title="Заявка открыта" class="tdImage" /> } else if (item.Status == (int)RequestStatus.Distributed) { <img src="../../Content/pictures/status2.png" title="Заявка распределена" class="tdImage" /> } else if (item.Status == (int)RequestStatus.Proccesing) { <img src="../../Content/pictures/status3.png" title="Заявка в процессе" class="tdImage" /> } else if (item.Status == (int)RequestStatus.Checking) { <img src="../../Content/pictures/status4.png" title="Заявка на проверке" class="tdImage" /> } </td> <td> @if (item.Priority == (int)RequestPriority.Low) { <img src="../../Content/pictures/prior1.png" title="Низкий приоритет" class="tdImage" /> } else if (item.Priority == (int)RequestPriority.Medium) { <img src="../../Content/pictures/prior2.png" title="Средний приоритет" class="tdImage" /> } else if (item.Priority == (int)RequestPriority.High) { <img src="../../Content/pictures/prior3.png" title="Высокий приоритет" class="tdImage" /> } else if (item.Priority == (int)RequestPriority.Critical) { <img src="../../Content/pictures/prior4.png" title="Критичный приоритет" class="tdImage" /> } </td> <td> @if (item.File != null) { <a href="/Request/Download/@item.Id"> <img src="../../Content/pictures/filey.png" title='@item.File' class="tdImage" /> </a> } else { <img src="../../Content/pictures/filen.png" title="без файла изображения" class="tdImage" /> } </td> <td> @Html.DisplayFor(modelItem => item.Lifecycle.Opened) </td> <td> @Html.DisplayFor(modelItem => item.User.Name) </td> <td> @Html.DisplayFor(modelItem => item.Activ.CabNumber) </td> <td> @Html.DisplayFor(modelItem => item.Name) </td> <td> <div><a class="openDialog" data-dialog-id="infoDialog" data-dialog-title="Описание заявки" href="/Request/Details/@item.Id"> <img src="../../Content/pictures/info.png" class="tdImage" title="Описание заявки" /> </a></div> </td> @if((ViewBag.Executors as SelectList).Count()>0) { using (Html.BeginForm()) { <td> @Html.Hidden("requestId", item.Id) @Html.DropDownList("executorId", ViewBag.Executors as SelectList) </td> <td> <input type="submit" value="Назначить" /> </td> } } else { <td> В БД отсутствуют исполнители </td> } </tr> } </table> @Styles.Render("~/Content/themes/base/css") @section Scripts { @Scripts.Render("~/bundles/jqueryui") }
Все то же самое, тот же список заявок, но теперь мы добавляем небольшую формочку для каждой заявки, в которой у нас в скрытом поле id заявки и выпадающий список исполнителей. Выбрав исполнителя и нажав на кнопку, мы утвердим данного исполнителя для выполнения заявки.