public ActionResult ReviewAssignment(ReviewAssignment model) { try { ViewBag.ID = Session["UserID"]; model.UserID = ViewBag.ID; ViewBag.ReviewID = Session["ReviewID"]; model.ReviewID = ViewBag.ReviewID; if (ModelState.IsValid || model.ReviewAssignmentID == 0) { model.CreatedBy = (int)Session["UserID"]; model.CreatedOn = DateTime.Now; model.AssignmentStatus = true; dbobj.ReviewAssignments.Add(model); dbobj.SaveChanges(); return(RedirectToAction("ReviewAssignment")); } else { ModelState.AddModelError(" ", "Invalid Data"); return(View()); } } catch { ModelState.AddModelError(" ", "Invalid Operation"); return(View()); } }
public ActionResult ReviewAssignment(int id) { try { Session["ReviewID"] = id; var user = Session["UserID"]; var UserId = (int)user; var OrgID = dbobj.tbl_Organisation.Single(x => x.UserID == UserId); ViewBag.Welcome = "Welcome, "; ViewBag.DisplayName = OrgID.Name; var review = Session["ReviewID"]; var ReviewId = (int)review; var agenda = dbobj.ReviewCreations.Single(x => x.ReviewID == ReviewId); ViewBag.Agenda = agenda.ReviewAgenda; ViewBag.ID = Session["UserID"]; ViewBag.ReviewID = Session["ReviewID"]; ViewBag.OrganizationList = dbobj.tbl_Organisation; ViewBag.Reviews = dbobj.ReviewCreations.Where(x => x.ReviewID == ReviewId).Select(x => x.ReviewID); ViewBag.EmployeeList = dbobj.Employees.Where(x => x.UserID == UserId); ViewBag.ReviewList = dbobj.Employees.Where(x => x.UserID == UserId); ReviewAssignment emp = dbobj.ReviewAssignments.Find(id); return(View("ReviewAssignment", emp)); } catch { ModelState.AddModelError(" ", "Invalid Operation"); return(View()); } }
/// <summary> /// 指派专家 /// </summary> /// <param name="applicationId"></param> /// <param name="ctx"></param> /// <param name="expertList"></param> private static List <ReviewAssignment> AddReviewAssignments(string applicationId, AspodesDB ctx, IEnumerable <string> expertList) { List <ReviewAssignment> assignments = new List <ReviewAssignment>(); foreach (var expert in expertList) { var user = ctx.Users.FirstOrDefault(u => u.UserId == expert); user.ReviewAmount += 1; ReviewAssignment assignment = new ReviewAssignment() { ApplicationId = applicationId, ExpertId = user.UserId, Accept = false, Year = SystemConfig.ApplicationStartYear, Overdue = false, Status = ReviewAssignmentStatus.NEW }; var newAssignment = ctx.ReviewAssignments.Add(assignment); assignments.Add(newAssignment); } return(assignments); }
/// <summary> /// 更换初审专家,更换拒绝的初审专家 /// </summary> /// <param name="applicationId"></param> /// <param name="oldExpertId"></param> /// <param name="newExpertId"></param> /// <param name="privilege"></param> /// <returns></returns> public GetReviewAssignmentDTO ChangeExpert(string applicationId, string oldExpertId, string newExpertId, Func <Model.Application, bool> privilege) { using (var ctx = new AspodesDB()) { var application = ctx.Applications.FirstOrDefault(a => a.ApplicationId == applicationId); if (null == application) { throw new NotFoundException("未找到申请书"); } if (!privilege(application)) { throw new UnauthorizationException("您没有权限进行操作"); } if (!(application.Status == Model.ApplicationStatus.ASSIGNMENT || application.Status == Model.ApplicationStatus.MANUAL_ASSIGNMENT || application.Status == Model.ApplicationStatus.SEND_ASSIGNMENT)) { throw new OtherException("不允许操作"); } if (oldExpertId.ToLower() != "empty") { //var oldExpert = ctx.Users.FirstOrDefault(u => u.UserId == oldExpertId); //if (UserHelper.UnnormalUser(oldExpert)) throw new NotFoundException("没有找到旧的专家"); var oldAssignment = ctx.ReviewAssignments.FirstOrDefault(ra => !ra.Overdue.Value && ra.ApplicationId == applicationId && ra.ExpertId == oldExpertId); if (oldAssignment == null) { throw new NotFoundException("没有找到旧的指派记录"); } if (!(oldAssignment.Status == ReviewAssignmentStatus.NEW || oldAssignment.Status == ReviewAssignmentStatus.CHANGE)) { throw new OtherException("专家指派的状态错误,不允许替换"); } oldAssignment.Status = ReviewAssignmentStatus.CHANGE; oldAssignment.Expert.ReviewAmount -= 1; } var newExpert = ctx.Users.FirstOrDefault(u => u.UserId == newExpertId); if (UserHelper.UnnormalUser(newExpert)) { throw new NotFoundException("没有找到新的专家"); } if (newExpert.InstituteId == application.InstituteId) { throw new OtherException("不能指派给本单位的专家"); } if (ctx.ReviewAssignments.Any(ra => !ra.Overdue.Value && ra.ApplicationId == application.ApplicationId && ra.ExpertId == newExpert.UserId)) { throw new OtherException("该专家已经是该申请书的评审人或者专家拒审"); } ReviewAssignment newAssignment = new ReviewAssignment { ApplicationId = application.ApplicationId, ExpertId = newExpert.UserId, Accept = false, Status = ReviewAssignmentStatus.NEW, Overdue = false, Year = SystemConfig.ApplicationStartYear }; var updateassignment = ctx.ReviewAssignments.Add(newAssignment); newExpert.ReviewAmount += 1; ctx.SaveChanges(); if (ctx.ReviewAssignments.Count(ra => !ra.Overdue.Value && ra.ApplicationId == applicationId && ra.Status != ReviewAssignmentStatus.CHANGE && ra.Status != ReviewAssignmentStatus.REFUSE) >= SystemConfig.ApplicationExpertAmount) { application.Status = ApplicationStatus.SEND_ASSIGNMENT; } ctx.SaveChanges(); return(Mapper.Map <GetReviewAssignmentDTO>(updateassignment)); } }
// This procedure is a tragedy, but I hope that much of it may be // removed if this controller is restructured private async Task ReviewPass(Submission sub, int mandatoryReviews) { var groupSize = sub.ForGroup?.Members.Count ?? 1; var reviewsPerSub = mandatoryReviews; if (groupSize > 1) { reviewsPerSub *= sub.AssignmentStage.Assignment.MinGroupSize; } var priors = _context.Submissions .Include(s => s.AssignmentStage) .Include(s => s.ForGroup) .ThenInclude(g => g.Members) .ThenInclude(gjt => gjt.ApplicationUser) .Include(s => s.Submitter) .Where(s => s.AssignmentStage.Id == sub.AssignmentStage.Id && s.AssignmentStage.AssignmentId == sub.AssignmentStage.AssignmentId); var reviewAssignments = _context.ReviewAssignments .Include(ra => ra.ApplicationUser) .Include(ra => ra.Submission) .ThenInclude(s => s.AssignmentStage) .Where(ra => ra.Submission.AssignmentStage.Id == sub.AssignmentStage.Id && ra.Submission.AssignmentStage.AssignmentId == sub.AssignmentStage.AssignmentId); var underReviewedPriors = priors .Where(s => !(reviewAssignments .Where(ra => ra.Submission.ID == s.ID) .Count() > reviewsPerSub)); var underReviewingSubmitters = new List <ApplicationUser>(); // The distinction between group/individual assignments must be destroyed before // it infects all the code. foreach (Submission s in priors) { if (s.ForGroup == null) { if (reviewAssignments .Where(a => a.ApplicationUser.Id == s.Submitter.Id) .Count() < mandatoryReviews) { underReviewingSubmitters.Add(s.Submitter); } } else { var firstUnderReviewer = s.ForGroup.Members .Select(t => t.ApplicationUser) .Where(u => reviewAssignments .Where(ra => ra.ApplicationUser.Id == u.Id) .Count() < mandatoryReviews) .FirstOrDefault(); if (firstUnderReviewer != null) { underReviewingSubmitters.Add(firstUnderReviewer); } } } // Assign new submitters to old submissions ApplicationUser[] needsAssignment = new ApplicationUser[groupSize]; if (sub.ForGroup == null) { needsAssignment[0] = sub.Submitter; } else { int j = 0; foreach (GroupJoinTag gjt in sub.ForGroup.Members) { await _context.Entry(gjt).Reference(t => t.ApplicationUser).LoadAsync(); needsAssignment[j] = gjt.ApplicationUser; j += 1; } } int i = 0; foreach (Submission s in underReviewedPriors.Take(groupSize)) { ReviewAssignment newRa = new ReviewAssignment { ID = Guid.NewGuid(), Complete = false, ApplicationUser = needsAssignment[i], Submission = s, TimeStamp = DateTime.Now }; await _context.AddAsync(newRa); i += 1; } // Assign old submitters to new submission foreach (ApplicationUser u in underReviewingSubmitters.Take(reviewsPerSub)) { ReviewAssignment newRa = new ReviewAssignment { ID = Guid.NewGuid(), Complete = false, ApplicationUser = u, Submission = sub, TimeStamp = DateTime.Now, }; await _context.AddAsync(newRa); } }