コード例 #1
0
        public async Task <object> Complete(int id)
        {
            var workItem = await _context.WorkItems
                           .Include(x => x.AssignedUser)
                           .Include(x => x.Report.Submission)
                           .FirstOrDefaultAsync(x => x.Id == id);

            if (workItem == null)
            {
                return(NotFound());
            }

            //TODO: Pulling too much data here
            var submission = _context.Submissions
                             .Include(f => f.FileSpecification.GenerationGroup.Users)
                             .Include(f => f.FileSpecification.ApprovalGroup.Users)
                             .Include(f => f.FileSpecification.SubmissionGroup.Users)
                             .FirstOrDefault(x => x.Id == workItem.Report.SubmissionId);

            var currentReport = submission.Reports.FirstOrDefault(x => x.Id == submission.CurrentReportId);

            Group group = submission.FileSpecification.GenerationGroup;

            switch (workItem.WorkItemAction)
            {
            case WorkItemAction.Generate:
                group = submission.FileSpecification.GenerationGroup;
                break;

            case WorkItemAction.Review:
                group = submission.FileSpecification.ApprovalGroup;
                break;

            case WorkItemAction.Approve:
                group = submission.FileSpecification.SubmissionGroup;
                break;
            }

            if (group == null)
            {
                return(BadRequest($"No group defined for next task"));
            }

            //If current workitem is a generation task, the review task should return to same user
            var assignee = workItem.AssignedUser;

            if (workItem.WorkItemAction != WorkItemAction.Generate || workItem.WorkItemAction == WorkItemAction.Submit)
            {
                assignee = _membershipService.GetAssignee(group);
            }

            if (assignee == null)
            {
                return(BadRequest($"No members in {group.Name} to assign next task"));
            }

            //TODO Move to completed work method
            if (workItem.WorkItemAction == WorkItemAction.Generate)
            {
                var result = _documentService.GenerateDocuments(currentReport);

                if (result.IsFailure)
                {
                    return(BadRequest(result.Error));
                }
            }


            var wi = submission.CompleteWork(workItem, assignee);

            if (wi.WorkItemAction == 0)
            {
                var notifiers  = _membershipService.GetGroupMembers(Constants.SubmissionNotifiers);
                var generators = _membershipService.GetGroupMembers(submission.FileSpecification.GenerationGroup.Name).ToList();
                var approvers  = _membershipService.GetGroupMembers(submission.FileSpecification.ApprovalGroup.Name).ToList();
                notifiers.AddRange(generators);
                notifiers.AddRange(approvers);

                WorkEmailer.SendCompletion(wi, submission, notifiers);
            }
            else
            {
                WorkEmailer.Send(wi, submission, null);
            }
            _context.SaveChanges();

            var dto = Mapper.Map <WorkItemViewDto>(workItem);

            return(Ok(dto));
        }