Модерирование заявок модератором

Последнее обновление: 31.10.2015

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


Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850