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());
            }
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
        /// <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));
            }
        }
コード例 #5
0
        // 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);
            }
        }